我正在以编程方式创建UI,并且希望根据其包含的UITextfield
的高度使topAnchor
UIView
起作用,但是它无法正常工作。
我的UITextfield
在UIView
内部,我希望它的topAnchor
像UIView
的高度-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
答案 0 :(得分:1)
请勿混用NSLayoutConstraint
和frame
。这些帧是 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