2016-12-22 1 views
2

Je suis en train de centrer une image à une vue mais je suis en train de error..this est mon code:Obtenir l'erreur de temps lors de l'ajout de contraintes

let markerimage = #imageLiteral(resourceName: "ic_new_mark_icon") 

    let size = CGSize(width: 60, height: 60) 

    var newimage = imageWithImage(image: markerimage, scaledToSize: size) 

    var imageview = UIImageView(image: newimage) 

    self.view.addSubview(imageview) 


    let xConstraint = NSLayoutConstraint(item: imageview, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0) 

    let yConstraint = NSLayoutConstraint(item: imageview, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0) 

    imageview.addConstraint(xConstraint) 
    imageview.addConstraint(yConstraint) 

et mon erreur est

2016-12-22 16:29:11.305417 Googlemappractice[21426:362773] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x600000285f00 UIImageView:0x7ff772f15560.centerX == UIView:0x7ff772c0bd30.centerX (inactive)> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) 
+0

Vous devez ajouter ces contraintes à self.view, pas à l'affichage de l'image. Aussi, assurez-vous que vous avez désactivé le drapeau autoresize (vous avez probablement, mais je n'ai pas vu ce code). – dfd

+0

Depuis iOS8, il a été possible d'activer simplement les contraintes au lieu de les ajouter aux vues. Définissez 'xConstraint.isActive = true' et' yConstraint.isActive = true'. – vacawama

Répondre

1

Les contraintes doivent être ajoutées au premier ancêtre commun des deux vues affectées par la contrainte. Dans ce cas, self.view est situé plus tôt dans la hiérarchie, de sorte que les contraintes doivent y être ajoutées au lieu de imageview.

Depuis iOS 8, il existe un moyen plus simple. Une fois que vous avez ajouté votre vue à la hiérarchie de vue (avec addSubview), vous pouvez activer les contraintes au lieu de les ajouter aux vues.

Vous pouvez le faire en définissant la propriété isActive true:

xConstraint.isActive = true 
yConstraint.isActive = true 

ou en utilisant la fonction de classe activate de NSLayoutConstraint aux contraintes multiples actifs:

NSLayoutConstraint.activate([xConstraint, yConstraint]) 

Comme l'a mentionné @dfd dans les commentaires, vous devez également définir ce drapeau:

imageview.translatesAutoresizingMaskIntoConstraints = false 

Cela indique à iOS de ne pas créer de contraintes pour imageview en fonction de son cadre. Si vous ne le faites pas, vous vous retrouverez avec des contraintes conflictuelles.

Vous allez avoir besoin de contraintes de largeur et de hauteur pour votre imageview, parce que vous avez seulement spécifié sa position jusqu'à présent.

+1

Merci @vacawama. J'ai mis mes contraintes un peu différemment (la plupart dans des tableaux, toutes avec plus de syntaxe "Swifty") et je n'ai jamais pensé à mettre isActive à true. J'apprends quelque chose de nouveau tous les jours ici sur SO et la leçon d'aujourd'hui est maintenant terminée! – dfd