以编程方式创建的UIControl中的AutoLayout似乎不起作用

时间:2017-02-01 15:25:21

标签: ios swift autolayout uikit

我创建了一个名为' 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仍然可以在父框架的范围内工作吗?

很抱歉,如果之前已经回复了一次或多次。我实际上并不确定我要搜索的是什么,也不确定要问的正确问题,只有在拖网搜索一天之后才会发布。感谢

1 个答案:

答案 0 :(得分:0)

TestButton视图的行为将取决于它在超级视图中的约束方式。

NSLayoutConstraint中,两个参与属性(或锚点)是相同的"合作伙伴":只有这四个约束, imageView将采用它的完整框架父(TestButton),但同时 TestButton将扩展为足以支持全尺寸图像
您可以将其他约束应用于TestButton视图以防止后者。

要了解标准视图的行为,请查看intrinsicContentSize属性(docs)。它由标准控件实现,并告诉自动布局系统视图应该有多大,纯粹基于它的内容(例如,UIButton或UISwitch是自动调整的大小)。 UIImageView的intrinsicContentSize是其图像的大小,这就是为什么它会扩展全尺寸,如果没有任何东西阻止它。