iphone - sizes - Controlador UIP adaptable basado en el tamaño de vista
pwa ios medium (3)
Me estoy mudando a las presentaciones basadas en UIPresentationController
para mis controladores de vista, pero me he topado con cierta confusión con la API.
Tengo una presentación personalizada del controlador de vista de estilo de barra lateral (similar al código de demostración LookInside
WWDC 2014).
Este grupo de clases ( UIPresentationController
, UIViewControllerTransitioningDelegate
y UIViewControllerAnimatedTransitioning
) presenta un controlador de vista como una barra lateral desde el borde de la pantalla en vistas de clase de tamaño regular, y presenta el mismo controlador de vista que la pantalla completa en vistas de clase de tamaño compacto.
Al probar esto en el objetivo del iPad de tamaño variable, se muestra el comportamiento correcto: configuro la clase de tamaño horizontal en "Compacto" y mi controlador de vista cambia de la barra lateral a la pantalla completa.
Sin embargo, quiero más granularidad. Me gustaría usar la presentación del controlador de vista de estilo de barra lateral en iPhone 6 y 6+ cuando el dispositivo esté en orientación horizontal, y usar la presentación de estilo de pantalla completa para todos los iPhones en orientación vertical.
Así que en mi método
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Implementé algo de lógica para detectar si la barra lateral ocupará demasiado espacio en la pantalla, digamos que uso la siguiente condición:
//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];
}
Sin embargo esto no hace nada. La documentación para UIPresentationController.overrideTraitCollection
indica:
Utilice esta propiedad para especificar cualquier característica que desee aplicar a los controladores de vista presentados y presentados. Los rasgos que especifique anulan cualquier carácter existente actualmente en vigor para los controladores de vista. El valor predeterminado de esta propiedad es nulo.
La asignación de un nuevo valor a esta propiedad hace que el controlador de presentación haga la transición al nuevo conjunto de rasgos, lo que podría generar animaciones en la interfaz presentada.
La asignación del nuevo valor al controlador de presentación no hace que mi interfaz presentada cambie de ninguna manera. (Incluso si asigno el overrideTraitCollection
cuando el UIPresentationController
se crea desde el objeto UIViewControllerTransitioningDelegate
).
¿Qué me estoy perdiendo? ¿Es posible realizar una presentación adaptativa con UIPresentationController
en un nivel más granular?
¿Es posible realizar una presentación adaptativa con
UIPresentationController
en un nivel más granular?
No es fácil.
Sugiero una de estas opciones:
Renuncie al control y acepte la capacidad de adaptación limitada de UIKit: puede cambiar a una presentación en pantalla completa o presentar un controlador de vista diferente para una colección de rasgos en particular. Vaya con esto para enviar su aplicación más rápido.
Usa presentaciones pero trabaja contra UIKit. Una forma es anular
viewWillTransitionToSize:withTransitionCoordinator:
y descartar y luego volver a presentar el controlador de vista presentado, realizando los cambios que desee, como proporcionar un estilo de presentación diferente o un controlador de presentación. Esto podría dar buenos resultados sin tomar demasiado tiempo.Utilice la contención del controlador de vista. Se trata del nivel más bajo al que puede ir mientras sigue las mejores prácticas de UIKit. Su controlador de vista principal se convierte en un elemento secundario de un controlador de vista de contenedor y, en lugar de presentar, le pide al contenedor que muestre el otro controlador de vista. Vaya con esto si la aplicación debe ser personalizada y exquisita, y puede pasar el tiempo para hacerlo de la manera correcta.
Me estaba topando con el mismo problema. Es posible interpretar la orientación del dispositivo a partir de las clases de tamaño, aunque no de forma totalmente inequívoca, pero lo siguiente funcionó para mis propósitos.
Desde Programación iOS 9: Sumérgete en las vistas, Controladores de vista y Frameworks , un excelente libro lleno de detalles importantes como este:
horizontalSizeClass
,verticalSizeClass
Un valor
UIUserInterfaceSizeClass
, ya sea.Regular
o.Compact
. Estas son llamadas clases de tamaño . Las clases de tamaño, en combinación, tienen los siguientes significados:Tanto las clases de tamaño vertical como horizontal son
.Regular
: nos estamos ejecutando en un iPadLa clase de tamaño vertical es
.Regular
, pero la clase de tamaño horizontal es.Compact
: Estamos funcionando en un iPhone con la aplicación en orientación vertical. (Como alternativa, podemos estar ejecutando en un iPad en una configuración multitarea de iPad de pantalla dividida; consulte el Capítulo 9).Tanto las clases de tamaño vertical como horizontal son
.Compact
: estamos ejecutando en un iPhone (excepto iPhone 6 plus) con la aplicación en orientación horizontal.La clase de tamaño vertical es
.Compact
y la clase de tamaño horizontal es.Regular
: nos estamos ejecutando en un iPhone 6 plus en orientación horizontal.
Por ejemplo, en el controlador de vista:
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
}
}
Utilizar:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3);
Se llama en rotación incluso si la clase de tamaño no ha cambiado, por lo que es un buen lugar para realizar adaptaciones específicas de idioma / orientación. Recuerda que el iPhone 6 puede funcionar en modo zoom.