Probablemente al menos una de las restricciones en la siguiente lista es una que no desea

Soy nuevo en la programación de diseño automático. Estoy tratando de hacer una Vista (Botón) que se muestre/oculte al hacer clic en un botón. Puedo lograr mi objetivo pero arroja una excepción.

Aquí está mi código:

@interface RootViewController ()
{
    NSArray *hiddenState;
    NSArray *visibleState;
    NSArray *verticalState;
    UIButton *btnLeft;
}

- (void)viewDidLoad 
{
    [super viewDidLoad];
    btnLeft = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btnLeft.backgroundColor = [UIColor greenColor];
    btnLeft.translatesAutoresizingMaskIntoConstraints = NO;
    btnLeft.selected = NO;
    [self.view addSubview:btnLeft];
    NSString *verticalConstraint = @"V:|[v]|";
    NSMutableDictionary *views = [NSMutableDictionary new];
    views[@"v"] = btnLeft;
    views[@"superview"] = self.view;
    if ([self respondsToSelector:@selector(topLayoutGuide)]) {
        views[@"topLayoutGuide"] = self.topLayoutGuide;
        verticalConstraint = @"V:|[topLayoutGuide][v]|";
    }

    verticalState = [NSLayoutConstraint constraintsWithVisualFormat:verticalConstraint options:0 metrics:nil views:views];
    hiddenState = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v(==0)]|" options:0 metrics:nil views:views];
    visibleState = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]-50-|" options:0 metrics:nil views:views];
    [self.view addConstraints:verticalState];
    [self.view addConstraints:hiddenState];
}

- (IBAction)leftButtonAction:(id)sender
{
    UIButton *btn = (UIButton *)sender;
    if (btn.selected)
    {
        [self.view removeConstraints:visibleState];
        [self.view addConstraints:hiddenState];
        [UIView animateWithDuration:0.5 animations:^{

            [self.view layoutIfNeeded];

        } completion:^(BOOL finished) {
            btn.selected = NO;
        }];
    }
    else
    {
        [self.view removeConstraints:hiddenState];
        [self.view addConstraints:visibleState];
        [UIView animateWithDuration:0.5 animations:^{

            [self.view layoutIfNeeded];

        } completion:^(BOOL finished) {
            btn.selected = YES;
        }];
    }
}

Esto arroja la siguiente excepción:

Probablemente, al menos una de las restricciones de la lista siguiente es una que no desea. Pruebe esto: (1) mire cada restricción e intente descubrir cuál no espera; (2) encuentre el código que agregó la restricción o restricciones no deseadas y arréglelo. (Nota: si ve NSAutoresizingMaskLayoutConstraints que no comprende, consulte la documentación de la propiedad UIView translatesAutoresizingMaskIntoConstraints)

(
    "<NSLayoutConstraint:0x7d24d380 H:|-(0)-[UIButton:0x7bf58f70]   (Names: '|':UIView:0x7bf4c080 )>",
    "<NSLayoutConstraint:0x7d245de0 H:[UIButton:0x7bf58f70(0)]>",
    "<NSLayoutConstraint:0x7d245e10 H:[UIButton:0x7bf58f70]-(0)-|   (Names: '|':UIView:0x7bf4c080 )>",
    "<NSLayoutConstraint:0x7d2ad6f0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7bf4c080(320)]>"
)

Intentará recuperarse rompiendo la restricción

<NSLayoutConstraint:0x7d245e10 H:[UIButton:0x7bf58f70]-(0)-|   (Names: '|':UIView:0x7bf4c080 )>

Cree un punto de interrupción simbólico en UIViewAlertForUnsatisfiableConstraints para detectar esto en el depurador. Los métodos en la categoría UIConstraintBasedLayoutDebugging en UIView enumerados en también pueden ser útiles.

Lanza la excepción cuando intento hacer que el ancho del botón sea igual a cero.

preguntado Oct 07 '14, 14:10

1 Respuestas

Considere las tres primeras restricciones del mensaje de error:

H:|-(0)-[UIButton:0x7bf58f70]   (Names: '|':UIView:0x7bf4c080 )
H:[UIButton:0x7bf58f70(0)]
H:[UIButton:0x7bf58f70]-(0)-|   (Names: '|':UIView:0x7bf4c080 )

Su H:|[v(==0)]| cadena de formato crea estas tres restricciones. Podemos escribirlas como ecuaciones como esta:

(1) superview.leading == button.leading
(2) button.leading == button.trailing
(3) button.trailing == superview.trailing

Sustituye (2) en (1) para obtener esto:

(4) superview.leading == button.trailing

Luego sustituya (3) en (4) para obtener esto:

(5) superview.leading == superview.trailing

Esto significa que la supervista debe tener un ancho de 0.

Ahora considere la última restricción en el mensaje de error:

 H:[UIView:0x7bf4c080(320)]

El sistema agrega esta restricción, presumiblemente porque esta es la vista del controlador de vista raíz, por lo tanto, está dimensionada para llenar la pantalla. Esta restricción dice que la supervista debe tener un ancho de 320. Esto entra en conflicto con la ecuación (5). Por eso te da el error.

Supongo que desea que el botón se adhiera al borde izquierdo de la supervista, ya que lo nombró btnLeft. Así que pruebe estas restricciones en su lugar:

hiddenState = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v(==0)]" options:0 metrics:nil views:views];
visibleState = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]" options:0 metrics:nil views:views];

Respondido 07 Oct 14, 16:10

Gracias Rob, escribí @"H:|[v]-50-|", ya que mi btnLeft debe tener 50 puntos (de ancho) menos que su supervista. Podemos escribir esto como ecuaciones btnLeft.trailing = superview.trailiing - 50. - iOSDev

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.