自定义创建的视图大小不会根据约束发生变化

Custom created views size is not changing based on the constraints

我已经构建了一个需要嵌入到不同位置的自定义视图。

这是我对代码所做的:

1) 创建了一个 Swift 文件和一个名为 CustomLabel.xib 的文件。 CustomLabel.swift的内容:

import UIKit

class CustomLabel: UIView {

@IBOutlet var view: UIView!
@IBOutlet weak var label: UILabel!

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    print("CustomLabel")
    Bundle.main.loadNibNamed("CustomLabel", owner: self, options: nil)


    self.addSubview(self.view)
}



}

这是 CustomLabel.xib 的样子:

我已将视图设为自由形式并设置了它的高度。我在其中添加了一个标签视图,在所有四个方面都有约束。

现在我将此视图添加到我的 Main ViewController 但将此视图的宽度设置为大于原始可重用视图。

这是结果:

黄色背景显示视图的额外宽度,黑色背景是原始视图。

如何确保可重用视图被拉伸以覆盖整个视图?

您加载 XIB 的方式创建了 两个 UIView 个对象,您可能认为它只创建了一个.

您可以使用 Debug View Hierarchy

轻松查看此内容

此处,蓝色视图是添加到 Storyboard 的视图,具有正常设置的约束(在本例中,每边 40 磅,高度 100,垂直居中)。

红色视图是您在设计 XIB 时使用的视图,它有一个黑色背景的标签,在所有四个边上都被限制为 0

您的 XIB classUIView -- 所以这是它的 自己的 视图...当您将 UIView 添加到故事板并将其 class 设置为 CustomLabel,这将成为 "root" 视图。在你的代码中,你正在 adding view 作为子视图......这应该给你线索,你现在有 two UIView 个对象。

现在发生的事情是 CustomLabel 本身(这是一个 UIView)使用您在故事板中设置的约束,但是 view 子视图 设置了约束条件。

如果您将加载代码更改为此(我更改了您的 IBOutlet 名称,因为将 "view" 作为子视图添加到另一个 "view" 会变得非常混乱):

class CustomLabel: UIView {

    @IBOutlet var theView: UIView!
    @IBOutlet weak var thelabel: UILabel!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("CustomLabel")
        Bundle.main.loadNibNamed("CustomLabel", owner: self, options: nil)

        self.addSubview(self.theView)

        self.theView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            self.theView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0.0),
            self.theView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0.0),
            self.theView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0.0),
            self.theView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0.0),
            ])

    }

}

现在,您的代码从 XIB 加载视图,将其添加为 CustomLabel 的子视图(它本身也是 UIView),并设置约束d 期待,给出这个结果:

如您所见,已添加为子视图(此图中的红色)的 theView 现在受限于其父视图 - 蓝色 CustomLabel.