【问题标题】:Getting "Using two-stage rotation animation" warning with UIImagePickerController使用 UIImagePickerController 获取“使用两阶段旋转动画”警告
【发布时间】:2010-05-21 01:03:48
【问题描述】:

我写了简单的代码来测试 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] 旋转多个视图控制器或视图控制器不是窗口委托时,不支持使用两阶段旋转动画

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

【问题讨论】:

  • 赏金是使用公共 api 找到解决方法。
  • 更具体地说,使用 UIImagePickerController 时出现的两个阶段旋转警告的解决方法。
  • 澄清 - 目的是在没有恼人警告的情况下完整滑动功能
  • 你能用一个可行的解决方案更新你的答案吗?

标签: iphone uiimagepickercontroller


【解决方案1】:

如果您在另一个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];  
}  

【讨论】:

  • 在添加和删除 UINavigationControllers 时,我一直在与一个非常奇怪的翻转动画问题作斗争,但只有在显示 UIImagePickerController 之后,这才成功。谢谢!
  • -John Carter- 警告已删除,但当我尝试从库中选择图像或拍摄新照片时界面会停止 5 到 10 秒(此行为是第一次安装应用程序时在设备上并且选择器是开放的),你能告诉我如何解决这个延迟吗?
【解决方案2】:

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

【讨论】:

  • 它之所以有效,只是因为它没有动画。任何避免动画的方法都将避免警告,但其目的是在没有恼人警告的情况下实现完整的滑动功能。也许窗户会以某种方式成为答案。
  • 好吧,如果我创建一个新窗口,将选取器添加为该窗口的 rootViewController,然后在该窗口中设置动画,它就可以工作。我正在为这种效果添加一个答案。既然你触发了导致解决方案的想法,我会给你赏金!
【解决方案3】:

一切都回到用户界面

这个警告可以针对几个不同的对象实现:选择器、键盘等。

我发现它与 UI 采取两个步骤来完成过渡或其他动画有关。或者对于 UI 试图完成一件事并被要求在完成之前执行另一件事的任何情况。 (因此它涵盖了广泛的可能触发因素)

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

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

我通过使用 [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,它非常干净而且不跳动。

【讨论】:

    【解决方案4】:

    好吧,您在 ProfileEditViewController 的 viewDidAppear 中模态地呈现 UIImagePickerController。

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

    不过,该警告相当神秘,不确定它是否试图告诉您。我建议在 ProfileEditViewController 上的某处创建一个按钮,该按钮调用 presentModalViewController 并确保您有办法关闭 UIImagePickerController(我从未使用过它,不确定它是否会自动设置)。

    【讨论】:

    • 感谢您的回答。我明白了你的意思,并将正确修复代码,但这些警告不是因为这个。我认为这与视图控制器的两步方向变化有关,但我不知道如何摆脱它们。
    • 是的,我认为您发布的代码可能与该警告无关,如果您还没有看到这个问题,它可能会有所帮助。 stackoverflow.com/questions/2048781/…
    【解决方案5】:

    您可能试图同时呈现两个模态视图控制器,它们正在争夺动画资源。

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

    更短的时间延迟也可以。

    【讨论】:

    • 这篇文章专门讨论了 UIImagePickerController,它似乎总是会导致这个警告。提供一个 UIImagePickerController 的工作示例,它可以避免 iOS 4.1 中的警告,我会奖励你!
    【解决方案6】:

    我也遇到了同样的问题。就我而言,这是一个愚蠢的错误,我把它放在这里以防万一其他人陷入同样的​​问题。

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

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

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

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

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

    干杯,

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-27
        • 2012-06-08
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多