当呈现UIImagePicker视图时检测设备旋转

时间:2013-02-03 21:56:40

标签: ios uiimagepickercontroller

我正在使用UIImagePickerController课程,我的按钮位于相机覆盖范围内。

我想根据设备方向动态调整相机按钮的方向,就像Apple的Camera.app一样。我知道UIImagePickerController只是纵向模式,不应该是子类。不过,我希望能够捕获并响应设备旋转viewController事件。

有没有干净的方法呢?一旦呈现选择器,呈现UIImagePickerController的viewController就不再响应事件。

在这个主题上似乎有一些相关的questions,但没有一个可以澄清我想做的事情是否可能。复杂的混淆,iOS版本之间的UIImagePickerController功能似乎存在一些差异。我在iOS6 / iPhone4上开发这个,但想与iOS5兼容。

1 个答案:

答案 0 :(得分:1)

这是一个干净的方法,在iPhone4s / iOS5.1和iPhone3G / iOS6.1上测试

我正在使用Apple的PhotoPicker示例,并进行了一些小改动。我希望你能为你的项目调整这种方法。基本思想是每次旋转时使用通知来触发方法。如果该方法位于叠加层的视图控制器中,它可以在imagePicker显示时继续操作叠加层。

OverlayViewController.m中将此添加到initWithNibName

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self
                           selector:@selector(didChangeOrientation)
                               name:@"UIDeviceOrientationDidChangeNotification"
                             object:nil];

这些通知会在pickerController显示时继续发送。所以在这里,在叠加层的视图控制器中,您可以继续使用界面,例如:

- (void) didChangeOrientation
{
    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
        self.cancelButton.image =[UIImage imageNamed:@"portait_image.png"];
    } else {
        self.cancelButton.image =[UIImage imageNamed:@"landscape_image.png"];
    }
}

您需要终止通知并删除viewDidUnload中的观察者:

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self];

请注意此应用程序的设计方式:overlayViewController就像是imagePickerController的包装器。所以你通过overlayViewController调用imagePicker

    [self presentModalViewController:self.overlayViewController.imagePickerController animated:YES];

overlayViewController充当imagePickerController的委托,并且具有委托方法将信息中继回调用视图控制器。

另一种方法是根本不使用UIImagePickerController,而是使用AVFoundation media capture代替它,这样可以对拍照过程进行更细粒度的控制,但代价是(稍微)更复杂。