parental - restricciones ios 12




Hoy Altura de extensión para iPad mucho más grande que la especificada (2)

Mi extensión Today debe tener una altura dinámica basada en el contenido que muestra el widget. Pude lograr esto agregando una restricción en mi elemento más inferior: la parte superior de la guía de diseño inferior es menor o igual que la parte inferior del elemento más inferior, con una constante de 0, prioridad 999, multiplicador 1.

Esto funciona exactamente como se esperaba en los iPhones: la altura del widget se ajusta a todo el contenido y el margen inferior predeterminado se aplica antes de mostrar el siguiente widget.

Pero en el iPad parece que la altura de mi widget es igual a la altura máxima. El Centro de notificaciones permitirá que exista un widget; hay mucho espacio debajo de mi widget, es casi a pantalla completa.

¿Cómo puedo eliminar ese espacio extra?

Sé exactamente cuál es el problema, pero no estoy seguro de cómo resolverlo; consulte la sección "El problema". Primero déjame explicarte la configuración:

La puesta en marcha:
Configuré la vista de esta extensión en un guión gráfico, no se hace nada mediante programación. La vista consta de 5 elementos apilados verticalmente y algunos otros horizontalmente. Estas son las restricciones de diseño automático para esa línea vertical de arriba a abajo, donde la prioridad no establecida es 1000, multiplicador 1:

UILabel: height = 35, top space to top layout guide with constant of 10
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999

El comportamiento necesario:

  • Necesito una cuadrícula de botones 4x4 ubicados debajo de una sola etiqueta de ancho completo
  • Cada botón debe tener exactamente el mismo ancho y alto: todos los cuadrados perfectos
  • No hay espacio adicional debajo de la última fila de botones

El resultado:

El resultado esperado:

El problema:
Las restricciones de relación de aspecto en todos los botones terminan imponiendo indirectamente una restricción de relación de aspecto 'implícita' en la altura de la vista del widget cuando se envía systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority: donde se ha pasado el ancho necesario (724) para el diseño en la prioridad requerida y una altura de 0 (para comprimir la vista) en la prioridad de nivel de ajuste. Esto da como resultado una vista de widget alta en iPad donde la vista es más amplia para empezar. Pero no existe una restricción de relación de aspecto real que pueda eliminarse. Esencialmente, debido a que he aplicado restricciones de relación de aspecto a todos los botones, la altura de la extensión actual depende de su ancho (considerando todas las restricciones juntas, la relación de aspecto y otros). Por lo tanto, la altura de la extensión es desgarbada en un área amplia, manifestándose en un dispositivo ancho como el iPad. Las restricciones en los botones deben reconsiderarse o ajustarse de alguna manera.

El proyecto de muestra:
CloudApp tiene disponible un proyecto de muestra que demuestra el problema para que pueda descargarlo y jugar con él.

Lo que he probado:
Intenté eliminar las inserciones de margen predeterminadas anulando widgetMarginInsetsForProposedMarginInsets y devolviendo 0 para la parte inferior. Esto eliminó el relleno predeterminado, por lo tanto, disminuyó un poco la altura, pero todavía hay mucho espacio adicional debajo.

El UILabel tenía una restricción: el encabezado de la etiqueta igual al encabezado de la supervista: constante 0, prioridad 1000, multiplicador 1. Si simplemente cambio eso al margen inicial de la supervista, el espacio inferior extra desaparece mágicamente. Me preguntaba si era porque los elementos se estaban volviendo demasiado grandes, por lo que aumentar la cantidad de espacio restante disminuiría su tamaño, pero traté de mantenerlo en la posición inicial normal y aumentar la constante y eso no resolvió el problema. Pero esto solo resuelve el problema para iPad en vertical. Y ni siquiera lo resuelve por completo, cada vez que abres el Centro de notificaciones, comienza a una gran altura y luego se reduce al tamaño adecuado. En el paisaje, nunca se reduce al tamaño adecuado.

Soluciones Intentadas:

  • @Lefteris propuso codificar el tamaño, lo que no funcionará en este caso ya que la altura es dinámica y el widget está disponible para muchos tamaños / orientaciones de pantalla.
  • @Yuyutsu intentó resolverlo, pero desafortunadamente no cumple con los requisitos y presenta restricciones conflictivas y un diseño modificado.

Estaba enfrentando el mismo problema. ¿Ha agregado la restricción de relleno inferior como se muestra en la imagen?

Eso funcionó para mí. Espero que ayude


Tuve que codificar el valor del widget en el método delegado viewDidLoad para solucionar esto:

import UIKit
import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.preferredContentSize = CGSize(width: 0, height: 320)
    }

}




ios8-today-widget