2010-05-21 45 views
14
警告

我写简单的代码来测试的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]使用两级旋转动画不支持旋转多于一个视图控制器或视图控制器时不在窗口代表

得到任何想法这是关于?提前感谢!

+0

赏金是使用公共apis找到解决方法。 – 2010-09-19 15:28:34

+0

更具体地说,是使用UIImagePickerController时出现的两阶段旋转警告的解决方法。 – 2010-09-20 10:33:50

+0

澄清 - 意图是没有烦人的警告功能的完整幻灯片 – 2010-09-21 12:46:46

回答

0

那么,你在ProfileEditViewController的viewDidAppear中模态地呈现UIImagePickerController。

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

这个警告虽然很神秘,但不知道它是否会告诉你。我会建议在ProfileEditViewController上的某个地方调用presentModalViewController,并确保你有一个方法来解除UIImagePickerController(我从来没有使用它不知道它是否有自动)。

+0

感谢您的回答。我明白了你的意思,并且会妥善地修正代码,但这些警告并不是因为这个。我认为这与视图控制器的两步方向更改有关,但我无法弄清楚如何摆脱它们。 – Kay 2010-05-21 04:41:27

+0

是的,我认为你发布的代码可能与该警告没有关系,如果你还没有看到这个问题,它可能会有所帮助。 http://stackoverflow.com/questions/2048781/single-stage-vs-two-stage-animation-for-iphone-apps – Tom 2010-05-21 19:30:34

-1

我想这里的警告是关于核心动画性能。作为测试,我加载了图像采集器,没有任何动作表或其他动画,警告仍然存在。我认为这些是来自图像选择器类本身的警告,而不是任何滥用API的警告。

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

更短的时间延迟也可以起作用。

+0

这篇文章是专门针对UIImagePickerController,它似乎总是会导致此警告。提供一个可以避免iOS 4.1中的警告的UIImagePickerController工作示例,并且我会奖赏您的赏金! – 2010-09-19 21:23:31

1

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

+0

它的作用仅仅是因为它没有动画。任何避免动画的方法都可以避免这种警告,但其目的是在功能完整的情况下进行滑动,而不会产生恼人的警告。也许windows会以某种方式回答问题。 – 2010-09-21 12:46:22

+0

好吧,它可以工作,如果我创建一个新窗口,添加选择器作为该窗口的rootViewController,然后在该窗口内动画。我为此添加了一个答案。自从你触发导致解决方案的思想后,我会给你赏金! – 2010-09-21 13:02:23

11

如果您在另一个UIViewController内显示UIImagePickerController,则会显示此消息。因为它不是像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]; 
} 
+0

谢谢约翰卡特..这工程..! – GeneCode 2011-03-26 18:51:27

+0

在添加和删除UINavigationControllers时,我一直在对付一个非常奇怪的问题,但只有在显示UIImagePickerController之后,这个技巧才有了效果。谢谢! – Adolfo 2011-05-03 10:17:48

+0

-John Carter-警告被移除,但当我尝试从库中选取图片或拍摄新图片时,界面会停止5到10秒(此行为是第一次当应用程序安装在设备上且拾取器是openend),你能告诉我如何解决这个延迟? – 2012-08-30 08:19:54

1

IT ALL将依赖UI

这个警告可以几个实施不同的对象:拾取器,键盘等

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

我看到警告出现在4.0 & 4.2。在我的情况下,我正在旋转设备并捕捉键盘是否仍然弹起(即文本字段仍然是第一响应者)。如果是这样,键盘需要保持在意见之间,但这与其他观点有其他复杂性。

因此,我实现了一个BOOL跟踪器来跟踪keybaordIsPresent,如果是的话我是{textfield resignFirstResponder];当检测到方向改变并且将该文本字段重置为在包含在动画块中的转换之后变为FRAMEResponder。我的BOOL跟踪器效果更好,我仍然使用键盘的NSNotifications,但旋转过程中出现通知重叠,因为键盘在没有请求的情况下被解散。 BOOL在加载时设置为NO,当[textfield resignFirstResponder];已实施。 *不是当“ - (void)keyboardWillhide被NSNotifications触发时,它给了我两个永不冲突的工作触发器,BOOL被设置为YES,只有当用户触摸textfield时,它才会自动触发成为FirstResponder。

- (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)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
//if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];} 

} 的,并把它回到了代码的顶部为;通过取[textfild resignFirstResponder]警告


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

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

转换完成后,原动画块中我检查,看看是否“keyboardIsPresent”是YES之前的旋转,如果是这样,我再次辞职第一响应者。我用setAnimationDuration:0.3出来很干净,而不是跳动。

0

我刚刚有同样的问题。在我看来,这是一个愚蠢的错误,我只是为了防止其他人陷入同样的​​问题。

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

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

我的问题是,我忘了改变原来的.h文件接口“UIViewController”为“UITableViewController”。

完成此操作后,我将故事板身份徽章上的类从常规值更改为我的SettingsViewController,这就是它的结尾。

我希望它可以帮助别人。我花了一段时间才弄清楚了这一点。

干杯,