it-swarm.com.de

iPad Landscape und Portrait verschiedene Layouts mit Größenklasse

So gestalten Sie iPad-Querformat- und Hochformatbildschirme mit unterschiedlichen Layouts unter Verwendung der Größenklasse . Ich konnte für beide Ausrichtungen nur w-regular und h-regular finden. Beispiel: Ich muss zwei Ansichten vertikal im Hochformat und horizontal im Querformat mit der Größenklasse ausrichten

24

Endlich habe ich eine Lösung gefunden: 

if traitCollection.verticalSizeClass == .Regular && traitCollection.horizontalSizeClass == .Regular {

     var orientation:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation;
     if orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight {
            // orientation is landscape


     }  else {
            // orientation is portrait

     }
}
6
cmii

Es scheint Apples Absicht zu sein, beide iPad-Orientierungen als gleich zu behandeln - aber wie einige von uns feststellen, gibt es recht legitime Designgründe, um das UI-Layout für iPad Portrait vs. iPad Landscape variieren zu wollen.

In dieser Antwort finden Sie jedoch einen weiteren Ansatz zum Anpassen von Größenklassen, um das zu tun, was wir brauchen: https://stackoverflow.com/a/28268200/4517929

6
RonDiamond

Für Swift 3 würde es so aussehen:

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UI_USER_INTERFACE_IDIOM() == .pad &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }

    return super.overrideTraitCollection(forChildViewController: childViewController)
}

Es verwendet wRhC anstelle von wRhR für iPad-Geräte im Querformat ..__ Setzen Sie diesen Code in Ihren Basis-View-Controller, dh diese Regel gilt für alle Controller, die von diesem Controller präsentiert wurdenSie können hier zusätzliche Bedingungen angeben ... Wenn Sie möchten, dass diese Regel nur für bestimmte View-Controller gilt, würde Ihr if -Operator so aussehen:

    if UI_USER_INTERFACE_IDIOM() == .pad &&
        childViewController is YourSpecificViewController &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }
5
Oleg

Swift 4

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
        return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
    }
    return super.overrideTraitCollection(forChildViewController: childViewController)
}

Ich möchte gerne eine benutzerdefinierte Unterklasse von navigationController erstellen und dann den ursprünglichen Navigations-Controller für Storyboards auf diese Klasse festlegen. Sie können auch etwas mit a ViewController machen.

Beispiel:

import UIKit

class NavigationControllerWithTraitOverride: UINavigationController {

    // If you make a navigationController a member of this class the descendentVCs of that navigationController will have their trait collection overridden with compact vertical size class if the user is on an iPad and the device is horizontal.

    override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
        if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
            return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
        }
        return super.overrideTraitCollection(forChildViewController: childViewController)
    }
}

Hinweis: Sie sollten traitCollection nicht wie in docs überschreiben. 

Wichtig

Verwenden Sie die traitCollection-Eigenschaft direkt. Überschreiben Sie es nicht. Stellen Sie keine benutzerdefinierte Implementierung bereit.

0
DoesData