Swift Mise À Jour De Contrainte
J'ai ajouté la contrainte sur les boutons créés dans mon 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])
}
}
}
}
Dans Mon Projet, mes utilisateurs peuvent déplacer ces boutons, puis j'ai essayé d'ajouter plus de contraintes pour les boutons reconnu, mais je viens d'obtenir une interminable erreur contrainte
"<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>"
Va tenter de récupérer par la rupture contrainte
"<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>"
Va tenter de récupérer par la rupture contrainte
<NSLayoutConstraint:0x7f8e5a4e9510 UIButton:0x7f8e5a644f60'Button6'.centerY == UIView:0x7f8e5a648bc0.centerY - 40>
... dois-je mettre à jour newButtonConstraintX /Y, mais je ne comprends pas comment je peux faire cela ?
OriginalL'auteur stack | 2015-01-09
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous êtes en train d'ajouter une nouvelle contrainte qui est en conflit avec la contrainte existante.
Vous avez un peu d'options:
Efficace dans iOS 8, vous pouvez définir la
active
propriétéfalse
pour une contrainte avant d'ajouter une nouvelle contrainte.Dans les versions d'iOS avant 8, vous souhaitez supprimer les anciennes contraintes avant d'ajouter de nouvelles contraintes.
Idéalement, il est préférable de ne pas avoir à activer/désactiver (ou, pire, d'ajouter et de supprimer des contraintes, mais plutôt juste de modifier la
constant
propriété d'une seule contrainte. Par exemple, dans Swift 3/4:Quand l'effet désiré peut être obtenu en modifiant la
constant
de la contrainte, qui est généralement meilleure.Pour Swift 2 syntaxe, voir de la révision précédente date de cette réponse.
Je l'ai essayé avec la connexion des contraintes à partir d'un storyboard et le changement de ses constantes à partir de IBOutlet fonctionne bien.
OriginalL'auteur Rob
Dirait que vous êtes juste à ajouter de plus en plus de contraintes. Vous ne pouvez pas le faire parce qu'ils ont de toute évidence en conflit les uns avec les autres. Vous êtes essentiellement en disant: "mettre la vue à la position x = 1, x = 2, x = 3, x = 4 et x = 5".
Vous devez supprimer les anciennes contraintes. Vous avez deux options pour ce faire.
Enregistrer les contraintes dans un tableau, et de supprimer ces contraintes à partir de la vue avant d'en ajouter de nouveaux.
Ou vous de conserver une référence à la que des contraintes de changer et de modifier leurs propriétés.
Depuis vos contraintes diffèrent juste dans la valeur de la constante que vous devriez aller pour l'option 2.
Faire
newButtonConstraintX
etnewButtonConstraintY
une variable de la viewController.par exemple
OriginalL'auteur Matthias Bauch
Mise à jour de Rob Réponse à Swift 3:
OriginalL'auteur Brian