iOS Mise à jour de la mise en page automatique avec les modifications apportées à la collection de caractéristiques


Exemple

Faire en sorte que l’application soit adaptative - c’est-à-dire répondre aux changements de classe de taille en modifiant votre disposition - implique souvent une grande aide du système Auto Layout. L'une des principales façons dont les applications deviennent adaptatives consiste à mettre à jour les contraintes de mise en forme automatique actives lorsque la classe de taille d'une vue change.

Par exemple, considérez une application qui utilise un UIStackView pour organiser deux UILabels. Nous pourrions souhaiter que ces étiquettes s’empilent les unes sur les autres dans des environnements horizontalement compacts, mais s’assoient côte à côte lorsque nous avons un peu plus de place dans des environnements horizontaux réguliers.

class ViewController: UIViewController {
    var stackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        stackView = UIStackView()
        for text in ["foo", "bar"] {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = text
            stackView.addArrangedSubview(label)
        }
        
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    private func updateAxis(forTraitCollection traitCollection: UITraitCollection) {
        switch traitCollection.horizontalSizeClass {
        case .regular:
            stackView.axis = .horizontal
        case .compact:
            stackView.axis = .vertical
        case .unspecified:
            print("Unspecified size class!")
            stackView.axis = .horizontal
        }
    }
}