2016-06-21 19 views
1

Ich verwende einen UISplitViewController in meiner App. Dies funktioniert gut auf dem iPad, wo primäre und sekundäre sind immer sichtbar, und es funktioniert gut auf den meisten iPhones, wo es wie ein UINavigationController funktioniert.UISplitViewController - verhindern das Aufteilen in Landschaft auf iPhone 6 plus

Auf iPhone 6+ und 6S + verhält sich die Split-Ansicht wie ein iPhone im Hochformat und wie ein iPad in Querformat. Diese Spaltung in der Landschaft verursacht mir Probleme und ich möchte sie vermeiden.

Gibt es eine Möglichkeit zu verhindern, dass der UISplitViewController primäre und sekundäre Controller in der iPhone 6+ Landschaft anzeigt? Ich möchte nur, dass es den sekundären Controller anzeigt, genauso wie bei anderen iPhones.

Danke.

Antwort

1

Ich konnte dies tun, indem ich den UISplitViewController ableiten und dann die Merkmalssammlung überschreiben, um eine kompakte horizontale Größenklasse zurückzugeben, wenn das Gerät kein iPad ist. Ich weiß, dass das Überprüfen des Interface-Idioms heutzutage ein Faux-Pas ist, aber ich wusste nicht, wie ich das sonst machen sollte.

Ich habe einfach diese Methode, um meine UISplitViewController Unterklasse:

-(UITraitCollection *)traitCollection { 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     return [super traitCollection]; 
    } else { 
     return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 
    } 
} 

Irgendwelche Vorschläge für einen besseren Weg, dies begrüßen zu tun sicher.

+0

Was ist swift gleichwertige Methode dafür? Ich konnte nur 'overrideTraitCollectionForChildViewController' finden – nravichan

+0

Scheint wie eine skizzenhafte Lösung. Es überschreibt eine erforderliche Eigenschaft, die im UITraitEnvironment-Protokoll deklariert wurde und von UIViewController implementiert wird. Es überschreibt im Grunde die "Getter" -Methode für die Eigenschaft traitCollection. Nicht sicher, wie du das in Swift machst. – TylerJames

+0

Ich habe versucht, es zu überschreiben und schien nicht zu funktionieren. – nravichan

0

Hier ist die gleiche Antwort in Swift, sondern auch mit einem Fix, wo die vertikalen Größenklasse am Telefon in der Landschaft falsch wäre:

override var traitCollection: UITraitCollection { 
    if UI_USER_INTERFACE_IDIOM() == .pad { 
      return super.traitCollection 
    } else { 
     let horizontal = UITraitCollection(horizontalSizeClass: .compact) 
     let vertical = UITraitCollection(verticalSizeClass: super.traitCollection.verticalSizeClass) 
     return UITraitCollection.init(traitsFrom: [horizontal, vertical]) 
    } 
}