如何在运行时知道 UIComponent 的宽度?
Posted
技术标签:
【中文标题】如何在运行时知道 UIComponent 的宽度?【英文标题】:How to know a UIComponent width at runtime? 【发布时间】:2017-05-25 06:29:06 【问题描述】:我有一个 UIComponent,它是一个简单的视图(我缩小了问题范围)。 这是 xib 和类:
然后我把这个组件放在故事板的一个视图中,设置它的约束:
所以通常红色矩形根据设备宽度有不同的宽度值。
在图形上就是这种情况,组件可以正确调整自身大小,但是当我调用函数来打印其宽度时,无论启动应用程序的设备是什么,结果总是相同的。
实际上,该值始终是组件在情节提要中的实际宽度。
这太奇怪了。 有没有办法知道 UIComponent 的实际宽度?
非常感谢您的帮助:)
【问题讨论】:
约束是如何配置的? @Eric - 它为print(self.frame.width)
打印的值是多少?它是显示任何值,还是返回零?您究竟是如何为StatBarView
设置NSLayoutConstraint
值的?您是否将它们设置为相对或等于其父视图的宽度,或者左右两侧是否限制在其父视图的左右边缘?
StatBarView 有高度修正,垂直居中,左右两侧限制为超级视图。打印的值是storyboard的StatBarView宽度,与运行时的宽度不对应。例如,如果我在 storyboard 中设置 iPhone SE,宽度为 239 像素,即使在 iPhone 7 plus 上执行时也会使用此值。
【参考方案1】:
您应该在设置约束之后但在尝试获取其宽度之前在您的视图上使用 layoutIfNeeded()。约束不会在激活时立即应用
(抱歉 2 个答案 ^^ 他们太不一样了)
【讨论】:
【参考方案2】:最好不要同时使用约束和框架进行标记。坚持约束并对每个元素的宽度进行新的约束。每个元素的宽度应该通过乘数与父视图的宽度相关。
例如你应该做这样的事情
NSLayoutConstraint(item: element, attribute: .width, relatedBy: .equal, toItem: parentView, attribute: .width, multiplier: 0.5, constant: 0)
让一个元素占据其 parentView 宽度的 50%
如果你想改变它,你应该用一个新的约束替换旧的约束,当然还有新的期望乘数。存在这种带有替换的洗牌,因为乘数属性只是获取
顺便说一句,如果您想更改组件内每个元素所占宽度的百分比,我的回答是针对这种情况。如果比例始终相同(50% 25% 25%),则如果组件更改其大小,则无需更改约束。所有与组件大小约束相关的元素也会改变它们的大小(如果你通过约束改变组件的大小)
【讨论】:
感谢您的帮助@Pavel。试图在我的变量的设置器中实现这一行,但它因“未准备好约束的视图层次结构”而崩溃。无论如何,当我设置百分比值时,子视图会调整大小,但它是用不正确的父宽度计算的。那是我的问题。我不明白为什么self.frame.width
在运行时没有获取值,而是从情节提要中获取值(此外,我没有将其设置为约束!)以上是关于如何在运行时知道 UIComponent 的宽度?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作 UIComponent 的精确副本? (iPad)