【发布时间】: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