iOS equivalent for Android View.GONE visibility mode

前端 未结 13 746
臣服心动
臣服心动 2020-12-12 19:22

I\'m developing an app for iOS and I\'m using the Storyboard with AutoLayout ON. One of my view controllers has a set of 4 buttons, and in certain circumstances i would like

相关标签:
13条回答
  • 2020-12-12 20:00

    Building off the answer provided by Deniz, here is a solution using constraints in Swift

    For example: If you have 3 views, A_view B_view and C_view vertically aligned in that order and you want to "Hide" B and also adjust the difference, add a constraint

    B_view.removeFromSuperView()
    var constr = NSLayoutConstraint(item: C_view, 
                                    attribute: NSLayoutAttribute.Top, 
                                    relatedBy: NSLayoutRelation.Equal, 
                                    toItem: A_view, 
                                    attribute: NSLayoutAttribute.Bottom,
                                    multiplier: 1,
                                    constant: 20)
    view.addConstraint(constr)
    

    constant is (in this case) the amount of vertical space between C_view and A_view

    0 讨论(0)
  • 2020-12-12 20:09

    1) If your buttons are placed vertically then you must set the height to 0 and in case of horizontally placed buttons, try setting width to 0 or you can set both to 0.

    OR

    2) you could try this approach which sets button2 on top of button1:

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button1 setTitle:@"hello" forState:UIControlStateNormal];
    
    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button2 setTitle:@"world" forState:UIControlStateNormal];
    
    [button1 sizeToFit]; [button2 sizeToFit];
    [button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)];
    
    [self.view addSubview:button1];
    [self.view addSubview:button2];
    
    }
    
    0 讨论(0)
  • 2020-12-12 20:10

    add a height constraint to your view as follows:

    then make an outlet for the height constraint in your viewController file as follows:

    & then in your viewDidLoad method change constraint height to 0 as follows:

    override func viewDidLoad() {
        super.viewDidLoad()
    nsLcButtonHeight.constant = 0
    }
    
    0 讨论(0)
  • 2020-12-12 20:10

    I added a new property to a custom UIView implementation called "visible" which, when set to false, adds a constraint to collapse the view (I only added a width constraint since my list is horizontal, but the best way might be to add a height constraint of 0 as well).

    var visible:Bool = true{
            didSet{
                if(visible){
                    clipsToBounds = false;
                    removeConstraint(hideConstraint!)
                }else{
                    clipsToBounds = true
                    addConstraint(hideConstraint!)
                }
            }
        }
    

    You need to initialize the zero-width constraint on the view and add it as a field:

    private var hideConstraint:NSLayoutConstraint?
    
    
    func someInitFunction(){
        hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
        ...
    }
    
    0 讨论(0)
  • 2020-12-12 20:15

    As my research has shown, not even AutoLayout can help you. You have to manually replace the views affected by the optionally shown component (in my case, all the views to the bottom of the optional view, but you I am sure you can adapt this to handle all the buttons to the right of your optional button):

    - (IBAction)toggleOptionalView:(id)sender {
        if (!_expanded) {
            self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight);
            self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
            _expanded = YES;
        } else {
            self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0);
            self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
            _expanded = NO;
    
        }
    }
    

    It is advisable not to hard-code the height/width of the optional components, otherwise your code breaks every time you edit the XIB/Storyboard. I have a field float _optionalHeight which I set in viewDidLoad, so it is always up to date.

    0 讨论(0)
  • 2020-12-12 20:16

    To achieve Androids.GONE functionality on iOS is to use a UIStackView. After that hide the child by position. (Apples documentation)

    SWIFT 4:

    let firstView = cell.rootStackView.arrangedSubviews[0]
        firstView.isHidden = true // first view gone
    

    It's a table cell example, just put both insides Stack view and get item for GONE the child.

    0 讨论(0)
提交回复
热议问题