je me suis lancé dans l'autolayout récemment et je suis bloqué sur ce qui semble être un exemple de problème vraiment trivial. Je souhaite voir s'asseoir en haut de l'écran et occuper la moitié de la hauteur de l'écran. Simple avant l'autolayout - il suffit de le fixer à la place et de lui demander de se développer verticalement lorsque la super vue redimensionne.
Maintenant, je ne vois pas comment le faire pour la vie. Voici ce que je reçois quand j'essaie de le configurer:
La contrainte d'espace en bas est définie sur "est égal à 284", ce qui est absolu et absolument inutile lorsque je change de disposition pour l'iPhone4, car elle conserve 284 points d'espace en bas de l'écran et réduit la vue pour ne plus être divisée par deux. taille de l'écran. Et il n'y a aucun moyen de définir cette contrainte pour qu'elle corresponde à une fraction de la hauteur de toute autre vue.
Après avoir lutté pendant un certain temps, la seule façon de procéder serait d’introduire un autre point de vue en dessous de ce point de vue, d’affecter leurs hauteurs de la même manière, de les placer au-dessus et au-dessous, puis de définir le second point de vue (invisible). .. qui semble un peu moche!
Est-ce que je manque quelque chose d'évident? ..
Ceci est maintenant possible dans IB à partir de [au moins] Xcode 5.1.1. Même s’il m’a fallu un certain temps pour comprendre que c’est en fait très simple:
Commencez par créer une contrainte d'alignement supérieure de base (vous devrez également configurer les contraintes inférieure, gauche et droite, comme d'habitude) . Sélectionnez ensuite la contrainte et accédez à l'inspecteur Attribut :
Ensuite, vous pouvez ajuster le multiplicateur. Si vous le souhaitez, laissez 50% de la vue super à 1
, car elle est alignée par le centre de la super vue. C'est aussi un excellent moyen de créer des vues qui sont aussi des pourcentages (comme 25% de super vue)
Solution de scénarimage dans laquelle vous pouvez définir le rapport exact entre toutes les vues:
À présent:
PROFIT !!!
P.S. Notez également que cette méthode fonctionne avec des vues sur différents niveaux de nidification et (évidemment) applicables à la largeur.
P.P.S. Parfois, il peut être utile "d'inverser le premier et le deuxième élément" de la contrainte ou de définir le multiplicateur inverse (par exemple 2 au lieu de 0,5) (mais ces méthodes ne sont pas utiles si vous ne comprenez pas la relation entre les vues).
Après un peu plus de temps, je propose ce qui suit.
Je le note comme une réponse, mais ce n’est pas très satisfaisant, car cela suppose que vous ne pouvez pas réellement le faire dans Interface Builder, mais la contrainte appropriée peut être ajoutée dans le code ultérieurement:
- (void) viewWillAppear:(BOOL)animated
{
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:.5
constant:0];
[self.view addConstraint:constraint];
}
Fondamentalement, il définit un multiplicateur de 0,5 par rapport à la hauteur de self.view, agissant sur la vue d'ensemble . contraintes aussi.
Donc, si quelqu'un peut montrer comment faire cela dans Interface Builder, cela répondra mieux à ma question, sinon je suppose que c'est aussi bon que ça en a (pour le moment) ???
Un peu plus facile et plus simple que la méthode que la réponse de Fyodor Volchyok. - Maintenez le bouton de contrôle enfoncé et cliquez sur la sous-vue .- Toujours en maintenant le bouton de commande enfoncé, faites glisser le curseur sur la vue d'ensemble, puis cliquez sur la vue d'ensemble .- Sélectionnez "Format d'affichage".
-Alors cliquez sur l'inspecteur de taille .- Puis double-cliquez sur la contrainte .
-Assurez-vous que "hauteur" est sélectionné pour les deux éléments .
-Alors changez le "Multiplicateur" en 0.5 pour la moitié de l’écran, ou quelle que soit la fraction de la super vue que vous désirez .
Là aussi, une autre possibilité dans le code si vous avez 2 vues qui doivent toutes les deux avoir la même hauteur: il suffit de régler la hauteur de view2 à la hauteur de view1 (le truc ici n’est pas de définir explicitement la hauteur de view1).
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
options:0
metrics:nil
views:viewsDict]];
Version rapide de la réponse de Mete:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
upperView.translatesAutoresizingMaskIntoConstraints = false
var constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.top,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.top,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.height,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.height,
multiplier: 0.5,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.leading,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.leading,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
constraint = NSLayoutConstraint(item: upperView,
attribute: NSLayoutAttribute.trailing,
relatedBy: NSLayoutRelation.equal,
toItem: self.view,
attribute: NSLayoutAttribute.trailing,
multiplier: 1,
constant: 0)
self.view.addConstraint(constraint)
}