我创建了一个名为' TestButton'的UIControl的子类。带有标签和imageview子视图。该对象是使用框架创建的,作为init进程的一部分,我创建了子视图元素。
这些' TestButtons'以编程方式创建,我从不在StoryBoard中使用它们。
代码段:
class TestButton: UIControl {
var iconImageView: UIImageView?
var labelView: UILabel?
required init(size: CGSize, icon: UIImage? text: String?) {
super.init(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height) )
if ( (icon != nil) && (text != nil) ) {
self.iconImageView = UIImageView()
self.iconImageView?.translatesAutoresizingMaskIntoConstraints = false
self.iconImageView?.contentMode = .center
self.iconImageView?.image = icon
self.iconImageView?.backgroundColor = UIColor.yellow // test: show bounds
self.labelView = UILabel()
self.labelView?.translatesAutoresizingMaskIntoConstraints = false
self.labelView?.text = "Test"
self.labelView?.backgroundColor = UIColor.blue
self.addSubview(self.iconImageView!)
//self.addSubview(self.labelView!)
// Setup constraints on created subview(s)
self.iconImageView?.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
self.iconImageView?.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
self.iconImageView?.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
self.iconImageView?.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}
}
override func layoutSubviews() {
super.layoutSubviews()
print("iconframe: \(self.iconImageView!.frame)")
}
在上面的示例中,我已从混合物中删除了标签。我只是试图让imageView约束工作并有效地将imageView调整到视图。这不起作用,图像显示为完整大小,并且约束似乎已被忽略。我已经尝试将约束代码移动到updateConstraints并调用它 - 所有似乎都可以工作但是不再应用约束。
layoutSubviews会在您预期的情况下调用,但imageView框架未经修改。输出窗口中没有消息,它只是默默无效。
我的问题是;我通过指定父框架以某种方式禁用了autoLayout吗?我原本期望autoLayout仍然可以在父框架的范围内工作吗?
很抱歉,如果之前已经回复了一次或多次。我实际上并不确定我要搜索的是什么,也不确定要问的正确问题,只有在拖网搜索一天之后才会发布。感谢
答案 0 :(得分:0)
TestButton视图的行为将取决于它在超级视图中的约束方式。
在NSLayoutConstraint
中,两个参与属性(或锚点)是相同的"合作伙伴":只有这四个约束, imageView将采用它的完整框架父(TestButton),但同时 TestButton将扩展为足以支持全尺寸图像。
您可以将其他约束应用于TestButton视图以防止后者。
要了解标准视图的行为,请查看intrinsicContentSize
属性(docs)。它由标准控件实现,并告诉自动布局系统视图应该有多大,纯粹基于它的内容(例如,UIButton或UISwitch是自动调整的大小)。 UIImageView的intrinsicContentSize
是其图像的大小,这就是为什么它会扩展全尺寸,如果没有任何东西阻止它。