web-dev-qa-db-fra.com

autolayout iOS - La définition de deux distances différentes entre les vues dépend de la hauteur de l'écran.

Je sais que quelque chose me manque, car ce doit être quelque chose de facile à réaliser.

Mon problème est que j'ai dans mon "écran de chargement" (celui qui apparaît juste après le splash) un UIImageView avec deux images différentes pour un écran de 3,5 "et 4". À un certain endroit de ces images, j'ai placé un UIActivityIndicator, pour dire à l'utilisateur que l'application est en train de charger quelque chose en arrière-plan. Cet emplacement n’est pas le même pour les deux images, car l’une d’elles est évidemment plus élevée que l’autre. Je souhaite donc définir une contrainte de report automatique qui me permet de placer cet indicateur d’activité à des hauteurs différentes, selon que l’application fonctionne iPhone 5 ou pas.

Sans Autolayout, je définirais le frame.Origin.y de la vue à 300 (par exemple), puis dans la méthode viewDidLoad du ViewController, je demanderais si l'application est exécutée sur un iPhone 5, alors je ' d changez la valeur, par exemple, 350. Je ne sais pas comment faire cela avec Autolayout et je pense que cela doit être assez simple.

36
Daniel

Vous pouvez créer une sortie NSLayoutConstraint sur votre contrôleur de vue et connecter celle-ci à la contrainte Y de l'indicateur d'activité dans votre xib ou votre storyboard. Ajoutez ensuite une méthode updateViewContraints à votre contrôleur de vue et mettez à jour la constante de la contrainte en fonction de la taille de l'écran.

 connecting constraint to outlet

Voici un exemple de updateViewConstraints:

- (void)updateViewConstraints {
    [super updateViewConstraints];
    self.activityIndicatorYConstraint.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}

Bien sûr, vous voudrez mettre vos valeurs appropriées au lieu de 200 et 100. Vous voudrez peut-être définir certaines constantes nommées. De plus, n'oubliez pas d'appeler [super updateViewConstraints].

109
rob mayoff

Le problème de @Rob answer est que vous devez créer beaucoup de code pour chaque contrainte . Pour résoudre ce problème, ajoutez simplement la classe ConstraintLayout à votre code et modifiez la valeur constante de la contrainte pour le périphérique que vous souhaitez dans l'IB: 

 enter image description here

//
//  LayoutConstraint.Swift
//  MyConstraintLayout
//
//  Created by Hamza Ghazouani on 19/05/2016.
//  Copyright © 2016 Hamza Ghazouani. All rights reserved.
//

import UIKit

@IBDesignable
class LayoutConstraint: NSLayoutConstraint {

    @IBInspectable
    var ????3¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                constant = ????3¨5_insh
            }
        }
    }

    @IBInspectable
    var ????4¨0_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                constant = ????4¨0_insh
            }
        }
    }

    @IBInspectable
    var ????4¨7_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                constant = ????4¨7_insh
            }
        }
    }

    @IBInspectable
    var ????5¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                constant = ????5¨5_insh
            }
        }
    }
}

N'oubliez pas d'hériter de votre contrainte de classe de ConstraintLayout J'ajouterai bientôt la version de objective-c 

17
Hamza

L'outil de base dans la mise en page automatique pour gérer la position des objets d'interface utilisateur est les contraintes. Une contrainte décrit une relation géométrique entre deux vues. Par exemple, vous pourriez avoir une contrainte qui dit: "La barre de bord de progression de droite est connectée au bord de gauche d'une étiquette de 40 points d'espace vide entre eux."

Cela signifie qu'en utilisant AutoLayout, vous ne pouvez pas définir de position conditionnelle en fonction du mode de UIDevice. Vous pouvez plutôt créer une présentation qui se modifie elle-même si, par exemple. l'application fonctionne en plein écran de 3,5 '(IPhone4) ou en plein écran de 4' (IPhone5) en fonction des contraintes.

Donc, les options pour votre problème en utilisant des contraintes:

1) trouvez une vue de votre mise en page qui peut être utilisée pour créer une contrainte afin de positionner la barre de progression de manière relative. (Sélectionnez la vue et la barre de progression à l'aide du bouton CMD, puis utilisez le menu Editeur/Pin/Espacement vertical pour créer une contrainte verticale entre les 2 objets.)

2) créer une contrainte absolue pour coller la position de la barre de progression à l'écran Edge (en gardant de l'espace) ou de manière centrale

J'ai trouvé utile ce tutoriel sur AutoLayout qui pourrait vous être utile également: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Remarque: l'autolayout ne fonctionne qu'à partir de IOS 6.

1
nzs

En général, j'essaie toujours de rester dans Interface Builder pour configurer des contraintes. Plonger dans le code pour avoir plus de contrôle est généralement utile si vous avez des mises en page complètement différentes sur iPhone 4 et 6 par exemple.

Comme mentionné précédemment, vous ne pouvez pas avoir de condition de base dans Interface Builder, c’est vraiment utile de relier une contrainte à votre contrôleur de vue.

Voici une brève explication de trois approches permettant de résoudre les problèmes de mise en page automatique pour différentes tailles d'écran: http://candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/

0
Jure