布局约束不适用于view.frame.size.height

时间:2019-05-07 10:32:23

标签: ios swift nslayoutconstraint

我正在以编程方式创建UI,并且希望根据其包含的UITextfield的高度使topAnchor UIView起作用,但是它无法正常工作。

我的UITextfieldUIView内部,我希望它的topAnchorUIView的高度-containerView.frame.size.height * 0.15的0.15一样,但似乎价值没有增加。所有这些操作都在UIView子类中完成,并在ViewController

中调用
        let containerView: UIView
        containerView.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(containerView)

        NSLayoutConstraint.activate([
            containerView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
            containerView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.9),
            containerView.topAnchor.constraint(equalTo: stepTitleLabel.bottomAnchor, constant: 50),
            containerView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.65)
            ])


        let userTextField: UITextField
        userTextField?.tag = 1
        userTextField?.translatesAutoresizingMaskIntoConstraints = false
        containerView.addSubview(userTextField)

        userTextField.setNeedsLayout()
        print("containerView.frame.size.height * 0.15:\(containerView.frame.size.height * 0.15)")
        NSLayoutConstraint.activate([
            (userTextField.centerXAnchor.constraint(equalTo: containerView.centerXAnchor))!,
            (userTextField.widthAnchor.constraint(equalTo: containerView.widthAnchor, multiplier: 0.8))!,
            userTextField.topAnchor.constraint(equalTo: containerView.topAnchor, constant: containerView.frame.size.height * 0.15),
            userTextField.heightAnchor.constraint(equalToConstant: 40)
            ])

我希望UITextField的topAnchor在容器视图高度0.15处的所有设备上都显示类似,但我得到的是0

2 个答案:

答案 0 :(得分:1)

请勿混用NSLayoutConstraintframe。这些帧是 static ,当您将它们用于约束中的constant时不会更新。因此,当 Auto Layout 使用其他约束来更新containerView的高度时,您看着containerView的框高的约束将基于{{ 1}}在创建约束时(很可能是containerView),而不是在“自动布局” 时使用约束来确定0的高度。

相反,您想将containerView的{​​{1}}与top的{​​{1}}一起使用userTextField。不幸的是,您不能使用布局锚来做到这一点,而必须使用bottom来创建它:

替换:

containerView

具有:

multiplier

答案 1 :(得分:0)

您需要使用self而不是container进行设置,因为尚未计算容器的高度

userTextField.topAnchor.constraint(equalTo: containerView.topAnchor,  
     constant: self.frame.size.height * 0.15 * 0.65 )

鉴于容器的高度= 0.65 *距此处的距离

self.heightAnchor, multiplier: 0.65