我有一个UIStackView
,它包含多个排列的子视图。当自动布局试图减小堆栈视图的大小时,我想动态地隐藏堆栈视图中的某些视图。我正在寻找一种方法来实现这一行为使用自动布局,而无需手动操纵帧。
我已经尝试设置子视图的isHidden
属性,但似乎不能正确更新堆栈视图的布局。这些视图仍然占用堆栈视图中的空间。
当自动布局试图减小堆栈视图的大小时,建议使用什么方法来隐藏堆栈视图中的视图?是否有任何特定的方法或技术应该用来实现这种行为?
任何指导或代码示例将不胜感激。谢谢你!
我尝试覆盖layoutSubviews
方法。
override func layoutSubviews() {
super.layoutSubviews()
for view in stackView.arrangedSubviews {
if visibilityManager.shouldBeVisible(view: view) {
if let view = view as? MyButton {
if view.intrinsicContentSize.height > view.bounds.height {
view.isHidden = true
} else {
view.isHidden = false
}
}
}
}
}
期望:堆栈视图中的视图将被隐藏
实际:视图只是被压缩
1条答案
按热度按时间ca1c2owp1#
当我们在堆栈视图的排列子视图上设置
.isHidden = true
时,该子视图仍然在.arrangedSubviews
集合中,但它从层次结构中被删除,不再具有有效的框架。另一种方法是将
.alpha
设置为1.0
或0.0
以“显示/隐藏”视图。我们创建了一个自定义视图子类--我们称之为
AutoHideSubviewsView
。它将有一个带有Top / Leading / Trailing约束的堆栈视图,但***没有Bottom约束***。当视图框改变时-变得更短或更高-我们循环通过排列的子视图并且:
.alpha = 1.0
(显示它).alpha = 0.0
(隐藏它)下面是一些快速的示例代码。。
自定义视图
示例控制器
如下所示(自定义视图的背景为红色):
点击“收缩”按钮将降低视图的高度,点击“增长”按钮将增加它。
为了使它更容易看到发生了什么,我对
.alpha
的变化进行了动画处理,这样子视图就可以“淡入淡出”。下面是一个动画(太大了,无法在这里发布):https://imgur.com/a/glRRh2O