Par programmation, la création de contraintes liées à vue-contrôleur les marges
Je suis en train de faire une vue qui va agir comme une sorte de "panneau", attaché à le côté droit de la vue-contrôleur.
Qui est, il est lié à l'arrière, en haut et en bas des marges de la société mère-vue-contrôleur, avec une largeur statique de 300
Cependant, je n'arrive pas à obtenir de droit, je suis en train de briser une contrainte ou de faire quelque chose xcode me dit est illégal.
Ce que je fais mal?
Voici le code du contrôleur
let myView = UIView()
view.backgroundColor = UIColor.redColor()
self.view.addSubview(view)
let topConstraint = NSLayoutConstraint(item: myView,
attribute: .Top,
relatedBy: .Equal,
toItem: self.topLayoutGuide,
attribute: .Bottom,
multiplier: 1,
constant: 0)
let trailingConstraint = NSLayoutConstraint(item: self.view,
attribute: .TrailingMargin,
relatedBy: .Equal,
toItem: myView,
attribute: .Trailing,
multiplier: 1,
constant: 0)
let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide,
attribute: .Top,
relatedBy: .Equal,
toItem: myView,
attribute: .Bottom,
multiplier: 1,
constant: 0)
let widthConstraint = NSLayoutConstraint(item: myView,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: 300)
self.view.addConstraints([trailingConstraint])
view.addConstraints([topConstraint, bottomConstraint, widthConstraint])
Pourquoi n'utilisez-vous pas un Format Visuel de la Langue?
"H:[panel(300)]|
et "V:|[toplayout][panel][botlayout]|"
devrait être suffisant.OriginalL'auteur prawn | 2016-04-08
Vous devez vous connecter pour publier un commentaire.
En fait le problème dans votre code, c'est que vous n'avez pas défini la
translatesAutoresizingMaskIntoConstraints
demyview
àfalse
, chaque fois que vous voulez utiliser la fonction auto-contraintes de mise en forme, alors vous devez définirtranslatesAutoresizingMaskIntoConstraints
de vue sur false.Un autre Problème est que vous n'ajoutez pas
myview
sur de soi.vue que j'ai mis à jour votre code et Sa fonctionne bien Selon vos contraintes.Mettre de code ci-dessous dans votre ViewController .
Si vous aimez vraiment ma réponse, alors vous serait également en hausse de vote.
OriginalL'auteur keshav vishwkarma
Dans votre exemple de code ci-dessus, il semble que vous mélangez
view
etmyView
dans quelques endroits. Dans tous les cas,widthConstraint
doit être ajouté àmyView
ettopConstraint
,trailingConstraint
, etbottomConstraint
doit être ajouté àself.view
. La raison pour cela est les contraintes doivent être ajoutés à la plus proche superview ancêtre qui présente les deux points de vue impliqués dans la contrainte. Dans le cas où vous êtes de contraindre un enfant attribut de vue d'un attribut sur son parent vue, la contrainte doit être ajouté à la vue parent, car il présente à la fois lui-même et à la vue enfant. Si vous avez une contrainte entre deux, de frère, de points de vue, la contrainte serait ajoutée à leurs parents, car elle est le plus proche de l'ancêtre qui définit à la fois les points de vue impliqués.Si vous êtes en mesure de cibler iOS 9.0 et au-dessus, c'est beaucoup plus propre et plus facile à utiliser la nouvelle NSLayoutAnchor et NSLayoutDimension API pour la création de ces sortes de contraintes. Il fournit également la vérification de type stricte et le compilateur peut vérifier l'exactitude. Avec ces nouvelles Api, votre exemple de code deviendrait simplement:
Pas besoin d'ajouter explicitement les contraintes à la vue de droite, etc. Vous pouvez en savoir plus sur cette méthode de création de contraintes ici:
https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/
et ici:
https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/
OriginalL'auteur Daniel Hall
Il semble y avoir une certaine ambiguïté dans votre code, vous créez une UIView comme mavue, mais l'ajout de vue de l'autonomie.point de vue et même contrainte de lui-même. Afin de corriger votre code et de le remplacer avec vue mavue.
Deuxièmement setTranslayesAutoresizingMaskIntoconstraints à false.
Puis ajoutez toutes les contraintes de soi.vue. Cela devrait résoudre votre problème.
VFL est également un meilleur et propre approche. Il donne en fait une visualisation de la façon dont la contrainte de l'installation.
OriginalL'auteur Arun Gupta