I added the constraint to the buttons created in my UIView
func CreateButtonWithIndex(index:Int) {
newButton.setTranslatesAutoresizingMaskI
The issue is that you're adding a new constraint that conflicts with the existing constraint.
You have a few options:
Effective in iOS 8, you can set the active property to false for a constraint before you add a new constraint.
In iOS versions prior to 8, you would want to remove the old constraints before adding new constraints.
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.