1

我正在使用UIImagePickerController课程,我的按钮在相机覆盖中。

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

有什么干净的方法可以做到这一点吗?一旦呈现了选取器,呈现的 viewControllerUIImagePickerController就不再响应事件。

关于这个主题似乎有一些相关的问题,但没有一个可以澄清我想要做的事情是否可行。UIImagePickerController更令人困惑的是, iOS 版本之间的功能似乎存在一些差异。我正在 iOS6/iPhone4 上开发它,但希望与 iOS5 兼容。

4

1 回答 1

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 显示时继续发送。所以这里,在overlay的view controller中,你可以继续玩这个界面,例如:

- (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 媒体捕获,它可以让您对拍照过程进行更细粒度的控制,但代价是(稍微)更大的复杂性。

于 2013-02-15T10:49:17.267 回答