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