parental - Altura de iOS8 Today La extensión que usa solo diseño automático da restricciones rotas
restricciones ios 12 (3)
La documentación de Apple sugiere establecer el alto de las extensiones de hoy usando el diseño automático.
Si un widget tiene contenido adicional para mostrar, puede confiar en las restricciones de Diseño automático para ajustar la altura del widget según corresponda. Si no usa Diseño automático, puede usar la propiedad UIViewController preferredContentSize para especificar la nueva altura del widget.
Sin embargo, cada ejemplo y tutorial que he visto termina usando preferredContentSize
.
Todos mis intentos de establecer la altura mediante el autodesarme conducen a advertencias de restricciones rotas.
Ajuste de altura a través del ajuste automático
Empecé con una nueva plantilla de xcode y una nueva plantilla de extensión para hoy. Lo único que agregué al TodayViewController.m
fue:
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
return UIEdgeInsetsMake(0, 0, 0, 0);
}
Nota: Todavía tengo este problema si solo uso los márgenes predeterminados.
Restringí la altura de la etiqueta, centré la etiqueta en el contenedor y restringí la altura del contenedor para que fuera la misma que la altura de la etiqueta:
Esto debería conducir a una etiqueta que llena el contenedor a la altura especificada sin conflictos de restricciones. En cambio, tengo un conflicto de restricciones:
2014-09-28 10:27:39.254 TodayExtension[61090:2672196] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don''t want. Try this: (1) look at each constraint and try to figure out which you don''t expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you''re seeing NSAutoresizingMaskLayoutConstraints that you don''t understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0''Hello World''(124)]>",
"<NSLayoutConstraint:0x7f8b8b583020 UIView:0x7f8b8b62d6e0.height == UILabel:0x7f8b8b62d9b0''Hello World''.height>",
"<NSLayoutConstraint:0x7f8b8b5888a0 ''UIView-Encapsulated-Layout-Height'' V:[UIView:0x7f8b8b62d6e0(667)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0''Hello World''(124)]>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
La forma en que rompe las restricciones, en realidad termina pareciéndome a lo que quiero:
Sin embargo, en otros proyectos, decide romper otras restricciones y no parece correcto. Además, nota lateral: si trato de cambiar la prioridad de la restricción de altura, se bloquea Xcode. Entonces eso es divertido
Altura no restrictiva
Tenía la esperanza de que, dado que restringir la altura no funcionaba, tal vez si no restringía la altura del contenedor a las subvistas, tal vez se calcularía la altura requerida para alojar las subvistas y establecerse correctamente.
Centré la subvista y restringí su altura:
Esto acaba de conducir a una extensión que utiliza la altura completa del centro de notificaciones, y mi vista de tamaño correcto centrada verticalmente:
Si no centro, sino que corrijo el espacio vertical con la guía de diseño superior, obtengo lo mismo, excepto que la subvista se fija en la parte superior (pero el contenedor sigue siendo enorme).
¿Lo que da?
Sé que podría usar preferredContentSize
, pero ¿por qué Apple dice que se puede configurar usando restricciones de diseño automático? ¿Qué estoy haciendo mal?
Los ejemplos que he dado son obviamente artificiales. Estoy configurando el alto de la vista, ¿por qué no simplemente establecer la altura del contenedor, verdad? Parte del objetivo de esto en un proyecto real sería establecer la altura del widget en función del ancho utilizando solo el diseño automático.
Debe definir 5 restricciones en total para que la extensión actual tenga el tamaño que realmente desea.
4 restricciones definirán la relación con la super visión:
- Espacio superior
- Espacio inferior
- Leading Space
- Espacio al final
Por cierto, debe enganchar estas limitaciones a los márgenes de diseño, como Apple recomienda para ver, y especialmente las extensiones de hoy.
La 5ª restricción será la Altura para la subvista. Esta restricción, junto con los espacios superiores e inferiores, definirá el tamaño exacto de su sección dentro de la pestaña Hoy.
Simplemente explicando eso, la restricción de altura establecerá una constante para la subvista, y las restricciones superior e inferior "pegarán" la supervista a los bordes de la subvista.
Después de algunos experimentos, y tropezando con " lo que es NSLayoutConstraint" UIView-Encapsulated-Layout-Height "y cómo debería hacerlo para volver a calcularlo limpiamente " decidí que puede eludir este problema utilizando "Altura" y "Alturas iguales" O "Altura" y "Espacio vertical" superior e inferior (según lo sugerido por Guilherme Sprint ), y luego disminuyendo la "Prioridad" de la restricción de altura a 999.
Esta no es la respuesta que esperaba, pero sí especifica la altura del contenedor mediante el diseño automático de la subvista y evita cualquier advertencia sobre restricciones rotas.
Mi conjetura / suposición / conclusión completamente no científica es que iOS está mirando correctamente las restricciones de diseño para determinar la altura de la vista del contenedor. A continuación, agrega una nueva restricción que es de la misma altura que lo que acaba de calcular, pero esto ahora sobre-limita la altura. Reducir la prioridad en la restricción de altura especificada por el desarrollador original significa que la restricción generada por el sistema gana y no se genera ninguna advertencia (me encantaría escuchar más sobre esto de alguien que realmente lo sepa).
La altura de la etiqueta hace que sea imposible satisfacer al mismo tiempo estas restricciones:
- Altura mínima de la etiqueta
- Top Space para Superview
- Espacio inferior a Superview
Puede resolverlo eliminando la restricción de espacio inferior a Superview, y el sistema de autodiseño asignará espacio inferior al espacio restante.