Ricerca…


Osservazioni

Mentre crei app adattive, tieni a mente i limiti delle classi di dimensioni: sono generalizzazioni , non guide specifiche per dimensioni o dispositivi di pixel esatti. Non tentare mai di determinare su quale dispositivo è in esecuzione la tua app o se è in modalità a schermo diviso, in base alle classi di dimensioni.

Invece, prendi decisioni di layout di alto livello sulla classe di dimensioni e usa Layout automatico per cambiare i fotogrammi di una vista precisa. (Vedi anche il metodo UIViewController viewWillTransition(to:with:) per una notifica più precisa di quanto grande sarà la vista di un controller dopo una transizione.)

Collezioni di tratti

In un'app iOS, l'interfaccia utente può assumere una delle diverse forme e dimensioni generali. Questi sono definiti utilizzando le classi di dimensioni , che sono disponibili attraverso una collezione di tratti di visualizzazione o vista del controllore.

Apple definisce due classi di dimensioni: regolari e compatte . Ciascuna di queste classi dimensionali è disponibile su entrambi gli assi del dispositivo ( orizzontale e verticale ). La tua app potrebbe esistere in questi quattro stati per tutta la sua durata. Come una scorciatoia, gli sviluppatori spesso descrivono una combinazione di classi di dimensioni dicendo o scrivendo le due classi di dimensioni, con l'asse orizzontale per primo: "Compatto / Regolare" descrive un'interfaccia che è orizzontale compatta ma verticale regolare.

Nella tua app, utilizza i metodi sul protocollo UITraitEnvironment per verificare la tua classe di dimensioni corrente e rispondere alle modifiche:

class MyViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Horizontal size class: \(traitCollection.horizontalSizeClass)")
        print("Vertical size class: \(traitCollection.verticalSizeClass)")
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print("Trait collection changed; size classes may be different.")
    }
}

Sia UIView che UIViewController sono conformi a UITraitEnvironment, quindi puoi guardare la tua attuale raccolta di tratti e gestire le modifiche in sottoclassi di entrambi.

Aggiornamento automatico del layout con le modifiche alle raccolte di tratti

Apportare un'app adattiva , ovvero rispondere alle modifiche delle classi di dimensioni modificando il layout, spesso richiede molto aiuto dal sistema di layout automatico. Uno dei modi principali in cui le app diventano adattive è l'aggiornamento dei vincoli del layout automatico attivo quando la classe di dimensioni di una vista cambia.

Ad esempio, considera un'app che utilizza UIStackView per organizzare due UILabels. Potremmo desiderare che queste etichette si sovrappongano l'una all'altra in ambienti orizzontali compatti, ma si siedono uno accanto all'altro quando abbiamo un po 'più di spazio in ambienti orizzontali regolari.

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
        }
    }
}

Supporto di iOS Multitasking su iPad

Un elemento chiave di adattamento in una moderna app iOS è il supporto del multitasking su iPad. Per impostazione predefinita, le app create in Xcode 7 e versioni successive saranno configurate per supportare il multitasking: avranno un file LaunchScreen.storyboard che utilizza Auto Layout.

Il modo più semplice per le app esistenti di optare per il multitasking è creare uno storyboard di questo tipo, quindi impostarlo come schermata di avvio del progetto:

Aggiungere uno storyboard della schermata di avvio

Configurazione dell'opzione File schermata di avvio

Una volta che l'app supporta il multitasking di iPad, controlla le viste esistenti e visualizza i controller per assicurarti che utilizzino il layout automatico e supportino una varietà di combinazioni di classi di dimensioni.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow