web-dev-qa-db-fra.com

autolayout - établit la hauteur de vue par rapport à la moitié de la hauteur de la vue

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:

autolayout blues

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? ..

124
Mete

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 :

Demonstration of steps above

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)

Demonstration of second step above

154
Firo

Solution de scénarimage dans laquelle vous pouvez définir le rapport exact entre toutes les vues:

Set height equality constraint

À présent:

Edit constraint's multiplier

PROFIT !!!

Result

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).

169
Fyodor Volchyok

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) ??? 

30
Mete

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".

 enter image description here

-Alors cliquez sur l'inspecteur de taille .- Puis double-cliquez sur la contrainte .  enter image description here

-Assurez-vous que "hauteur" est sélectionné pour les deux éléments .  enter image description here

-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 .  enter image description here

8
user444333222

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]];
7
brainray

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)


}
0
user444333222