widgets reloj poner pantalla como calendario bloqueo bateria aparece agregar ios objective-c swift ios10 today-extension

reloj - ¿Cuál es la altura del nuevo widget/extensión de iOS 10 Today?



widgets iphone 6 (3)

Estoy creando un widget de iOS Today, y mientras probaba para iOS 10, noté que ahora todos los widgets tienen la misma altura (las versiones anteriores permitían que el desarrollador estableciera la altura). ¿Cuál es la altura ideal / cuál es la mejor práctica para lidiar con esta nueva limitación? Estoy en rápido y no usé autolayout fyi. ¡Gracias por adelantado!


El widget en iOS 10 se ha cambiado como lo has notado y ahora tiene una altura fija. También se han agregado nuevas características a la extensión de hoy. NCWidgetDisplayMode de ellos es el NCWidgetDisplayMode . Básicamente tienes un botón arriba en la esquina derecha donde puedes "Mostrar más" o "Mostrar menos".

Comience agregando lo siguiente a su viewDidLoad()

self.preferredContentSize = CGSize(width: 0, height: 200) if #available(iOSApplicationExtension 10.0, *) { self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded } else { // Fallback on earlier versions }

Lo que necesitas hacer es agregar básicamente el siguiente método:

Versión rápida:

@available(iOSApplicationExtension 10.0, *) func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) { if activeDisplayMode == NCWidgetDisplayMode.Compact { self.preferredContentSize = CGSizeMake(0.0, 200.0) } else if activeDisplayMode == NCWidgetDisplayMode.Expanded { self.preferredContentSize = desiredSize } }

Versión Objective-C:

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{ if (activeDisplayMode == NCWidgetDisplayModeCompact){ self.preferredContentSize = CGSizeMake(0.0, 200.0); } else if (activeDisplayMode == NCWidgetDisplayModeExpanded){ self.preferredContentSize = desiredSize; } }

Tenga en cuenta dos cosas aquí:

Xcode sugerirá automáticamente que agregue el cheque disponible para la versión de iOS (para Swift al menos). Por lo tanto, no elimine la forma antigua de hacerlo self.preferredContentSize = CGSizeMake... Esto todavía es necesario para versiones anteriores de iOS.

En la función activeDisplayMode == NCWidgetDisplayMode.Compact se llamará cuando pase de "Mostrar más"> "Mostrar menos". Esto se debe a que se dispara inmediatamente desde el sistema iOS. Y se activeDisplayMode == NCWidgetDisplayMode.Expanded cuando activeDisplayMode == NCWidgetDisplayMode.Expanded de "Mostrar menos"> "Mostrar más".

Y una última cosa, este es un tipo de buggy aún con los botones "Mostrar más" y "Mostrar menos" y aún no está arreglado por Apple. Verifique la demostración de Apples Keynote y notará que tuvo un problema de error con esto.


En iOS 10, de forma predeterminada, la altura del widget de hoy es fija. Por otra parte, la altura mínima del widget contraído es limitada.

Un widget colapsado es la altura de aproximadamente dos filas y media de tablas. Un widget expandido es idealmente no más alto que la altura de la pantalla.

Estas notas son de las pautas de interfaz humana de iOS .

Podemos hacer lo siguiente para cambiarlo.

En primer lugar, debe agregar estos códigos en su viewDidLoad , esto hace que su widget admita dos modos que son nuevos en iOS 10.

Versión rápida:

if #available(iOSApplicationExtension 10.0, *) { // Xcode would suggest you implement this. extensionContext?.widgetLargestAvailableDisplayMode = .expanded } else { // Fallback on earlier versions }

Versión ObjC:

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

Y luego implementar el método de protocolo como:

Versión rápida:

@available(iOSApplicationExtension 10.0, *) func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) { if activeDisplayMode == .expanded { preferredContentSize = CGSize(width: 0.0, height: 200.0) } else if activeDisplayMode == .compact { preferredContentSize = maxSize } }

Versión ObjC:

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == NCWidgetDisplayModeExpanded) { self.preferredContentSize = CGSizeMake(0.0, 200.0); } else if (activeDisplayMode == NCWidgetDisplayModeCompact) { self.preferredContentSize = maxSize; } }

Ejecuta tu objetivo, verás un botón "Mostrar más" en la esquina derecha de tu widget. Tócalo y verás el cambio.

Ver más detalles: ¿Cómo cambiar el tamaño de la altura del widget en iOS 10?


Simplemente haga lo siguiente:

let height = extensionContext?.widgetMaximumSize(for: .compact).height

puede utilizar ambos .compact : .compact y .expanded .