iOS确保viewcontroller转换结束

时间:2013-06-08 23:40:28

标签: ios objective-c uiviewcontroller core-animation

我的应用程序中有一堆回合制游戏,我使用相同的动画来宣告首发玩家。

在viewDidLoad的最后,我放置了声明代码。它获取当前视图的屏幕截图然后将其模糊一点,标签显示为显示起始播放器的名称。问题是有时它很快发生,我得到了上一个视图的屏幕截图,标签出现在上一个视图的模糊屏幕截图上。

我的viewDidLoad看起来像这样:

-(void) viewDidLoad
{
    [super viewDidLoad];

    [self initializeThings];

    [self layoutUI]; //In some of the games this part requires heavy processing,
                     //ie laying out a 2D array of buttons (20x20=400 of them)

    [self showStartingPlayer];
}

我在所有VC中使用默认过渡样式cover vertical。我尝试使用performSelector延迟调用[self showStartingPlayer];延迟,但不同的设备需要不同的延迟值,因此它不是一个强大的解决方案。我可以在viewcontroller生命周期中使用任何其他方法而不是viewDidLoad或任何实际的方法来做这样的事情吗?

3 个答案:

答案 0 :(得分:1)

如果您使用presentViewController: animated: completion:,我会利用完成块通知视图控制器转换已完成。

例如,您可以向视图控制器添加一个名为-(void)wasJustPresented的公共方法,该方法调用必要的UI布局。

然后,在完成块中调用它。例如:

[self presentViewController:newVC
                   animated:YES
                 completion:^(void){
            [newVC wasJustPresented];
            }];

这将确保您的视图控制器在完成呈现后立即得到通知。

答案 1 :(得分:0)

加载视图控制器的视图时会调用

viewDidLoad,但这并不意味着它实际上在屏幕上可见。

您可以使用- (void) viewDidAppear:来执行此操作。

答案 2 :(得分:0)

您应该尝试在视图转换完成时调用的viewDidAppear内调用您的方法。

-(void)viewDidAppear:animated
{
    [super viewDidAppear:animated];
    //put your call here
}