2015-05-21 22 views
24

Desidero presentare sempre un ViewController in un popover su tutti i dispositivi e tutti gli orientamenti. Ho provato a realizzare questo adottando il UIPopoverPresentationControllerDelegate e impostando il sourceView e sourceRect.UIModalPresentationPopover per iPhone 6 Plus in landscape non mostra popover

Questo funziona molto bene per tutti i dispositivi e gli orientamenti, ad eccezione dell'iPhone 6 Plus in orizzontale. In tal caso, il controller della vista scorre dalla parte inferiore dello schermo in una scheda. Come posso prevenirlo in modo che appaia sempre in un 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 } 

Tutti i dispositivi sono sotto iOS 8.2 o superiore

risposta

57

Implementare il nuovo metodo adaptivePresentationStyleForPresentationController:traitCollection: di 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 dice il controller presentazione di utilizzare la Prese originale stile di navigazione che nel tuo caso visualizzerà un popover.

+1

Chiamata buona! Ho dimenticato che il metodo delegate è cambiato per 8.3. –

+1

@PetahChristian Grazie! Sì, è stato un cambiamento abbastanza tranquillo e non sembra essere documentato se non nelle diff API. – Joshua

+0

@Joshua SÌ! Ho implementato - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController *) controller { return UIModalPresentationNone; } ma la nuova API risolve il mio problema, grazie signore! – Loegic

1

Apple ha progettato la presentazione iPhone 6 Plus a comportarsi in quel modo, in base alla sua classe dimensionale.

Per impedire la presentazione modale su iPhone 6 Plus, sarà necessario sostituire la raccolta tratti (dimensione orizzontale).

Si dovrebbe essere in grado di impostare la proprietà overrideTraitCollection per il controller di presentazione: (!. Ci scusiamo per l'Objective C non ho imparato Swift ancora)

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

+0

Mi dispiace, ma non ha funzionato per me, io non sono in grado di ignorare il traitCollection , il popover "mean to be" è ancora presentato come foglio di pagina su iPhone 6 più paesaggistico solo – Loegic

+0

Mentre incuriosito, non ho il tempo questa mattina per indagare su questo. Posso offrire una taglia sulla domanda per attirare l'attenzione su di essa. :) –

+0

L'ho visto, grazie :) L'override di TraitCollection sembrava essere una grande idea, ma sembra essere ignorata. – Loegic

2

In Swift 3, se implementato il metodo originale adaptivePresentationStyle, semplicemente aggiungendo questo codice funziona:

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