iOS相当于View.GONE

时间:2014-09-02 15:27:01

标签: android ios uiviewcontroller autolayout hidden

是否有与Android View.GONE等效的iOS?

在Android中,将视图设置为GONE会使其不可见,并确保视图不会占用布局中的任何空间。我知道在iOS中,您可以使用

设置隐藏视图
[viewName setHidden:true];

但是视图仍然占用了布局中的空间,我认为完全删除视图并在以后重新创建它是没有效率的。

(注意:我已经看过这篇帖子:iOS equivalent for Android View.GONE visibility mode但是没有接受的答案,将高度设置为0对我来说不起作用,因为页面上的后续观点没有改变我的观点被删除了)

4 个答案:

答案 0 :(得分:7)

使用constant = 0添加宽度/高度约束到your View会使your View的宽度和高度= 0(就像它GONE

// set the height constraint to 0 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
                                                                   attribute:NSLayoutAttributeHeight
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:nil
                                                                   attribute:NSLayoutAttributeNotAnAttribute
                                                                  multiplier:1.0
                                                                    constant:0]];

// set the width constraint to 0            
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
                                                               attribute:NSLayoutAttributeWidth
                                                               relatedBy:NSLayoutRelationEqual
                                                                  toItem:nil
                                                               attribute:NSLayoutAttributeNotAnAttribute
                                                              multiplier:1.0
                                                                constant:0]];

在Swift中

// set the width constraint to 0
let widthConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
view.addConstraint(widthConstraint)

// set the height constraint to 0        
let heightConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
    view.addConstraint(heightConstraint)

或者这个UIView扩展

extension UIView {        

    func goAway() {
        // set the width constraint to 0
        let widthConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
        superview!.addConstraint(widthConstraint)

        // set the height constraint to 0
        let heightConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
        superview!.addConstraint(heightConstraint)
    }

}

希望这个帮助

答案 1 :(得分:4)

只有可能的等效物可以是AFAIK:

[yourView removeFromSuperview]

在您从view superview移除ios之前,它将占用布局空间。

因此,根据您的需要,您可以在需要时添加或删除视图(与android中的view.GONE相同)。

答案 2 :(得分:2)

我目前正在使用Swift在Android和iOS之间进行转换,这是我的第一个问题。在互联网上搜索后,我发现有些人通过将UIView的高度或宽度设置为0可以获得良好的效果,具体取决于您是希望视图是垂直还是水平消失。为了在我的应用程序中实现这个想法,我定义了两个函数,如:

enum Direction {
    case HORIZONTAL, VERTICAL
}

func removeView(view: UIView, direction: Direction) {
    // Removing the view vertically
    if direction == .VERTICAL {
        let constraint = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Height,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
        view.addConstraint(constraint)
    } else { // Removing the view horizontally
        let constraint = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Width,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
        view.addConstraint(constraint)
    }
}

// Removing the view both horizontally and vertically
func removeView(view: UIView) {
    let constraintH = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Height,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
    let constraintW = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Width,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
    view.addConstraint(constraintH)
    view.addConstraint(constraintW)
}

它似乎适用于模拟器。希望这会有所帮助。

答案 3 :(得分:1)

对我来说最干净的解决方案是将您想要的组件嵌入"移动"在StackView(iOS 9.0 +)中,通过在所需视图上调用UIView.isHidden = true,您可以实现View.GONE效果,因为StackView包含了内容。