16

Sto passando alle presentazioni basate su UIPresentationController per i miei controller di visualizzazione ma ho incontrato qualche confusione con l'API.Adaptive UIPresentationController basato sulla dimensione della vista

Ho una presentazione del controller della vista in stile barra laterale personalizzata (simile al codice demo LookInside WWDC 2014).

Questa classe di cluster (UIPresentationController, UIViewControllerTransitioningDelegate e UIViewControllerAnimatedTransitioning) presenta un controller vista come una barra laterale dal bordo dello schermo in vista regolari classi di dimensione, e presenta la stessa vista controllore come schermo sul visualizzazioni classe dimensioni compatte.

Il test su questo target iPad ridimensionabile mostra il comportamento corretto: ho impostato la classe di dimensione orizzontale su "Compatta" e il mio controller di visualizzazione passa da barra laterale a schermo intero.

Tuttavia, voglio più granularità. Vorrei utilizzare la presentazione del controller di visualizzazione in stile sidebar su iPhone 6 e 6+ quando il dispositivo è in orientamento orizzontale e utilizzare la presentazione in stile a schermo intero per tutti gli iPhone con orientamento verticale.

Così nel mio metodo

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

ho implementato una logica per rilevare se la barra laterale occuperà troppo dello schermo, diciamo che io uso la seguente condizione:

//If my sidebar is going to occupy more than half the new width of the view... 
if(self.sidebarTransitionController.width > size.width/2.0) 
{ 
    //Override the presentation controller's trait collection with Compact horizontal size class 
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 
} 
else 
{ 
    //Otherwise override the trait collection with Regular 
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]; 

} 

Tuttavia questo non fa Niente. La documentazione per gli stati UIPresentationController.overrideTraitCollection:

Utilizzare questa proprietà per specificare i tratti che si desidera applicare ai controller di vista presentati e presentati. I tratti specificati sostituiscono eventuali tratti esistenti attualmente in vigore per i controller della vista. Il valore predefinito di questa proprietà è nullo.

Assegnare un nuovo valore a questa proprietà fa sì che il controller di presentazione passi al nuovo set di tratti, il che potrebbe comportare animazioni all'interfaccia presentata.

Assegnare il nuovo valore al controller di presentazione non causa in alcun modo la modifica dell'interfaccia presentata. (Anche se assegno lo quando viene creato looggetto.)

Cosa mi manca? È possibile eseguire una presentazione adattiva con UIPresentationController a un livello più granulare?

risposta

1

È possibile eseguire una presentazione adattiva con UIPresentationController a un livello più granulare?

Non facilmente.

suggerisco una di queste opzioni:

  1. rinunciare a controllo e accettare limitata adattabilità del UIKit: è possibile modificare a una presentazione a schermo intero o presentare un controller di vista diverso per una particolare collezione caratteristica. Vai con questo per spedire la tua app più velocemente.

  2. Utilizzare presentazioni ma lavorare contro UIKit. Un modo è di ignorare viewWillTransitionToSize:withTransitionCoordinator: e chiudere e quindi presentare nuovamente il controller di visualizzazione presentato, apportando le modifiche desiderate, ad esempio fornendo uno stile di presentazione o un controller di presentazione diverso. Questo potrebbe dare risultati positivi senza prendere troppo tempo.

  3. Utilizzare il controllo del contenuto della vista. Si tratta del livello più basso che puoi seguire mentre ti attengono alle best practice di UIKit. Il controller della vista principale diventa figlio di un controller della vista del contenitore e invece di presentarti chiedi al contenitore di mostrare l'altro controller della vista. Vai con questo se l'app deve essere personalizzata e squisita, e puoi passare il tempo per farlo nel modo giusto.

1

Usa:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller 
                   traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3); 

Si chiama a rotazione, anche se la classe dimensionale non è cambiata così è un buon posto per fare si Idiom/orientamento adattamento specifico. Ricorda che iPhone 6 può essere eseguito in modalità zoomata.

0

Ero in esecuzione lo stesso problema. È possibile interpretare l'orientamento del dispositivo dalle classi di dimensioni, anche se non completamente senza ambiguità, ma i seguenti hanno funzionato per i miei scopi.

Da Programming iOS 9: Dive Deep into Views, View Controllers and Frameworks, un ottimo libro pieno di dettagli importanti come questo:

horizontalSizeClass, verticalSizeClass

Un UIUserInterfaceSizeClass valore, sia .Regular o .Compact. Queste sono chiamate classi di dimensioni . Le classi di ampiezza, in combinazione, hanno il seguente significato:

Entrambe le classi di dimensione verticale e orizzontale sono .Regular: Siamo in esecuzione su un iPad

La classe dimensione verticale è .Regular, ma l'orizzontale la classe di dimensioni è .Compact: Stiamo girando su un iPhone con l'app in orientamento verticale. (In alternativa, potremmo essere in esecuzione su un iPad in una configurazione multitasking per iPad splitscreen, vedere il Capitolo 9).

Entrambe le classi di dimensioni verticale e orizzontale sono .Compact: Siamo in esecuzione su un iPhone (tranne iPhone 6 plus) con l'app in orientamento orizzontale.

La classe di dimensione verticale è .Compact e la classe di dimensione orizzontale è .Regular: Stiamo utilizzando un iPhone 6 plus con orientamento orizzontale.

ad es. nel View Controller:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowComposeView" { 
     segue.destinationViewController.presentationController!.delegate = self 
     segue.destinationViewController.modalPresentationStyle = .PageSheet 
    } 
} 

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    // If we do an adaptive presentation, and adapt from Page Sheet to Form Sheet, 
    // then on iPhone 6 we will get the nice rounded corners of the nav bar 
    // in both portrait and landscape. (From pg. 298 of Programming iOS 9) 

    // We want this behaviour on iPhone in Portrait orientation only. 
    if traitCollection.horizontalSizeClass == .Compact && traitCollection.verticalSizeClass == .Regular { 
     return .FormSheet 
    } 
    else { 
     return .PageSheet 
    } 
} 
Problemi correlati