我正在使用UIImagePickerController
课程,我的按钮位于相机覆盖范围内。
我想根据设备方向动态调整相机按钮的方向,就像Apple的Camera.app一样。我知道UIImagePickerController
只是纵向模式,不应该是子类。不过,我希望能够捕获并响应设备旋转viewController事件。
有没有干净的方法呢?一旦呈现选择器,呈现UIImagePickerController
的viewController就不再响应事件。
在这个主题上似乎有一些相关的questions,但没有一个可以澄清我想做的事情是否可能。复杂的混淆,iOS版本之间的UIImagePickerController
功能似乎存在一些差异。我在iOS6 / iPhone4上开发这个,但想与iOS5兼容。
答案 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代替它,这样可以对拍照过程进行更细粒度的控制,但代价是(稍微)更复杂。