Autolayout完成时是否会触发iOS方法?

我有一个iOS应用程序,我需要知道什么时候一个新的视图是完全可见的屏幕上; 也就是说,Autolayout完成计算后,视图已经完成绘制。

在视图完全可见之前,ViewDidAppear似乎已经开火了。 如果我closuresAutolayout,时间似乎与人类感知一致,但我需要在这个项目中使用Autolayout(所以这不是一个解决scheme…只是一个testing)。

Autolayout计算完成后有没有什么方法可以触发? 或者当视图是ACTUALLY可见时触发的另一种方法(因为ViewDidAppear不适用于此)?

谢谢!

我为此使用viewDidLayoutSubviews。 苹果的文档说:“打电话通知视图控制器,它的视图刚刚布置了子视图。”

以下可以用来避免多次呼叫:

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

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

在我的情况下,它改变了一个约束值后的请求布局:

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

稍后重写layoutSubviews方法:

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

你也可以调用setNeedsLayout而不是layoutIfNeeded

我猜实现viewDidLayoutSubviews是正确的方法,但我用一个animation只是在同一个方法内写入完成callback。

 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 }];