2
votes

Comment gérer la zone de sécurité lors de l'utilisation des classes de taille?

Je viens de créer une simple vue rouge et de créer 4 contraintes pour celle-ci (haut, gauche, droite, bas). J'essaie de créer une mise en page adaptative en utilisant des classes de taille, mais je ne parviens pas à obtenir une mise en page correcte dans l'orientation "paysage à droite":

  1. En mode portrait, tout est correct. Bords inférieurs, gauches, droits aux bords de la vue supervisée, bord supérieur au sommet de la zone sûre.
  2. En mode paysage à gauche, tout est correct. Bords supérieurs, droits aux bords des super-vues, gauche et bas aux bords de la zone sûre.
  3. Mais en mode paysage, la mise en page n'est pas correcte. Je suppose que ce bord gauche sera égal au bord gauche de superview, mais en fait, il est égal à la zone de sécurité. Même chose avec le bord droit: je m'attends à ce qu'il soit égal au bord de la zone de sécurité, mais en fait, il est égal au bord de superview. Comment résoudre ce problème?

 Capture d'écran Interface Builder Mode portrait Paysage à gauche Paysage à droite


1 commentaires

Veuillez fournir ces éléments: Une image des paramètres que vous avez définis. Une image du résultat. Une image de ce que vous désirez.


4 Réponses :


0
votes

D'après ce que j'ai compris, ce que vous essayez de réaliser, c'est que chaque fois qu'un téléphone est en position paysage, le bord de votre vue rouge doit être égal au bord correspondant de superview sur le côté où se trouve le bas du téléphone. Si c'est le cas, vous pouvez créer 4 contraintes, 2 pour le côté droit et 2 pour le côté gauche.

Considérons 2 contraintes du bord d'attaque de la vue rouge: 1) Le bord avant de la vue rouge est égal au bord avant de superview 2) Le bord avant de la vue rouge est égal à SafeArea

Toutes les contraintes ont la priorité par défaut de 999

Ensuite, ce que vous pouvez faire dans votre contrôleur de vue est:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let lowPriority = UILayoutPriority(rawValue: 250)
    let highPriority = UILayoutPriority(rawValue: 999)

    switch UIDevice.current.orientation {
    case .landscapeLeft:
        leftEdgeToSafeAreaConstraint.priority = highPriority
        rightEdgeToSafeAreaConstraint.priority = lowPriority

        leftEdgeToSuperviewConstraint.priority = lowPriority
        rightEdgeToSuperviewConstraint.priority = highPriority
    case .landscapeRight:
        leftEdgeToSafeAreaConstraint.priority = lowPriority
        rightEdgeToSafeAreaConstraint.priority = highPriority

        leftEdgeToSuperviewConstraint.priority = highPriority
        rightEdgeToSuperviewConstraint.priority = lowPriority
    default:
        leftEdgeToSafeAreaConstraint.priority = highPriority
        rightEdgeToSafeAreaConstraint.priority = highPriority

        leftEdgeToSuperviewConstraint.priority = lowPriority
        rightEdgeToSuperviewConstraint.priority = lowPriority
    }
}


1 commentaires

Il est logique que les contraintes dans le code puissent être une bande de canard. Je pensais qu'il y avait un moyen automatique de le faire via Interface Builder



0
votes

J'ai du mal avec les rotations d'appareils en utilisant les ancres gauche, droite, supérieure et inférieure.

Pour un bon paysage, vous devez être silencieux pour le bord supérieur et la barre d'état.

Si vous comprenez correctement votre hiérarchie de vues, vous pouvez utiliser comme exemple de code suivant:

        let deleteButtonImage = UIImage(named: "DeleteButton") as UIImage?  
        let deleteButtonImageSize: CGSize = CGSize(width: 295, height: 45)
        let deleteButton = UIButton(type: UIButton.ButtonType.custom)
        deleteButton.translatesAutoresizingMaskIntoConstraints = false
        deleteButton.tintColor = .white
        deleteButton.frame = CGRect(x: 0, y: 0, width: 250, height: 135)
        deleteButton.setImage(deleteButtonImage, for: .normal)

        deleteButton.imageEdgeInsets = UIEdgeInsets(
            top: (deleteButton.frame.size.height - deleteButtonImageSize.height) / 2,
            left: (deleteButton.frame.size.width - deleteButtonImageSize.width) / 2.5,
            bottom: (deleteButton.frame.size.height - deleteButtonImageSize.height) / 2,
            right: (deleteButton.frame.size.width - deleteButtonImageSize.width) / 2.5)


        scrollView.addSubview(deleteButton)

        deleteButton.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        deleteButton.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: -150).isActive = true
        deleteButton.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 370).isActive = true
        deleteButton.widthAnchor.constraint(equalTo: self.scrollView.safeAreaLayoutGuide.widthAnchor).isActive = true
        deleteButton.heightAnchor.constraint(equalToConstant: 45).isActive = true

   }


1 commentaires

Il est logique que les contraintes dans le code puissent être une bande de canard. Je pensais qu'il y avait un moyen automatique de le faire via Interface Builder



0
votes

Définissez les marges supérieure, gauche et droite sur 0 pour les aligner sur la zone de sécurité . et du bas à 0 avec Superview .

 changer la zone de sécurité en superview


0 commentaires

1
votes

Commencez par créer une constante séparée uniquement pour la contrainte supérieure pour les classes de taille. Regardez mes images. Créez ensuite une sortie pour les contraintes de début et de fin.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var conTrailing: NSLayoutConstraint!
    @IBOutlet weak var conLeading: NSLayoutConstraint!     

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.setOrientationAllignment()
    }

    func setOrientationAllignment() {
        switch UIDevice.current.orientation {
        case .portrait:
            self.conLeading.constant = 0
            self.conTrailing.constant = 0
        case .landscapeLeft:
            self.conLeading.constant = 40
            self.conTrailing.constant = 0
        case .landscapeRight:
            self.conLeading.constant = 00
            self.conTrailing.constant = 40
        default:
            break
        }
        self.view.layoutSubviews() //  no  need  now
        self.view.layoutIfNeeded()
    }        

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)        
        self.setOrientationAllignment()
    }
}


1 commentaires

Il est logique que les contraintes dans le code puissent être une bande de canard. Je pensais qu'il y avait un moyen automatique de le faire via Interface Builder