自定义创建的视图大小不会根据约束发生变化
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 class 是 UIView
-- 所以这是它的 自己的 视图...当您将 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
.
我已经构建了一个需要嵌入到不同位置的自定义视图。
这是我对代码所做的:
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 class 是 UIView
-- 所以这是它的 自己的 视图...当您将 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
.