根据大小类的 UIStackView 属性
Posted
技术标签:
【中文标题】根据大小类的 UIStackView 属性【英文标题】:UIStackView properties according to size classes 【发布时间】:2015-06-15 17:34:36 【问题描述】:我尝试在情节提要中测试 UIStackView,在其中我根据 iPhone 的方向(wAny/hC、wC/hR)更改属性“Axis”。
不幸的是,在运行时,没有应用更改。 具体来说,属性“Axis”被修改(在Xcode中检查),但布局不会改变。
提前感谢您的帮助。
【问题讨论】:
这可能会增加一点帮助 ***.com/questions/30779724/… 谢谢,这似乎是一个错误:forums.developer.apple.com/thread/5263?q=uista 是的,我也遇到了这个问题(以上是我的帖子:)),并且由另一个提出 rdar 的论坛成员确认。虽然我找不到他提出的错误...我还注意到手动更改特征集合回调中的axis
也不起作用...请注意,在 iPad 上使用拆分视图时这很好!
丰富,如果将特征集合回调中的轴分派到主队列,则可以更改轴:dispatch_async(dispatch_get_main_queue()) ...
【参考方案1】:
这绝对是一个错误。轴在运行时(模拟器或设备)的行为,经过仔细检查后,仅针对视图层次结构中的每个 other UIStackView 发生变化。
我没有尝试所有可能的排列,但这是我发现的,因为只有在我想引入多个具有这种所需的轴更改行为的堆栈视图时才会出现此问题。可能存在单个堆栈视图不遵守大小类规则的情况,但我没有可靠地复制它。
查看我的ios 9.1 project,它清楚地展示了垂直排列的 8 个 UIStackView 元素的这个问题。除了相对于彼此和屏幕顶部的位置受到限制之外,它们的配置都完全相同相同。
正如您从情节提要预览中看到的那样,在横向中,事情看起来与我们想要和期望的一样:
在模拟器或设备上运行时,情况就不同了。在尝试了许多堆栈视图之后,很明显该错误会影响视图层次结构中的每个其他堆栈视图。
尽管在上面的 cmets 中提到了另一个,但我已经通过这个示例项目提出了我自己的单独 RDAR。我找不到它的公开记录。
显然,有一个基于代码的解决方法是痛苦的,并且完全违背了自动布局、约束和大小类的目的。这对我来说是一个非常大的错误,因为它消除了堆栈视图和大小类的一个非常重要的用例。
根据 EinharchAltPlus 在 Apple 开发者论坛中的 post 的代码解决方法:
顺便说一句:重写 viewWillTransitionToSize 并手动设置不同的参数可以解决问题,但这很烦人,因为我们还需要在代码中检查视图,这应该是纯粹与设计相关的。
如果不完全清楚,您需要有一个 IBOutlet 对非协作堆栈视图的引用,也许还有它在您的视图控制器代码中填充的视图。您可以更改堆栈视图的轴属性,理想情况下,它包含在其中的高度:
@IBOutlet weak var viewHackStack: UIView!
@IBOutlet weak var hackStackView: UIStackView!
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
if(self.traitCollection.verticalSizeClass == .Compact)
self.viewHackStack.frame.size.height = 25
self.hackStackView.axis = .Horizontal
else if(self.traitCollection.verticalSizeClass == .Regular)
self.viewHackStack.frame.size.height = 50
self.hackStackView.axis = .Vertical
如果您想更具体地确定决定行为变化的大小类,只需使用 trait 集合大小类类型,直到满足您想要的条件。
如果我在错误修复时间表上听到任何消息,我会在此处发布。在此之前,我希望这有助于解决问题。
【讨论】:
以上是关于根据大小类的 UIStackView 属性的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UIStackView 不堆叠 UILabel 安排的子视图?