example constraint ios autolayout viewdidload

constraint - ¿Hay un método iOS que se dispara cuando se ha completado Autolayout?



swift 4 constraint (4)

Estoy usando viewDidLayoutSubviews para esto. La documentación de Apple dice: "Llamado para notificar al controlador de vista que su vista acaba de presentar sus subvistas".

Tengo una aplicación para iOS en la que necesito saber cuándo una nueva vista es completamente visible en la pantalla; es decir, cuando Autolayout ha terminado sus cálculos y la vista ha terminado de dibujarse.

ViewDidAppear parece disparar bien antes de que la vista sea completamente visible. Si apago Autolayout, el tiempo parece alinearse en lo que respecta a la percepción humana, pero necesito usar Autolayout en este proyecto (por lo que esta no es una solución ... solo una prueba).

¿Hay algún método que se dispara cuando Autolayout se termina de calcular? ¿O otro método que se dispara cuando la vista es REALMENTE visible (ya que ViewDidAppear no funciona para esto)?

¡Gracias!


Lo siguiente se puede usar para evitar llamadas múltiples:

- (void) didFinishAutoLayout { // Do some stuff here. NSLog(@"didFinishAutoLayout"); }

y

- (void) viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(didFinishAutoLayout) object:nil]; [self performSelector:@selector(didFinishAutoLayout) withObject:nil afterDelay:0]; }


Lo que funcionó en mi caso fue el diseño de la solicitud después de haber cambiado un valor de restricción:

self.cnsTableviewHeight.constant = 50; [self layoutIfNeeded];

Más tarde, anule el método layoutSubviews:

- (void) layoutSubviews { //This method when auto layout engine finishes }

Puede llamar a setNeedsLayout también en lugar de layoutIfNeeded


Creo que la implementación de viewDidLayoutSubviews es la correcta, pero utilicé una animación solo para escribir la devolución de llamada completa dentro del mismo método.

someConstraint.constant = 100; // the change // Animate just to make sure the constraint change is fully applied [UIView animateWithDuration:0.1f animations:^{ [self.view setNeedsLayout]; } completion:^(BOOL finished) { // Here do whatever you need to do after constraint change }];