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":
4 Réponses :
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 } }
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
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 }
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
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() } }
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
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.