2015-12-27 3 views
1

J'essaye de randomiser une contrainte principale pour un bouton dans swift. Pour l'activer, je sélectionne un bouton. Quand je sélectionne le bouton pour la première fois, ça marche bien, mais après tout ça, ça montre beaucoup d'erreurs dans le NSLog. Voici le code:Comment obtenir un CGFloat aléatoire pour une contrainte?

let button = UIButton() 
@IBAction func start(sender: UIButton) { 
    let randomNumber = Int(arc4random_uniform(180) + 30) 
    let cgfloatrandom = CGFloat(randomNumber) 
    button.hidden = false 
    button.translatesAutoresizingMaskIntoConstraints = false 
    NSLayoutConstraint.activateConstraints([ 
     button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: cgfloatrandom), 
     button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 390), 
     button.widthAnchor.constraintEqualToConstant(75), 
     button.heightAnchor.constraintEqualToConstant(75) 
     ]) 
} 

Aidez-nous s'il vous plaît. Je vous remercie. Anton

+2

Vous devez supprimer la contrainte ajoutée précédemment lors de la deuxième exécution car la précédente sera en conflit avec la nouvelle. Le premier dit "200 pixel away", le second dit "100 pixel away": ça ne va pas bien finir;) Ce que vous devez faire est de créer la contrainte dans le constructeur de l'interface, connectez-le comme sortie et changez seulement le constante sur cette sortie au lieu de créer de nouvelles contraintes tout le temps – luk2302

+0

@ luk2302 Comme ceci?: 'button.removeConstraints ([button.leadingAnchor.constraintEqualToAnchor (view.leadingAnchor)])' –

+0

pourquoi ne pas simplement maintenir la contrainte principale, puis changer le valeur "constante"? –

Répondre

1

Le problème est que vous ajoutez des contraintes à un bouton qui a déjà été correctement contraint. Bien que vous puissiez supprimer toutes les contraintes et les recréer, cela est vraiment inefficace et ne serait pas recommandé.

Je recommanderais simplement de garder une référence à la contrainte principale, ce qui vous permettra d'y accéder à chaque fois que le bouton est sollicité pour modifier le constant.

Pour ce faire, mettre en œuvre une propriété pour votre contrainte de premier plan, comme ceci:

var leadingConstraint: NSLayoutConstraint! 

Lorsque vous créez ce bouton, vous aurez envie de limiter correctement aussi bien. Voici où vous allez créer cette contrainte principale spéciale. Cela se fait en dehors de la fonction d'action du bouton, peut-être viewDidLoad:

button = UIButton() 
button.translatesAutoresizingMaskIntoConstraints = false 
//... 

leadingConstraint = button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 0) 

NSLayoutConstraint.activateConstraints([ 
    leadingConstraint, 
    button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 390), 
    button.widthAnchor.constraintEqualToConstant(75), 
    button.heightAnchor.constraintEqualToConstant(75) 
]) 

Maintenant, lorsque le bouton est appuyé, vous ne devrez définir translatesAutoresizingMaskIntoConstraints, et vous pouvez simplement mettre à jour le constant des principaux contraintes existantes.

@IBAction func start(sender: UIButton) { 
    button.hidden = false 

    let randomNumber = Int(arc4random_uniform(180) + 30) 
    leadingConstraint.constant = CGFloat(randomNumber) 
} 
+0

Bonne description! Merci! –