presentViewController:animated:completion:不会将View Controller设置为视图

时间:2013-05-24 15:22:24

标签: ios cocoa-touch animation

我正在尝试在以下代码中调试一个非常奇怪的问题:

if(condition1) {
   ImageViewController* imageViewer = [[ImageViewController alloc] initWithImageData:tappedItem];
   [self presentViewController:imageViewer animated:YES completion:^{
      [imageViewer loadImage];
   }];
}
else if(condition2) {
   DocumentViewController* docViewer = [[DocumentViewController alloc] init];
   [self presentViewController:docViewer animated:YES completion:nil];
}

换句话说,根据condition1condition2的状态,UIViewController的两个子类之一将以模态方式显示给用户。

在第二种情况下一切都很好,但在第一种情况下,视图控制器没有显示通常的动画,显示它从屏幕底部滑入。相反,经过短暂的延迟,它只是突然出现,覆盖整个屏幕。另一个奇怪的是,在解雇动画中,视图控制器内的图像视图是透明的。

删除完成块无效。用UIViewController实例替换我的视图控制器也没有任何效果,除了证明由于某种原因,动画也不适用于UIViewController个实例。

认为我可能在viewDidLoad等中做错了,我试着评论视图加载/显示方法,但无济于事。

将视图控制器推入导航堆栈不是一个选项,因为该应用程序有一个标签栏,我不想显示。

更新

使用ImageViewController替换DocumentViewController的实例会导致动画效果。现在的问题是:我可以在ImageViewController中做些什么来搞乱动画?

4 个答案:

答案 0 :(得分:4)

我找到了一个解决方案,但我仍然不知道真正的原因是什么。

修复方法是为其UIViewController方法以模态方式显示的viewDidload视图设置背景颜色,例如

self.view.backgroundColor = [UIColor grayColor];

如果我弄清楚到底发生了什么,我会在这里发帖。

答案 1 :(得分:0)

如何在标签栏控制器上显示视图控制器:

if(condition1) {
   ImageViewController* imageViewer = [[ImageViewController alloc] initWithImageData:tappedItem];
   [self.tabBarController presentViewController:imageViewer animated:YES completion:^{
      [imageViewer loadImage];
   }];
}
else if(condition2) {
   DocumentViewController* docViewer = [[DocumentViewController alloc] init];
   [self.tabBarController presentViewController:docViewer animated:YES completion:nil];
}

答案 2 :(得分:0)

它也发生在我身上..改变背景颜色并没有真正帮助。 我做了以下 - 它变得相当不错:

 -(void) viewWillAppear:(BOOL)animated
 {
     [super viewWillAppear:NO];
     self.view.userInteractionEnabled = FALSE;
     self.view.hidden = TRUE;
     self.navigationController.navigationBar.alpha = 0;
}

 -(void) viewDidAppear:(BOOL)animated
 {
     [super viewDidAppear:NO];
     float width = self.view.frame.size.width;
     float height = self.view.frame.size.height;
     self.view.frame = CGRectMake(0, height, width, height);
     self.view.hidden = FALSE;
     [UIView animateWithDuration:0.7f animations:^{
     self.view.frame = CGRectMake(0, 0, width, height);
    self.navigationController.navigationBar.alpha = 1;
} completion:^(BOOL finished){
    self.view.userInteractionEnabled = TRUE;

}];
 }

答案 3 :(得分:0)

在iOS 8中为我设置背景颜色。 同时取消选中Interface Builder中的不透明设置!