2015-05-21 11 views
24

Chcę zawsze prezentować ViewController w popover na wszystkich urządzeniach i we wszystkich orientacjach. Próbowałem to osiągnąć, przyjmując UIPopoverPresentationControllerDelegate i ustawiając sourceView i .UIModalPresentationPopover dla iPhone 6 Plus w krajobrazie nie wyświetla popover

Działa to bardzo dobrze dla wszystkich urządzeń i orientacji, z wyjątkiem telefonu iPhone 6 Plus w orientacji poziomej. W takim przypadku kontroler widoku przesuwa się z dołu ekranu w arkuszu formularza. Jak mogę temu zapobiec, aby zawsze pojawiała się w popover?

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 } 

Wszystkie urządzenia są pod iOS 8.2 lub wyższa

Odpowiedz

57

Wdrożenie nowej metody adaptivePresentationStyleForPresentationController:traitCollection: z 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 mówi kontroler prezentacji korzystania z oryginalnego Prese styl, który w twoim przypadku wyświetli popover.

+1

Dobre połączenie! Zapomniałem, że metoda delegatów została zmieniona na 8.3. –

+1

@PetahChristian Thanks! Taka była dość cicha zmiana i nie wydaje się być udokumentowana inaczej niż w różnicach API. – Joshua

+0

@Joshua TAK! I nie realizacji - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController (UIPresentationController *) kontroler { powrotu UIModalPresentationNone; } ale nowe API rozwiązuje mój problem, dziękuję, proszę pana! – Loegic

1

Jabłko zaprojektowany prezentacji iPhone 6 Plus zachowywać się w ten sposób, w oparciu o jego klasie wielkości.

Aby uniemożliwić prezentację modalną na telefonie iPhone 6 Plus, należy przesłonić kolekcję cech (rozmiar poziomy).

powinien być w stanie ustawić właściwość dla sterownika prezentacji overrideTraitCollection: (!. Przepraszamy za Objective C nie nauczyli Swift jeszcze)

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

+0

Przykro mi, ale to nie dla mnie, nie jestem w stanie przesłonić traitCollection , "Poprostu być" popis nadal jest prezentowany jako arkusz strony na iPhone 6 plus tylko krajobrazowy – Loegic

+0

. Intryguje mnie, że nie mam czasu, aby to zbadać. Mogę zaoferować nagrodę za to pytanie, aby zwrócić na to uwagę. :) –

+0

Widziałem to, dziękuję :) Nadpisanie cechy TraitCollection wydawało się świetnym pomysłem, ale wydaje się być ignorowane. – Loegic

2

w Swift 3, jeśli realizowany oryginalny adaptivePresentationStyle metody, po prostu dodając ten kod działa:

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return adaptivePresentationStyle(for: controller) 
} 
Powiązane problemy