以编程方式从超级视图中删除 UIView(自动布局)

Posted

技术标签:

【中文标题】以编程方式从超级视图中删除 UIView(自动布局)【英文标题】:Remove UIView from superview programmatically (autolayout) 【发布时间】:2014-05-31 14:55:19 【问题描述】:

我有一个UIViewController,其中包含主要的UIView,其中顶部是一个小的UIView,其余的空间是一个UITableView

所有的设计都是用Storyboards和autolayout完成的,所以上面UIView基本上有这些限制:

顶部空间 = 0px 到超级视图 前导空间 = 0px 到超级视图 尾随空格 = 0 px 超级视图 高度 = 44 像素

这些为UITableView

顶部空间 = 0px 到 UIView 底部空间 = 0px 到超级视图 前导空间 = 0px 到超级视图 尾随空格 = 0 px 超级视图

当使用不同的屏幕尺寸或方向时,一切正常并正确调整大小。我现在要做的是以编程方式删除顶部UIView,然后我希望UITableView 将空间填充到超级视图的顶部。

我知道我可以以编程方式为UITableView 创建一个新约束,但我正在寻找的是低优先级约束?已在 Storyboard 中定义,可以与之前已定义的内容共存。

任何其他技巧或解决方法也将不胜感激,唯一的限制是一切都应该在情节提要中设计,并且一切都应该在调用后工作:

[view removeFromSuperview];

这是设计:

【问题讨论】:

顶视图一定要去掉吗?如果不是,您可以将顶视图的高度更改为 0(零)的动画,或者您可以将顶视图的顶部约束常数从 0 更改为 -44 的动画,这将使视图从屏幕顶部滑出。在任何一种情况下,表格视图都应该占用“额外”空间,并且会以动画方式启动! 【参考方案1】:

从超级视图中删除顶视图后,只需更新 tableview 的框架以填充整个窗口

【讨论】:

【参考方案2】:

您只需要添加另一个顶部约束,一个到顶部布局指南,然后将其编辑为优先级为 900,常量值为 0。如果您已经有顶部视图,您将必须从下视图拖动到左侧列表中的主视图,因为您将无法访问画布中的主视图。

【讨论】:

【参考方案3】:

这很简单,因为您已经对顶部 UIView 进行了高度约束,并在顶部视图和表格视图之间进行了垂直空间约束。

在各自的实现 (.m) 类中创建高度约束的实例。

@property(强,非原子)IBOutlet NSLayoutConstraint *topViewHeightConstraint

然后当你不想要顶视图时,写 topViewHeightConstraint.constant = 0.f

由于您已经在顶视图和表格视图之间进行了垂直空间限制,因此表格视图将占据超级视图的整个空间。

当您再次想要顶视图时,只需设置约束值。

【讨论】:

以上是关于以编程方式从超级视图中删除 UIView(自动布局)的主要内容,如果未能解决你的问题,请参考以下文章

UIView addSubview 自动布局不起作用

使用自动布局的屏幕外 UIView(以编程方式)

iOS 从超级视图中删除对象会破坏自动布局并禁用滚动视图

以编程方式在子类 UIView 的子视图上自动布局

UIView 调整内容大小

如何以编程方式使用自动布局以编程方式添加 UIview?