【问题标题】:NSLayout Constraint not working on Custom ViewNSLayoutConstraint 不适用于自定义视图
【发布时间】:2021-07-07 12:54:27
【问题描述】:

我正在快速创建一个自定义 UIView,这是自定义 View 的代码,

class FormField: UIView {
    
    @IBOutlet var viewLabel : UILabel!
    @IBOutlet var textField: UITextField!
    @IBOutlet var separator: UIView!
    
    private var verticallyCenteredAnchor : NSLayoutConstraint!
    private var topPositionedAnchor : NSLayoutConstraint!
    private var isViewHighlighted = false
    private var view: UIView?
    
    let nibName = "FormField"

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    override class var requiresConstraintBasedLayout: Bool {
        return true
    }
    
    func commonInit() {
        guard let view = loadViewFromNib() else { return }
        self.view = view
        view.frame = self.bounds
        self.addSubview(view)
        
        
        verticallyCenteredAnchor =  viewLabel.centerYAnchor.constraint(equalTo: self.view!.centerYAnchor)
        verticallyCenteredAnchor.isActive = false
        topPositionedAnchor = viewLabel.topAnchor.constraint(equalTo: self.view!.topAnchor,constant: 0)
        topPositionedAnchor.isActive = true
        
        let userNameTap = UITapGestureRecognizer(target: self, action: #selector(animateLabel))
        userNameTap.numberOfTapsRequired = 1
        view.addGestureRecognizer(userNameTap)
    }
    
    @objc func animateLabel() {
        if(self.isViewHighlighted) {
            verticallyCenteredAnchor.isActive = true
            topPositionedAnchor.isActive = false
        } else {
            verticallyCenteredAnchor.isActive = false
            topPositionedAnchor.isActive = true

        }
        self.isViewHighlighted = !self.isViewHighlighted
        UIView.animate(withDuration: 0.5) {
            self.view!.layoutIfNeeded()
        }
    }
    
    func loadViewFromNib() -> UIView? {
        let nib = UINib(nibName: nibName, bundle: nil)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
        }
}

我正在为视图使用 xib 文件,并在其中设置了约束。现在,当有人点击视图时,我正在尝试用动画更改约束。但这不起作用,当用户点击视图时不会发生布局更改。我可以确认在用户点击时调用了 animateLabel() 方法。

现在如果是添加在行中,

self.view!.translatesAutoresizingMaskIntoConstraints = false

所有约束都搞砸了,它不尊重我在 xib 中已经设置的约束。

这里出了什么问题?

【问题讨论】:

  • 如果您在 XIB 中对 viewLabel 设置约束,则您的代码会添加更多约束,但这不会 删除现有的约束。从您的 XIB 创建 @IBOutlet 连接并在代码中修改它们的 .priority.isActive 属性。

标签: ios swift nslayoutconstraint


【解决方案1】:

我正在为视图使用 xib 文件,并在其中设置了约束。

您在 xib + in code 中的约束存在冲突,您需要将 xib 中的约束作为 outlet 并使用它们的 .isActive 属性并完全删除代码约束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2015-07-18
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多