iOS中类似于View.GONE的效果

8

有没有iOS中相当于Android View.GONE的功能?

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

[viewName setHidden:true];

但是该视图仍然占据布局中的空间,我认为完全删除视图并在以后重新创建它是低效的。
(注:我看过这篇帖子:iOS中与Android View.GONE可见性模式相等的方法,但没有被接受的答案,并且将高度设置为0对我没有起作用,因为删除我的视图后页面上的后续视图未移动)。

那篇帖子或许能给你一些启示。链接在此 - TeachMeJava
4个回答

7
将宽度/高度约束添加到您的视图,并将constant设置为0,将使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
非常好的答案!!!顺便说一下,“theGoneView”是要隐藏的视图的名称。 - Fay007
@Phan Van Linh 我使用了相同的代码,但它不起作用... https://dev59.com/HqPia4cB1Zd3GeqP6vqP - Sanjay Mangaroliya
如果我想让视图可见,我该怎么做? - Arigarasuthan

4

据我所知,唯一可能的等效词是AFAIK:

[yourView removeFromSuperview]

在iOS中,只有在从其superview中移除view后,它才会在布局中释放空间。

所以根据您的需要,在必要时添加或删除视图(与Android的view.GONE相同)。


谢谢您的回复。我尝试添加了这个,但好像被移除的视图下面的视图没有向上移动。这是我需要包含的其他内容吗? - scientiffic
好的,要将视图向上移动,您可以手动移动它们,或者尝试使用“自动布局”功能。一旦您删除了视图,就将其下方的“视图”位置向上移动,等于已删除视图的高度。请查看此链接以移动视图:“https://dev59.com/-G435IYBdhLWcg3w4UMc”。 - uniruddh

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)
}

看起来在模拟器上运行正常。希望这能帮到你。


2

对我来说最简洁的解决方案是将你想要“移动”的组件嵌入到一个UIStackView(iOS 9.0+)中,然后通过在所需的UIView上设置UIView.isHidden = true,您就可以实现完全等同于View.GONE效果,因为UIStackView包装内容并自动响应其子视图大小的变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接