2015-05-21 7 views
24

Ich möchte immer ein ViewController in einem Popover auf allen Geräten und allen Ausrichtungen präsentieren. Ich habe versucht, dies zu erreichen, indem ich die UIPopoverPresentationControllerDelegate angenommen habe und die sourceView und sourceRect gesetzt habe.UIModalPresentationPover für iPhone 6 Plus im Querformat zeigt Popover nicht an

Dies funktioniert sehr gut für alle Geräte und Ausrichtungen, außer dem iPhone 6 Plus in Landschaft. In diesem Fall fährt der View-Controller in einem Formular vom unteren Bildschirmrand nach oben. Wie kann ich das verhindern, damit es immer in einem Popover erscheint?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
let popoverPresentationController = segue.destinationViewController.popoverPresentationController 
popoverPresentationController?.delegate = self 
popoverPresentationController?.sourceView = self.titleLabel!.superview 
popoverPresentationController?.sourceRect = self.titleLabel!.frame } 

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
return UIModalPresentationStyle.None } 

Alle Geräte sind unter iOS 8.2 oder höher

Antwort

57

Umsetzung der neuen Methode adaptivePresentationStyleForPresentationController:traitCollection: von UIAdaptivePresentationControllerDelegate:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { 
    // This method is called in iOS 8.3 or later regardless of trait collection, in which case use the original presentation style (UIModalPresentationNone signals no adaptation) 
    return UIModalPresentationNone; 
} 

UIModalPresentationNone erzählt die Präsentation Controller die ursprüngliche Prese zu verwenden Stil, der in Ihrem Fall ein Popover anzeigt.

+1

Guter Anruf! Ich habe vergessen, dass die Delegate-Methode für 8.3 geändert wurde. –

+1

@PetahChristian Danke! Yeah war eine ziemlich stille Änderung und scheint nur in den API-Diffs dokumentiert zu sein. – Joshua

+0

@Joshua JA! Ich habe implementiert - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController *) Controller { Rückgabe UIModalPresentationNone; } aber die neue API lösen mein Problem, danke Sir! – Loegic

1

Apple das iPhone 6 Plus Präsentation gestaltet, dass Art und Weise auf der Grundlage seiner Größenklasse verhalten.

Um die modale Darstellung auf dem iPhone 6 Plus zu verhindern, müssen Sie die Merkmalssammlung (horizontale Größe) überschreiben.

Sie sollten die overrideTraitCollection Eigenschaft für die Präsentation Controller festlegen, um: (!. Sorry für die Objective C Ich habe noch nicht gelernt Swift)

presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 

+0

Es tut mir leid, aber es hat nicht für mich arbeiten, ich bin nicht in der Lage, die traitCollection außer Kraft zu setzen , das "gemein sein" Popover wird immer noch als Seite Blatt auf dem iPhone 6 plus nur landschaftlich präsentiert – Loegic

+0

Während intrigiert, habe ich nicht die Zeit heute Morgen, dies zu untersuchen. Ich kann ein Kopfgeld auf die Frage anbieten, um darauf aufmerksam zu machen. :) –

+0

Ich sah es, danke :) Die TraitCollection Override schien eine gute Idee zu sein, aber es scheint ignoriert zu werden. – Loegic

2

In Swift 3, wenn Sie die ursprüngliche adaptivePresentationStyle Methode implementiert, einfach das Hinzufügen dieser Code funktioniert:

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return adaptivePresentationStyle(for: controller) 
} 
Verwandte Themen