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

标签 ios swift nslayoutconstraint

我正在以编程方式创建我的 UI,我想让我的 UITextfield topAnchor 以其包含的 UIView 的高度为基础,但是它不起作用。

我的 UITextfield 位于 UIView 内,我希望它的 topAnchorUIView 高度的 0.15因此 - containerView.frame.size.height * 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 在容器 View 的高度为 0.15 时在所有设备上看起来都相似,但我得到的是 0

最佳答案

不要混合使用 NSLayoutConstraintframe。这些框架是静态的,当您将它们用于约束中的常量 时不会更新。因此,当 Auto Layout 使用其他约束来更新 containerView 的高度时,查看 containerView 框架高度的约束将基于创建约束时 containerView 的高度(可能是 0),而不是 Auto Layout 使用约束来建立containerView的高度。

相反,您想将 userTextFieldtop 放在 containerViewbottom 上,并使用 乘数。不幸的是,你不能用布局 anchor 来做到这一点,你必须使用 NSLayoutContraint 来创建它:

替换:

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

与:

NSLayoutConstraint(item: userTextField, attribute: .top, relatedBy: .equal,
    toItem: containerView, attribute: .bottom, multiplier: 0.15, constant: 0)

关于ios - 布局约束不适用于 view.frame.size.height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56020632/

相关文章:

ios - 将自动布局约束常量 X 动画化到父 View 的中心

ios - Objective-C 函数参数和静态变量同名

objective-c - ARC 是否与 Core Graphics 对象一起使用?

javascript - Phonegap 事件恢复

ios - iPhone 自定义键盘无法在运行 iOS 8 的物理设备上加载

swift - 无法插入到 sqlite3 swift 中的 sqlite_sequence 表中

IOS NSString 获取 '#"之前的字符

swift - 有没有办法让文本字段快速只接受字母和空格

ios - 顶部和底部布局指南的自动布局问题

ios - 为什么 Storyboard约束会自动更改?