如何在运行时知道 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 的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flex 中向 UIComponent 添加滚动条

如何访问支持 UIComponent 中的复合组件属性值?

如何制作 UIComponent 的精确副本? (iPad)

ActionScript 3 如何将重点放在UIComponent上

如何在运行时获取设备高度和宽度?

如何知道设备中 imageView 的实际大小?