ios - AutoLayout, no se pueden cumplir restricciones simultáneamente
nslayoutconstraint swift 4 (5)
En caso de que alguien más se encuentre con esto, este sitio (¡es realmente útil!):
Aquí está el proyecto Github en caso de que el sitio se caiga: https://github.com/johnpatrickmorgan/wtfautolayout
Acabo de empezar a aprender iOS AutoLayout, constructor de interfaz muy sencillo, pero cuando intento archivar lo mismo en el código
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(==2)-[_nextKeyboardButton]-(==2)-[_numPadButton]-(==2)-[_spaceButton]-(==2)-[_returnButton]-(==2)-|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_nextKeyboardButton,_numPadButton,_spaceButton,_returnButton)]];
plantea una excepción,
Incapaz de satisfacer simultáneamente las restricciones.
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:0x6000000966c0 H:|-(2)-[UIButton:0x7fe4f1d1c760''Next''] (Names: ''|'':UIInputView:0x7fe4f1f04d00 )>",
"<NSLayoutConstraint:0x600000096710 H:[UIButton:0x7fe4f1d1c760''Next'']-(2)-[UIButton:0x7fe4f1d1d1d0''123'']>",
"<NSLayoutConstraint:0x600000096760 H:[UIButton:0x7fe4f1d1d1d0''123'']-(2)-[UIButton:0x7fe4f1d1d6f0''Space'']>",
"<NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0''Space'']-(2)-[UIButton:0x7fe4f1d1d8d0''Return'']>",
"<NSLayoutConstraint:0x600000096800 H:[UIButton:0x7fe4f1d1d8d0''Return'']-(2)-| (Names: ''|'':UIInputView:0x7fe4f1f04d00 )>",
"<NSLayoutConstraint:0x600000096e40 ''UIView-Encapsulated-Layout-Width'' H:[UIInputView:0x7fe4f1f04d00(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0''Space'']-(2)-[UIButton:0x7fe4f1d1d8d0''Return'']>
Los 4 botones .translatesAutoresizingMaskIntoConstraints = NO;
Me pregunto qué está mal? La ayuda es muy apreciada :)
FYI: trabajo en iOS8 SDK
La forma más fácil de encontrar restricciones no satisfactorias:
- establece un identificador único para cada restricción en tu vista:
- crear una extensión simple para
NSLayoutConstraint
:
SWIFT :
extension NSLayoutConstraint {
override public var description: String {
let id = identifier ?? ""
return "id: /(id), constant: /(constant)" //you may print whatever you want here
}
}
C OBJETIVO
@interface NSLayoutConstraint (Description)
@end
@implementation NSLayoutConstraint (Description)
-(NSString *)description {
return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}
@end
- compila una vez más, y ahora tienes más resultados legibles para ti:
- una vez que obtuviste tu
id
, puedes simplemente tocarla en tu Navegador de Búsqueda :
- y encontrarlo rápidamente:
¿CÓMO ARREGLAR SIMPLE ESTE CASO?
- tratar de cambiar la prioridad a
999
para la restricción rota.
Consulte la respuesta relacionada aquí: no puede cumplir restricciones simultáneamente, intentará recuperar rompiendo la restricción
Puede que no sea tan difícil. La salida de la consola de mensajes dice que las restricciones de UIButton se redefinieron. Significa que al poner una restricción que restringe la Height
y el Width
del botón, pero innecesariamente se pone otra restricción para que el botón tenga un Aspect Ratio
. En esta condición, Xcode no puede asegurarse de qué restricción seguir, para que pueda ver este mensaje de depuración en la consola.
Hay dos formas útiles para mí:
- Analice las restricciones que se muestran en la consola e intente eliminar una o más restricciones.
2.Si está usando el storyboard
o Xib
, seleccione una restricción -> Mostrar el Inspector de atributos -> cambie la prioridad de algunas Restricciones.
Una cosa más...
Puedes seguir el article de Jason Jarrett. Agregue un punto de interrupción del símbolo para asegurarse de qué vista hace que ocurra el error.
Según su pregunta, lo que he entendido que ha creado el control en la punta y que está tratando de cambiar directamente es la restricción de su clase.
Lo que puede hacer aquí es establecer restricciones en la punta para ver el controlador y luego vincularlo con su clase y usar objetos de restricciones. O puede crear vistas programáticamente y establecer directamente las restricciones.
// También debe verificar si necesita "translatesAutoresizingMaskIntoConstraints" si "YES - la vista supervisada de la vista mira la máscara de autorización de la vista, produce restricciones que la implementan y agrega esas restricciones a sí misma (la vista supervisada)". NO: la vista de supervisión de la vista no se ve en la máscara de tamaño automático de la vista y no produce restricciones que la implementen ".
También tengo el mismo problema y lo arreglé como sigue
[_nextKeyboardButton setTranslatesAutoresizingMaskIntoConstraints:YES];
_numPadButton.translatesAutoresizingMaskIntoConstraints = YES;
[_numPadButton updateConstraints];
[_nextKeyboardButton updateConstraints];
NSArray *constraints2 = [NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-57-[_nextKeyboardButton(96)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(_nextKeyboardButton)];
[self.view addConstraints:constraints2];
NSArray *constraints4 = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-123-[_nextKeyboardButton(30)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(_nextKeyboardButton)];
[self.view addConstraints:constraints4];
NSArray *constraints1 = [NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-207-[_numPadButton(58)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(_numPadButton)];
[self.view addConstraints:constraints1];
NSArray *constraints3 = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-123-[_numPadButton(30)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(_numPadButton)];
[self.view addConstraints:constraints3];
// Create Controls or view programmatically.
UILabel *label = [UILabel new];
label.text = @"This is a Label";
label.font = [UIFont systemFontOfSize:18];
label.backgroundColor = [UIColor lightGrayColor];
label.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:label];
NSArray *constraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-offsetTop-[label(100)]"
options:0
metrics:@{@"offsetTop": @100}
views:NSDictionaryOfVariableBindings(label)];
[self.view addConstraints:constraints];
UIView *spacer1 = [UIView new];
spacer1.translatesAutoresizingMaskIntoConstraints = NO;
[spacer1 setBackgroundColor:[UIColor redColor]];
[self.view addSubview:spacer1];
UIView *spacer2 = [UIView new];
spacer2.translatesAutoresizingMaskIntoConstraints = NO;
[spacer2 setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:spacer2];
NSArray *constraints1 = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-offsetTop-[spacer1(100)]"
options:0
metrics:@{@"offsetTop": @100}
views:NSDictionaryOfVariableBindings(spacer1)];
[self.view addConstraints:constraints1];
NSArray *constraints2 = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-offsetTop-[spacer2(100)]"
options:0
metrics:@{@"offsetTop": @100}
views:NSDictionaryOfVariableBindings(spacer2)];
[self.view addConstraints:constraints2];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[spacer1]-10-[label]-20-[spacer2(==spacer1)]|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(label, spacer1, spacer2)]];
Por lo tanto, al usar AutoLayout, nunca debe establecer directamente el marco de una vista. Las restricciones se usan para hacer esto por usted. Normalmente, si desea establecer sus propias restricciones en una vista, debe anular el método updateConstraints de sus UIViews. Asegúrese de que las vistas de contenido para el controlador de página permitan que se redimensionen sus bordes, ya que se ajustarán al tamaño del marco de la vista de página. Sus restricciones y la configuración de la vista deberán tener en cuenta esto, o usted obtendrá errores de restricción insatisfiables.
https://developer.apple.com/library/mac/documentation/userexperience/conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html#//apple_ref/doc/uid/TP40010853-CH14-SW1 También puede hacer referencia al enlace de Apple. estudie a fondo y, si aún se enfrenta a un problema, intentaré mi mejor nivel para resolver su problema.
Tuve que enfrentarme a un problema similar cuando intentaba crear manualmente todas las restricciones de diseño automático (en Swift, usando Snappy, un puerto de mampostería para Swift) en un controlador de vista basado en un Storyboard.
Por alguna razón, Xcode genera su propio conjunto predeterminado de restricciones de diseño automático en un NIB en el momento de la compilación. Por eso no pude agregar más restricciones manuales, porque estaban en conflicto con las agregadas automáticamente.
Lo resolví de la siguiente manera:
Abre el controlador de vista de Storyboard que estás manejando.
Seleccione el controlador de vista y seleccione Editor> Resolver problemas de diseño automático> Todas las vistas en [] Controlador de vista> Agregar restricciones que faltan en el menú:
(Esto asegurará que no se creen restricciones de tiempo de compilación adicionales y que todas las restricciones estén ahora visibles).
- Seleccione todas las restricciones de su controlador de vista:
- Compruebe en el panel derecho la siguiente casilla de verificación: Marcador de posición - Eliminar en tiempo de compilación :
Ahora puede agregar todas las restricciones de diseño automático manualmente en el código.