3 回答
TA贡献1852条经验 获得超1个赞
有可能,但是您需要做一些额外的工作。首先要解决一些概念上的问题:
隐藏的视图(即使不绘制)仍会参与自动版式,并且通常会保留其框架,并将其他相关视图保留在其位置。
从其超级视图中删除视图时,所有相关约束也将从该视图层次结构中删除。
就您而言,这可能意味着:
如果将左视图设置为隐藏,则标签将保留在原处,因为该左视图仍会占用空间(即使它不可见)。
如果删除左视图,则标签可能会受到含糊的约束,因为标签的左边缘不再受约束。
您需要明智地过度约束标签。单独保留现有约束(到另一个视图的空间为10pts),但添加另一个约束:以不需要的优先级使标签的左边缘距其超级视图的左边缘10pts(默认的高优先级可能会很好地工作)。
然后,当您希望它们向左移动时,请完全删除左视图。左侧视图的强制性10pt约束将与它所关联的视图一起消失,而您将只剩下一个高优先级约束,即标签距离其父视图至少10pts。在下一次布局传递时,这将导致它们向左扩展,直到它们填满超级视图的宽度为止,但要保持您在边缘周围的间距。
一个重要的警告:如果您想让左视图重新出现在图片中,不仅需要将其重新添加到视图层次结构中,而且还必须同时重新建立其所有约束。这意味着您需要一种在视图再次显示时将其视图之间的10pt间距约束放回视图的方法。
TA贡献1810条经验 获得超4个赞
在运行时添加或删除约束是一项重量级的操作,可能会影响性能。但是,有一个更简单的选择。
对于要隐藏的视图,设置宽度约束。将其他视图限制在该视图的前导水平间隙处。
要隐藏,.constant
请将宽度约束的设置为0.f。其他视图将自动向左移动到指定位置。
TA贡献1765条经验 获得超5个赞
对于仅支持iOS 8+的用户,有一个新的布尔属性active。这将有助于动态地仅启用所需的约束
PS约束出口必须强而不是弱
示例:
@IBOutlet weak var optionalView: UIView!
@IBOutlet var viewIsVisibleConstraint: NSLayoutConstraint!
@IBOutlet var viewIsHiddenConstraint: NSLayoutConstraint!
func showView() {
optionalView.isHidden = false
viewIsVisibleConstraint.isActive = true
viewIsHiddenConstraint.isActive = false
}
func hideView() {
optionalView.isHidden = true
viewIsVisibleConstraint.isActive = false
viewIsHiddenConstraint.isActive = true
}
另外,要修复情节提要中的错误,您需要取消Installed选中这些约束之一的复选框。
UIStackView (iOS 9+)的
另一个选择是将视图包装在中UIStackView。隐藏视图后,UIStackView将自动更新布局
- 3 回答
- 0 关注
- 714 浏览
添加回答
举报