如何在运行时知道UIComponent的宽度?

如何在运行时知道UIComponent的宽度?

问题描述:

我有在UIComponent是一个简单的视图(I收窄问题)。 这里是XIB和类:如何在运行时知道UIComponent的宽度?

enter image description here

然后我把这个组件在故事板的图,将其约束:

enter image description here

所以通常红色矩形具有不同宽度取决于设备宽度。

这是图形化的情况下,该组件正确地调整自身大小,但是当我调用该函数打印宽度,结果总是一样的,无论设备启动应用程序。

实际上,该值一直在故事板的部件的实际宽度。

这是太奇怪了。 有没有办法知道UIComponent的实际宽度?

帮助将不胜感激:)

+0

约束如何配置? – Scriptable

+0

@Eric - 什么是它打印出来'打印(self.frame.width)'的价值?它显示任何价值,或返回零?你是如何为StatBarView设置'NSLayoutConstraint'值的?你有没有设置它们的宽度是相对的还是等于它的超视图,还是左右两侧限制在它的超视图的左右边缘? – Pierce

+0

StatBarView具有高度修正,垂直居中,左右两侧限制为超视图。打印的值是故事板的StatBarView宽度,它不与运行时的宽度相对应。例如,如果我在故事板中设置iPhone SE,则宽度为239像素,即使在iPhone 7 plus上执行时也会使用此值。 – Eric

在设置约束之后但在尝试获取其宽度之前,应在视图上使用layoutIfNeeded()。约束不适用于激活时

(抱歉,2个答案^^他们太不同了)

+0

谢谢,它可以工作,你摇滚! ! – Eric

最好不要同时使用两个约束和框架标记。坚持约束,并为每个元素的宽度制定一个新约束。每个元素的宽度应通过乘数与父视图的宽度相关。

举例来说,你应该做这样的事情

NSLayoutConstraint(item: element, attribute: .width, relatedBy: .equal, toItem: parentView, attribute: .width, multiplier: 0.5, constant: 0) 

作出元素占据其parentView宽度

随后的50%,如果你想改变它,你应该有一个新的代替旧的约束一个新的期望倍数当然。这种具有替代洗牌的存在是因为乘数属性是只得到

顺便说一句,如果你想改变你的组件中的每一个元素占据的宽度的百分比我的答案是对的情况。如果提议始终保持相同(50%25%25%),则在组件更改其大小时无需更改约束。与组件尺寸约束相关的所有元素也将更改它们的尺寸(如果通过约束更改组件的尺寸)

+0

感谢您的帮助@Pavel。试图在我的变量的setter中实现这一行,但它崩溃与“未准备好约束的视图层次”。无论如何,当我设置百分比值时,子视图会重新调整大小,但是它是用父宽度来计算的,这是不正确的。这是我的问题。我不明白为什么'self.frame.width'在运行时没有得到值,但是从故事板获得了值(此外我没有设置约束!) – Eric