使用UIImagePickerController获取“使用两阶段旋转动画”警告

时间:2010-05-21 01:03:49

标签: iphone uiimagepickercontroller

我编写了简单的代码来测试UIImagePickerController:

@implementation ProfileEditViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  photoTaker_ = [[UIImagePickerController alloc] init];
  photoTaker_.delegate = self;
  photoTaker_.sourceType = UIImagePickerControllerSourceTypeCamera;
  photoTaker_.showsCameraControls = NO;
}

- (void)viewDidAppear: (BOOL)animated {
  [self presentModalViewController: photoTaker_ animated: NO];
}

@end

我收到如下奇怪的警告:

  

2010-05-20 17:53:13.838 TestProj [2814:307]使用两阶段旋转动画。要使用更平滑的单阶段动画,此应用程序必须删除两阶段方法实现。   2010-05-20 17:53:13.849 TestProj [2814:307]旋转多个视图控制器或视图控制器而不是窗口委托时,不支持使用两阶段旋转动画

知道这是关于什么的吗?非常感谢提前!

7 个答案:

答案 0 :(得分:11)

如果您在另一个UIImagePickerController内展示UIViewController,则会显示此消息。因为它不像UINavigationController堆栈那样被推动,所以在UIWindow级别存在混淆。我不知道警告是否有问题,但要消除警告,您可以执行以下操作:

// self = a UIViewController  
//  

- (void) showCamera  
{  
    cameraView = [[UIImagePickerController alloc] init];  
    [[[UIApplication sharedApplication] keyWindow] setRootViewController:cameraView];  
    [self presentModalViewController:cameraView animated:NO];  
}   

- (void) removeCamera  
{  
    [[[UIApplication sharedApplication] keyWindow] setRootViewController:self];  
    [self dismissModalViewControllerAnimated:NO];  
    [cameraView release];  
}  

答案 1 :(得分:1)

也许您将根UIViewController的视图添加为窗口的子视图,而不是将视图控制器分配给窗口的rootController属性?

答案 2 :(得分:1)

这一切都回归到用户界面

此警告可以针对多个不同的对象实施:选择器,键盘等。

我发现它与UI有两个步骤来完成转换或其他动画。或者对于UI尝试完成一件事并且在完成之前被要求执行另一件事的任何实例。 (因此它涵盖了广泛的可能触发因素)

我看到警告出现在4.0& 4.2。在我的情况下,我正在旋转设备并捕捉键盘是否仍在运行 - (即文本字段仍然是第一响应者)。如果是这样,键盘需要在视图之间保持不变,但这会带来其他视图的其他复杂性。

因此,我实现了BOOL跟踪器以跟踪keybaordIsPresent,如果是,我是{textfield resignFirstResponder];当检测到方向改变并将文本字段重置为在动画块中包含的转换之后变为FXResponder。我的BOOL跟踪器工作得更好,我仍然使用键盘的NSNotifications,但在旋转期间有通知重叠,因为键盘被解雇而没有请求。 BOOL在Load上设置为NO,当[textfield resignFirstResponder];实施。 *不是当“ - (void)keyboardWillhide由NSNotifications触发时,它给我提供了两个永不冲突的工作触发器.BOOL设置为YES,仅当用户触摸自动触发的文本字段时才会触发到第一个响应。

我通过[textfild resignFirstResponder]删除了警告;出了

-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
//if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];}

} 并将其放回代码顶部:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

if (keyboardIsPresent == YES) {
    [self.entryTextField resignFirstResponder];
}

//Determine Which Orientation is Present:
if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)){
    //LANDSCAPE VIEW:
    [self configureLandscapeView];
}else {
    //PORTRAIT VIEW:
    [self configurePortraitView];
}

}

<小时/> **即使我在 - (void)willAnimatFirstHalfOfRotationToInterface:中没有代码,警告仍然会弹出。我认为警告仍然会弹出,因为编译器在尝试执行第一个动画时仍然必须尝试该方法,因此会获得双动画调用或资源重叠。在它运行之前,它不知道该方法没有可执行代码。到那时它已经预留了资源以准备处理方法中可能的操作。
**为了消除警告我必须删除或删除willAnimateFirstHalfOfRotation的代码,以便编译器甚至不必检查是否有可能需要同时执行的第二个动画或动作。

/*-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
//if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];}}*/

转换完成后,在原始动画块中,我检查旋转前“keyboardIsPresent”是否为YES,如果是,我再次退出First Responder。我使用的setAnimationDuration:0.3非常干净而且没有跳跃。

答案 3 :(得分:0)

嗯,你在ProfileEditViewController的viewDidAppear中以模态方式呈现UIImagePickerController。

想一想。这意味着当出现ProfileEditViewController视图时,会出现UIImagePickerController,稍后你会解雇UIImagePickerController并返回到ProfileEditViewController,然后再次调用viewDidAppear并出现UIImagePickerController,稍后你会解雇UIImagePickerController并返回ProfileEditViewController,然后再次调用viewDidAppear ....你明白了。

这个警告虽然相当神秘,但不确定这是否是它试图告诉你的。我建议在ProfileEditViewController上的某个地方创建一个调用presentModalViewController的按钮,并确保你有办法解雇UIImagePickerController(我从来没有使用它,不确定它是否自动有)。

答案 4 :(得分:0)

您可能正在尝试同时呈现两个模态视图控制器,他们正在为动画资源而战。

1)很少有UI理由这样做。你可以直接转到第二个视图控制器(图像选择器);并在解除之后,然后呈现第一个视图或视图控制器。

2)如果您确实需要在视图顶部放置两个堆叠视图控制器或视图控制器,则在viewDidAppear中设置一个计时器,以在第一个视图控制器完成动画后显示第二个视图控制器。 (您可以在第一个中显示空白选取器的虚拟png图像,以防止显示器闪烁太多,直到第二个视图控制器上线。)

编辑 - 添加了一个随机代码示例:

我可能会尝试将其替换为实验:

- (void)foo {
    [self presentModalViewController: photoTaker_ animated: NO];
}

- (void)viewDidAppear: (BOOL)animated {
    NSTimer *bar = [ NSTimer scheduledTimerWithTimeInterval: (2.0f)
                             target: self  
                             selector: @selector(foo)
                             userInfo: nil
                             repeats:NO ];
}

较短的时间延迟也可能有效。

答案 5 :(得分:0)

我遇到了同样的问题。在我的情况下是一个愚蠢的错误,我正在这里,以防万一其他人陷入同样的​​问题。

在我的选项卡式应用程序中,我删除了一个原始ViewControllers并添加了一个新的Storyboard以创建“设置”部分。

这个新的VC必须是一个表视图VC,甚至我设计,编译和运行它没有问题,当我改变应用程序的方向时,我不断得到这个“使用两阶段旋转动画”错误。

我的问题是我忘了更改原来的.h文件界面“UIViewController”中的“UITableViewController”。

完成此操作后,我将Storyboard标识徽章从一般值更改为我的SettingsViewController,这就是它的结束。

我希望它可以帮助别人。我花了一些时间来深究这一点。

干杯,

答案 6 :(得分:-1)

我认为这里的警告是关于Core Animation的表现。作为测试,我加载了图像选择器,没有任何动作表或其他动画,警告仍在那里。我认为这些是来自图像选择器类本身的警告,而不是来自API的任何误用。