Sök…


Anmärkningar

Tänk på begränsningarna för storleksklasser när du bygger anpassningsbara appar: de är generaliseringar , inte specifika guider för exakta pixelstorlekar eller enheter. Försök aldrig bestämma vilken enhet din app kör på, eller om den är i delad skärmläge, baserat på storleksklasserna.

I stället fatta beslut på hög nivå om storleksklass och använd Auto Layout för att ändra exakta visningsramar. (Se även UIViewController- viewWillTransition(to:with:) för en mer exakt meddelande om hur stor kontrollerens vy blir efter en övergång.)

Träsamlingar

I en iOS-app kan ditt användargränssnitt ta en av några olika allmänna former och storlekar. Dessa definieras med hjälp av storleksklasser , som är tillgängliga via en vy eller visningskontrollers dragsamling .

Apple definierar två storleksklasser: vanligt och kompakt . Var och en av dessa storleksklasser finns på båda axlarna på enheten ( horisontellt och vertikalt ). Din app kan finnas i alla dessa fyra stater under hela sin livstid. Som en kortfattad beskrivning utvecklar ofta en kombination av storleksklass genom att säga eller skriva de två storleksklasserna, med den horisontella axeln först: "Compact / Regular" beskriver ett gränssnitt som är horisontellt kompakt men vertikalt regelbundet.

I din app använder du metoder i UITraitEnvelope-protokollet för att kontrollera din nuvarande storleksklass och svara på ändringar:

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.")
    }
}

Både UIView och UIViewController överensstämmer med UITraitEn miljö, så att du kan titta på din aktuella dragsamling och hantera förändringar i underklasser för endera.

Uppdatering av automatisk layout med ändringar av dragsamling

Att göra en app adaptiv - det vill säga att svara på ändringar i storleksklass genom att ändra din layout - innebär ofta mycket hjälp från Auto Layout-systemet. Ett av de huvudsakliga sätten som appar blir anpassningsbara är genom att uppdatera de aktiva Auto Layout-begränsningarna när visningens storleksklass ändras.

Tänk till exempel på en app som använder en UIStackView för att ordna två UIL-märken. Vi kanske vill att dessa etiketter ska staplas ovanpå varandra i horisontella kompakta miljöer, men sitter bredvid varandra när vi har lite mer utrymme i horisontella vanliga miljöer.

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

Stödjer iOS Multitasking på iPad

En viktig bit av anpassningsförmåga i en modern iOS-app stöder multitasking på iPad. Som standard kommer appar som skapats i Xcode 7 och nyare konfigureras för att stödja multitasking: de har en LaunchScreen.storyboard-fil som använder Auto Layout.

Det enklaste sättet för befintliga appar att välja multitasking är att skapa en sådan storyboard och sedan ange den som projektets startskärm:

Lägga till en storyboard med startskärmen

Konfigurera alternativet Starta skärmfil

När din app har stöd för iPad-multitasking, granskar du befintliga vyer och visningskontroller för att se till att de använder Auto Layout och kan stödja olika storleksklasskombinationer.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow