swift navbar ios-app-extension imessage ios10

swift - Extensión de la aplicación iOS 10 iMessage: cómo calculo la altura de la barra de navegación extra alta



navbar ios-app-extension (8)

Descargué el Xcode 8 beta y estaba intentando jugar con la extensión de la aplicación iMessages sdk, pero tuve un problema con su altura de barra de navegación aparentemente no estándar

cuando paso a la vista expandida de la aplicación, mi imagen con el siguiente marco CGRect(x: 0, y: 0, width: 100, height: 100) termina parcialmente oculta detrás de la barra de navegación. Me gustaría que aparezca debajo de la barra de navegación.

probé self.navigationController?.navigationBar.isTranslucent = false pero no funcionó, lo que creo que tiene sentido ya que está fuera del alcance de mi aplicación para controlar.

¿Alguien ha jugado con esto todavía? Quiero evitar 2 cosas. simplemente adivinando la altura adecuada y alejándose de una solución programática. gracias por la ayuda


A partir de ahora con Xcode 8.2, ninguna de las soluciones anteriores funciona para mí. La respuesta de @Dilts solo funciona para MessageViewController , que se hereda de MSMessagesAppViewController . Pero cuando intentamos hacer lo mismo con nuestro ViewController, que heredamos de UIViewController , esto no funcionará.

Lo he hecho vinculando la restricción superior con respecto a la vista en lugar de la guía de diseño superior. Puse la restricción superior a cero con respecto a la vista y la vinculo como topLayout.

@IBOutlet weak var topLayout: NSLayoutConstraint!

Y luego cambie el valor de la restricción programáticamente al cambiar el estilo de presentación.

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) { // Called before the extension transitions to a new presentation style. if presentationStyle == .compact{ mediaViewController?.topLayout.constant = 0.0 }else{ mediaViewController?.topLayout.constant = 86.0 } }

Modo compacto

Modo expandido


Esta es la respuesta aceptada en Objective-C.

[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;


Para responder a su pregunta: "¿cuál es la altura de la barra de navegación extra alta":

Es 86px.

ACTUALIZAR

Acerca de la barra de navegación que oculta su interfaz de usuario. Hice una demo rápida y no tuve problemas.

Agregué un par de etiquetas en la parte superior de la vista (justo debajo de la barra de estado, en el valor de punto y 20). A continuación, agregué 2 restricciones: Espacio inicial y Espacio superior para la etiqueta izquierda y Espacio final y Espacio superior para la etiqueta derecha.

Este fue mi resultado, tanto en modo compacto como también expandido. Así que solo asegúrate de poner tus componentes por debajo del valor de punto y 20 y de tener algunas restricciones, ¡de esa manera Apple le dará el tamaño de la vista!


Puede obtener la altura de la guía de diseño del controlador:

self.topLayoutGuide.length

La razón por la que funciona la demostración de @Dilts es porque las etiquetas de arriba están limitadas a la guía de diseño superior. Si están limitados a la supervisión, entonces también irá detrás de la barra.


Puede ser útil tener una restricción con la guía de diseño superior, como por ejemplo:

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true


Si establece la guía de diseño superior como la restricción superior, funciona para MSMessagesAppViewController. Pero no funcionará en UIViewControllers, porque las guías de diseño son diferentes.

A menos que realmente necesite usar una clase UIViewController por algún motivo (por ejemplo, MessagesAppViewControllers tiene problemas para contener el código Obj C ++), siga con MSMessagesAppViewController.


Si usted es como yo y aún encuentra difícil el Auto Layout , puede usar el método viewDidLayoutSubviews para ajustar automáticamente el tamaño de la vista. Tengo una vista de tabla con el mismo problema que usted, por lo que utilicé este método simple para cambiar el contenido del lado superior de la vista de tabla:

-(void)viewDidLayoutSubviews { [self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)]; }

Hasta ahora funciona bien (tanto en retrato como en paisaje) en todos los iDevices.


[self.view addConstraints: [NSArray arrayWithObjects: [NSLayoutConstraint constraintWithItem:YourViewHere attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0], [NSLayoutConstraint constraintWithItem:YourViewHere attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.bottomLayoutGuide attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0], [NSLayoutConstraint constraintWithItem:YourViewHere attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:[self view] attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0], [NSLayoutConstraint constraintWithItem:YourViewHere attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:[self view] attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0], nil]];