iOS中类似于Android View.GONE的可见性模式是什么?

80
我正在为iOS开发一个应用程序,使用带有AutoLayout的Storyboard。其中一个视图控制器有一组4个按钮,在某些情况下,我想让第一个消失。
如果我使用setHidden:TRUE方法,UIButton将变得不可见,但在视图中仍然占据空间,结果是一个“空洞”,我无法通过使其余的UIButton浮动到主视图的顶部来填充它。
在Android中,我只需使用View.GONE而不是View.INVISIBLE,但在iOS中,我被困在了这种行为中,并且我不想相信唯一的解决方案是手动(是的,我指编程)将其余元素移动到顶部。
我认为我应该能够设置某种约束条件,使一切像Android中那样自动化,但我没有成功。
在关闭Autolayout之前,有人可以指导我正确的方向吗?
我正在使用IB,但我也熟悉编程方面的内容。
更新:
将组件高度设置为0也没有帮助。
我尝试过类似于以下内容:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;

将按钮的高度设置为零怎么样? - cahn
我尝试了类似这样的代码:UIButton * b; CGRect frameRect = b.frame; frameRect.size.height = 0; b.frame = frameRect;但是没有成功 :( - elbuild
我知道这是一个非常老的问题,但关于您的更新,将框架设置为0不会有帮助,如果您正在使用自动布局。您必须将高度约束设置为0。 - wyu
13个回答

0
借鉴Deniz提供的答案,这里提供一种使用Swift中约束的解决方案。
例如:如果您有3个视图A_view、B_view和C_view按垂直顺序对齐,并且您想要“隐藏”B并调整差异,则添加一个约束即可。
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)

常量(在这种情况下)是C_view和A_view之间垂直空间的量


0
我在自定义UIView实现中添加了一个名为“visible”的新属性,当设置为false时,会添加一个约束来折叠视图(由于我的列表是水平的,所以我只添加了宽度约束,但最好的方法可能也要添加高度约束为0)。
var visible:Bool = true{
        didSet{
            if(visible){
                clipsToBounds = false;
                removeConstraint(hideConstraint!)
            }else{
                clipsToBounds = true
                addConstraint(hideConstraint!)
            }
        }
    }

您需要在视图上初始化零宽度约束并将其添加为字段:
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)
    ...
}

-3

setHidden:TRUE/FALSE是最接近Android View.GONE/VISIBLE的等效方式。

如果不可见,View不一定占用空间!

我已经使用一个放置在其他视图上方的ListView制作了类似ComboBox的控件。只有在选择时才可见:

enter image description here


你忘记了在Android中我们也有view.invisible... view.gone不类似于setHidden...它是view.invisible与setHidden相似 - Nav

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