Swift Update Constraint

后端 未结 3 1067
逝去的感伤
逝去的感伤 2021-01-04 20:01

I added the constraint to the buttons created in my UIView

func CreateButtonWithIndex(index:Int) {

    newButton.setTranslatesAutoresizingMaskI         


        
3条回答
  •  我在风中等你
    2021-01-04 20:41

    The issue is that you're adding a new constraint that conflicts with the existing constraint.

    You have a few options:

    1. Effective in iOS 8, you can set the active property to false for a constraint before you add a new constraint.

    2. In iOS versions prior to 8, you would want to remove the old constraints before adding new constraints.

    3. 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
          }
      
      }
      

      When the desired effect can be achieved by modifying the constant of the constraint, that's generally best.

    For Swift 2 syntax, see previous revision of this answer.

提交回复
热议问题