¿Cómo configurar la altura de una extensión de Widget de hoy?

¿Cómo puedo cambiar la altura de la Extensión de hoy de mi aplicación en el Centro de notifications?

Lo probé con el Interface Builder y con Code, el Interface Builder muestra la vista con altura 600, pero no aplica esta altura en el dispositivo.

Parece que no puedo hacerlo más grande que unos 80 píxeles …

introduzca la descripción de la imagen aquí

En su widget UIViewController.m (Objective-C):

 self.prefernetworkingContentSize = CGSizeMake(0, 200); 

Hará que su widget tenga una altura de 200.

Tenga en count que el ancho no tendrá efecto en la vista, ya que los widgets deben caber en el ancho exacto del centro de notifications, que se maneja automáticamente.

Además, si desea animar cambios en el alto de su vista, puede implementar (Objective-C):

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

en su controller de vista usando animateAlongsideTransition:completion:

La respuesta estaba un poco escondida; tuvo que hacer clic en la barra lateral de la documentation para encontrar finalmente este fantástico documento .


Otra forma es usar restricciones de layout automático para restringir la altura de su vista.

Los widgets tienen sus alturas ajustados por el sistema. Si ha definido su altura usando restricciones, esto se ajustará automáticamente según sea necesario. Si está utilizando un layout explícito, puede solicitar una nueva altura modificando el contenido prefernetworkingContentSize de su widget.

Tenga en count que no tiene un centro de notificación de garantías que respete su request de altura: puede ajustarse automáticamente, puede ajustarse pero no a la altura exacta que desee o puede no cumplirse.

La mejor manera de desarrollar un widget es usar restricciones de layout automático para establecer sus valores de altura, de esa manera su widget se adaptará a diferentes alturas con facilidad.

Como la altura de la extensión de iOS 10 es de 110 píxeles. Debería utilizar el nuevo método de método widgetActiveDisplayModeDidChange:withMaximumSize: para ampliar el tamaño de la extensión (Objective-C):

 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == NCWidgetDisplayModeExpanded) { self.prefernetworkingContentSize = CGSizeMake(maxSize.width, 600.0); } else if (activeDisplayMode == NCWidgetDisplayModeCompact) { self.prefernetworkingContentSize = maxSize; } } 

También es posible que deba llamar a setWidgetLargestAvailableDisplayMode: en el context de su extensión en la actualidad, ver el método viewDidLoad del controller como este (Objective-C):

 if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+ [self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded]; } else { self.prefernetworkingContentSize = CGSizeMake(0, 600.0); // iOS 10- } 

Este hilo puede ser útil https://forums.developer.apple.com/thread/48930

La mejor forma es, por supuesto, Autolayout pero, por defecto, hay márgenes que puedes controlar así

 func widgetMarginInsetsForProposedMarginInsets (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) { return UIEdgeInsetsZero } 

Hay dos maneras de mostrar la extensión Hoy:

  1. Modo compacto (altura fija para Widget)
  2. Expand Mode (Altura variable para Widget)

Cualquier código que hagas para cambiar la altura de la extensión en modo Compacto no hará ninguna diferencia. Por lo que necesita cambiar el modo de modo compacto a expandir.

 // 1. Load This in viewDidLoad: override func viewDidLoad() { super.viewDidLoad() self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded } // 2. Implement another widget protocol func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){ if (activeDisplayMode == NCWidgetDisplayMode.compact) { self.prefernetworkingContentSize = maxSize; } else { self.prefernetworkingContentSize = CGSize(width: 0, height: 200); } } 

Puede consultar WWDC para get más actualizaciones sobre las extensiones de la aplicación.

Hoy widget pnetworkingeterminado UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (top = 0, izquierda = 44, bottom = 39, derecha = 0)

Debe agregar este método

 - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0); return edgeInsets;}