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.