Swift Update Constraint(Swift 更新约束)
问题描述
我将约束添加到在我的 UIView
I added the constraint to the buttons created in my UIView
func CreateButtonWithIndex(index:Int) {
    newButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.view.addSubview(newButton)
    let newButtonConstraintL = NSLayoutConstraint(item: newButton, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
    let newButtonConstraintH = NSLayoutConstraint(item: newButton, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
    var newButtonConstraintX = NSLayoutConstraint(item: newButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: CGFloat(riga))
    var newButtonConstraintY = NSLayoutConstraint(item: newButton, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: CGFloat(colonna))
    view.addConstraints([newButtonConstraintX,newButtonConstraintY,newButtonConstraintH,newButtonConstraintL])
    var pan = UIPanGestureRecognizer(target:self, action:"pan:")
    pan.maximumNumberOfTouches = 2
    pan.minimumNumberOfTouches = 1
    newButton.addGestureRecognizer(pan)
}
func pan(rec:UIPanGestureRecognizer) {
  case .Ended: 
        if let subview = selectedView {
            if let button = rec.view as? UIButton {
                if let title = button.titleForState(.Normal){
                    button.setTranslatesAutoresizingMaskIntoConstraints(false)
                    let line = Float(p.x % snapX)
                    let column = Float(p.x % snapY)
                    let constraintL = NSLayoutConstraint(item: button, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
                    let constraintH = NSLayoutConstraint(item: button, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
                    var constraint2 = NSLayoutConstraint(item: button, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: CGFloat(line))
                    var constraint3 = NSLayoutConstraint(item: button, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: CGFloat(column))
                    view.addConstraints([constraint2,constraint3,constraintL.constraintH])
                }
            }
        }
}
在我的项目中,我的用户可以移动这些按钮,然后我尝试为识别的按钮添加更多约束,但我得到了一个无穷无尽的错误约束
In My Project my users can move these buttons and then I tried to add more constraints to the buttons recognized but I just get an endless error constraint
  "<NSLayoutConstraint:0x7f8e5a4e9450 UIButton:0x7f8e5a644f60'Button6'.centerX == UIView:0x7f8e5a648bc0.centerX - 120>",
  "<NSLayoutConstraint:0x7f8e5a5be040 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f8e5a648bc0(736)]>",
  "<NSAutoresizingMaskLayoutConstraint:0x7f8e5a5be1f0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7f8e5a648bc0]   (Names: '|':UITransitionView:0x7f8e5a5a8190 )>",
  "<NSAutoresizingMaskLayoutConstraint:0x7f8e5a5b53b0 h=--& v=--& UIButton:0x7f8e5a644f60'Button6'.midX == + 200>"
将尝试通过打破约束来恢复
Will attempt to recover by breaking constraint
"<NSLayoutConstraint:0x7f8e5a4e9450 UIButton:0x7f8e5a644f60'Button6'.centerX == UIView:0x7f8e5a648bc0.centerX - 120>"
"<NSLayoutConstraint:0x7f8e5a4e9510 UIButton:0x7f8e5a644f60'Button6'.centerY == UIView:0x7f8e5a648bc0.centerY - 40>",
"<NSLayoutConstraint:0x7f8e5a5be1a0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7f8e5a648bc0(414)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7f8e5a5be240 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7f8e5a648bc0]   (Names: '|':UITransitionView:0x7f8e5a5a8190 )>",
"<NSAutoresizingMaskLayoutConstraint:0x7f8e5a5b82d0 h=--& v=--& UIButton:0x7f8e5a644f60'Button6'.midY == + 189>"
将尝试通过打破约束来恢复
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f8e5a4e9510 UIButton:0x7f8e5a644f60'Button6'.centerY == UIView:0x7f8e5a648bc0.centerY - 40>
...我应该更新 newButtonConstraintX/Y 但我不明白我该怎么做吗?
... should I update newButtonConstraintX / Y but I'm not understanding how I can do this ?
推荐答案
问题是您正在添加一个与现有约束冲突的新约束.
The issue is that you're adding a new constraint that conflicts with the existing constraint.
你有几个选择:
- 在 iOS 8 中生效,您可以在添加新约束之前将约束的 - active属性设置为- false.
在 iOS 8 之前的版本中,您可能希望在添加新约束之前删除旧约束.
In iOS versions prior to 8, you would want to remove the old constraints before adding new constraints.
理想情况下,最好不必激活/停用(或者,更糟糕的是,添加和删除)约束,而只需修改单个约束的 constant 属性.例如在 Swift 3/4 中:
Ideally, it's best to not have to activate/deactivate (or, worse, add and remove) constraints, but rather just modify the constant property of a single constraint. For example in Swift 3/4:
class ViewController: UIViewController {
    private var xConstraint: NSLayoutConstraint!
    private var yConstraint: NSLayoutConstraint!
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel()
        label.text = "x"
        label.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(label)
        // I don't really need to save references to these, so these are local variables
        let widthConstraint = label.widthAnchor.constraint(equalToConstant: 50)
        let heightConstraint = label.heightAnchor.constraint(equalToConstant: 50)
        // but since I'll be modifying these later, these are class properties
        xConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        yConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        NSLayoutConstraint.activate([widthConstraint, heightConstraint, xConstraint, yConstraint])
        let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        view.addGestureRecognizer(pan)
    }
    private var originalCenter: CGPoint!
    @objc func handlePan(_ gesture: UIPanGestureRecognizer) {
        if gesture.state == .began {
            originalCenter = CGPoint(x: xConstraint.constant, y: yConstraint.constant)
        }
        let translation = gesture.translation(in: gesture.view!)
        xConstraint.constant = originalCenter.x + translation.x
        yConstraint.constant = originalCenter.y + translation.y
    }
}
当通过修改约束的constant可以达到想要的效果时,一般是最好的.
When the desired effect can be achieved by modifying the constant of the constraint, that's generally best.
有关 Swift 2 语法,请参阅此答案的上一版本.
For Swift 2 syntax, see previous revision of this answer.
这篇关于Swift 更新约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Swift 更新约束
 
				
         
 
            
        基础教程推荐
- :hover 状态不会在 iOS 上结束 2022-01-01
- 如何使用 YouTube API V3? 2022-01-01
- “让"到底是怎么回事?关键字在 Swift 中的作用? 2022-01-01
- LocationClient 与 LocationManager 2022-01-01
- 固定小数的Android Money Input 2022-01-01
- Android ViewPager:在 ViewPager 中更新屏幕外但缓存的片段 2022-01-01
- Android文本颜色不会改变颜色 2022-01-01
- 如何使 UINavigationBar 背景透明? 2022-01-01
- 在 iOS 上默认是 char 签名还是 unsigned? 2022-01-01
- 使用 Ryzen 处理器同时运行 WSL2 和 Android Studio 2022-01-01
 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
    	 
				 
				 
				 
				