【发布时间】:2018-12-19 21:23:46
【问题描述】:
我在 XIB 上有一个 UIView,其中包含一个 UIImageView 和一个 UILabel,两者之间有一个小空格。水平布局是一个简单的链式|--image--label--|,其中-- 是一些固定空间。高度固定为 40,此视图在其视图控制器中水平居中,并且具有>= 100 宽度约束。
如果我更改标签文本,我的组合视图的宽度会按照预期宽度更新其标签的更改宽度,并且它很好地保持在视图控制器的中心。
因为我需要这个包含图像和标签的UIView,在其他地方,我创建了一个由 XIB 和 Swift 文件组成的自定义类。我们就叫它ItemView吧。
我遇到的问题是视图控制器 XIB 上的空 UIView(我已将其更改为 ItemView)不再接受 >= 40 宽度约束。这当然是因为视图控制器 XIB 不再看到变量宽度 UILabel,而只是一个普通的 UIView 类 ItemView。我收到“不等式约束歧义”IB 错误。
结果是我的自定义视图的宽度仍然是 40。如果我指定更大的 >= 标签宽度,它会起作用一点;文本仅在达到此宽度时才会被切断。但在第二种情况下,我的自定义视图不再水平居中,而是向左移动了一点。
我该如何解决这个问题?或者,我如何告诉 IB 以与 UILabel 类似的方式对待我的自定义 ItemView?
在我的ItemView 中,我已尽我所能:
override class var requiresConstraintBasedLayout: Bool
{
return true
}
设置标签文字后调用setNeedsLayout()。
致电myLabel.translatesAutoresizingMaskIntoConstraints = false。
致电self.translatesAutoresizingMaskIntoConstraints = false。
并在两个init()s 中调用self.setNeedsUpdateConstraints()。
【问题讨论】:
-
为什么不关闭这个视图的警告呢?您可以简单地告诉 IB 不要检查此视图的自动布局有效性。
-
您是否尝试将自定义 XIB 用作
@IBDesignable,而此时您会收到错误/警告? -
@DonMag 这是一个 IB 布局错误。我没有指定
@IBDesignable。
标签: ios uiview autolayout