sierra - xcode ios 12
¿Puedo deshabilitar el diseño automático para una subvista específica en tiempo de ejecución? (14)
Tengo una visión que necesita que su marco sea manipulado programáticamente: es una especie de vista de documento que se ajusta a su contenido que luego se desplaza y se acerca a una supervista manipulando el origen del marco. Autolayout lucha con esto en tiempo de ejecución.
Desactivar el diseño automático por completo parece ser un poco duro porque podría usarse razonablemente para manejar el diseño de las otras vistas. Parece que lo que podría querer es algún tipo de "restricción nula".
En iOS 8 puede configurar una NSLayoutConstraint para que esté activa o no. Entonces, si uso el constructor de interfaces, agrego todas mis restricciones a un OutletCollection y luego lo activo o desactivo usando:
NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
La aplicación particular en la que lo estoy usando aquí tiene diferentes restricciones en el modo retrato y paisaje y yo lo activo / desactivo según la rotación del dispositivo. Esto significa que puedo crear algunos cambios de diseño complejos en el constructor de interfaces para ambas orientaciones, y seguir usando el diseño automático sin el código detallado de diseño automático.
O puede activar / desactivar usando removeConstraints y addConstraints.
En lugar de deshabilitar el diseño automático, simplemente calcularía la nueva restricción con el marco que está reemplazando. Esa me parece ser la forma adecuada. Si está ajustando componentes que dependen de restricciones, ajústelos en consecuencia.
Por ejemplo, si tiene una restricción vertical de 0 entre dos vistas (myView y otherView), y tiene un gesto panorámico o algo que ajusta la altura de myView, entonces puede recalcular la restricción con los valores ajustados.
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
En mi opinión, tenía una etiqueta y un texto. La etiqueta tenía un gesto panorámico. La etiqueta se mueve bien durante el arrastre. Pero cuando uso el teclado del cuadro de texto, la etiqueta restablece su posición a la ubicación original definida en el diseño automático. El problema se resolvió cuando agregué lo siguiente rápidamente para la etiqueta. Agregué esto en viewWillAppear, pero se puede agregar casi en cualquier lugar donde tenga acceso al campo de destino.
self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
Esto me sucedió en un proyecto sin storyboards o archivos xib. Todo el código 100%. Tenía un banner publicitario en la parte inferior y quería que los límites de la vista se detuvieran en el banner publicitario. La vista se redimensionaría automáticamente después de la carga. Probé todas las resoluciones en esta página, pero ninguna funcionó.
Terminé creando una vista secundaria con la altura acortada y la coloqué en la vista principal del controlador. Luego, todo mi contenido entró dentro de la vista secundaria. Eso resolvió el problema muy fácilmente sin hacer nada que pareciera ir a contracorriente.
Estoy pensando que si quieres una vista que no sea del tamaño normal que llena la ventana, entonces debes usar una sub-vista para eso.
Me encontré con un escenario similar, donde me uní a un proyecto que se inició con el diseño automático, pero necesitaba realizar ajustes dinámicos en varias vistas. Esto es lo que funcionó para mí:
NO tenga vistas o componentes establecidos en el constructor de interfaz.
Agregue sus puntos de vista de manera puramente programática, comenzando con alloc / init y configurando sus marcos de forma adecuada.
Hecho.
No sé si esto ayudará a alguien más, pero escribí una categoría para hacer esto conveniente porque me encuentro haciendo esto mucho.
UIView + DisableAutolayoutTemporarily.h
#import <UIKit/UIKit.h>
@interface UIView (DisableAutolayoutTemporarily)
// the view as a parameter is a convenience so we don''t have to always
// guard against strong-reference cycles
- (void)resizeWithBlock:(void (^)(UIView *view))block;
@end
UIView + DisableAutolayoutTemporarily.m
#import "UIView+DisableAutoResizeTemporarily.h"
@implementation UIView (DisableAutoResizeTemporarily)
- (void)resizeWithBlock:(void (^)(UIView * view))block
{
UIView *superview = self.superview;
[self removeFromSuperview];
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
__weak UIView *weakSelf = self;
block(weakSelf);
[superview addSubview:self];
}
@end
Lo uso así:
[cell.argumentLabel resizeWithBlock:^(UIView *view) {
[view setFrame:frame];
}];
Espero eso ayude.
Para aquellos de ustedes que están utilizando el diseño automático, consulte mi solución here . Debería estar haciendo @IBOutlet
de las restricciones que desea ajustar y luego cambiar sus constantes.
Para mí, funcionó para crear la subvista mediante programación, en mi caso el diseño automático estaba jugando con una vista que necesitaba girar alrededor de su centro, pero una vez que creé esta vista programáticamente funcionó.
Puede establecer traduceAutoresizingMaskIntoConstraints tipo Boolean
, Value Yes en los atributos de tiempo de ejecución definidos por el usuario de la UIView que desee en el xib / storyboard.
Tal vez el solo ajuste translatesAutoresizingMaskIntoConstraints
a YES
(y no agregue restricciones adicionales que afecten a esa vista) le permitirá establecer el marco sin luchar contra el sistema de diseño automático.
Tuve un problema similar cuando Autolayout estaba anulando parte de mi configuración de fotogramas en tiempo de ejecución (tenía una vista dinámica que en algunos casos activaba un nuevo controlador de vista ... presionar y luego presionar Atrás restablecía la vista inicial).
Lo viewDidLayoutSubviews
poniendo mi código de manipulación en viewDidLayoutSubviews
de mi View Controller. Esto parece ser llamado después de cualquier restricción que se llama mojo, pero antes de viewDidAppear, por lo que el usuario no es el más sabio.
si es archivo xib:
- seleccione el archivo .xib
- seleccione el "Propietario del archivo"
- mostrar las Utilidades
- haga clic en: "Inspector de archivos"
- En "Documento de Interface Builder" deshabilitar: "Usar Autolayout"
Yo tuve el mismo problema. Pero lo he resuelto
Sí, puede deshabilitar el diseño automático en tiempo de ejecución para un UIView
específico, en lugar de deshabilitarlo para todo el xib o guión gráfico que está configurado de manera predeterminada en Xcode 4.3 y posterior.
Set translatesAutoresizingMaskIntoConstraints
a YES
, antes de establecer el marco de su subvista:
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
- Proyecto abierto en 4.5
- Seleccionar guión gráfico
- Abra el inspector de archivos
- En el documento de Interface Builder, desmarque ''Usar ajuste automático''
Puede dividir en varios guiones gráficos si desea utilizar el diseño automático para algunas vistas.