Configurar esta interfaz de usuario con layout automático

Estoy intentando configurar una vista con layout automático para que se genere una animation cuando la vista cambia de tamaño …

El escenario es …

Tengo una UIView con un subView llamado animView . animView comienza fuera del marco de la vista. A medida que la vista crece (se hace más alta), el animView mueve hacia abajo a la misma velocidad. Cuando el animView está a 10 puntos de la parte superior de la vista (es decir, @ "V: | -10- [animView]") se detiene y se "pega" a ese punto.

es decir algo así …

introduzca la descripción de la imagen aquí

Esto funciona ( participación de Dropbox para el proyecto ):

El truco es usar una UIView invisible como object espaciador. La vista que llamas animView está configurada de esta manera. Debido a que configuré esto parcialmente en IB, aún plantea algunos problemas, pero verá que funciona como lo desea.

 @implementation AnimView { UIView * _innerBox; UIView * _spacer; } 

Luego, llame al método - setUpEverything desde initWithCoder: o initWithFrame:

 - (void) setUpEverything { // Because I set this up in IB with AutoLayout off, I think it // still needs this. Won't work without it self.translatesAutoresizingMaskIntoConstraints = YES; // Otherwise you will see the box outside of animView self.clipsToBounds = YES; _innerBox = [[UIView alloc] init]; _innerBox.backgroundColor = [UIColor blackColor]; _spacer = [[UIView alloc] init]; _spacer.backgroundColor = [UIColor clearColor]; _innerBox.translatesAutoresizingMaskIntoConstraints = NO; _spacer.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_innerBox]; [self addSubview:_spacer]; // Give _innerBox and _spacer some dimensions to prevent ambiguity NSLayoutConstraint *i02 = [NSLayoutConstraint constraintWithItem:_innerBox attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:50.0f]; NSLayoutConstraint *i03 = [NSLayoutConstraint constraintWithItem:_innerBox attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:50.0f]; NSLayoutConstraint *s02 = [NSLayoutConstraint constraintWithItem:_spacer attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:50.0f]; // Center both views NSLayoutConstraint *i05 = [NSLayoutConstraint constraintWithItem:_innerBox attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]; NSLayoutConstraint *s04 = [NSLayoutConstraint constraintWithItem:_spacer attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]; // Set the top of _innerBox 10.0 points from the top of the superview with a low priority NSLayoutConstraint *i01 = [NSLayoutConstraint constraintWithItem:_innerBox attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:10.0f]; i01.priority = 250; // Pin the spacer to the bottom of _innerBox; NSLayoutConstraint *i04 = [NSLayoutConstraint constraintWithItem:_innerBox attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_spacer attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]; // Pin the spacer's bottom to the bottom of the superview NSLayoutConstraint *s01 = [NSLayoutConstraint constraintWithItem:_spacer attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]; // Stretch the spacer out as needed NSLayoutConstraint *s03 = [NSLayoutConstraint constraintWithItem:_spacer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:0 multiplier:1.0f constant:80.0f]; [self addConstraints:@[i01,i02,i03,i04,i05,s01,s02,s03,s04]]; }