最近项目中的UIImagePickerController在iOS 8.1上使用的时候,出现了一个蛋疼的问题,pad水平放置,推出UIImagePickerController,拍照的时候发现,镜头莫名的旋转了90°,也就是说如果你去拍一个站着的人,发现他是躺着的,,,项目是限制Landscape两个方向的,试了网上一些解决办法,都是不行,至今没弄明白原因,除了iOS 8.1其他都正常,但是先上一个解决办法吧,不然boss吃了我:
注意要点
只有先水平放置present出UIImagePickerController时,才会出现问题
此时设备的orientation应该是face up
// 调整imagePickerController的方向,弥补iOS8时水平放置pad,imagePickerController默认竖屏,导致镜头旋转90°
NSString *version = [[[UIDevice currentDevice] systemVersion] substringToIndex:3];
if ([[UIDevice currentDevice] orientation] == 5 && [version isEqualToString:@"8.1"]) { // face up
if ([[UIApplication sharedApplication] statusBarOrientation] == 4) { // 如果应用处于landscaperight
imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(M_PI_2); // 顺时针旋转
}
else if ([[UIApplication sharedApplication] statusBarOrientation] == 3) { // 如果应用处于landscapeleft
imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(-M_PI_2); // 逆时针旋转
}
}
可以看出,其实就是将cameraView旋转成正常方向。
———————–2016-4-6————————–
最近发现上面的解决方式仍然有问题:现在imagePicker打开相机时,镜头是正常的,但是旋转pad,镜头又再次旋转90°。
增加了一段代码,完善后的地址:http://blog.csdn.net/u010731949/article/details/51075337
思路是:监听设备旋转通知,当设备旋转监听到pad旋转到UIDeviceOrientationPortraitUpsideDown、或者UIDeviceOrientationPortrait时,恢复imagePicker到原来的镜头方向_imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(0); 当然如果默认应用是竖屏的,那么相应的对旋转到UIDeviceOrientationLandScape方向进行处理
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
- (void)orientChange:(NSNotification *)noti {
NSDictionary *notiDict = [noti userInfo];
UIDeviceOrientation orient = [UIDevice currentDevice].orientation;
switch (orient) {
case UIDeviceOrientationPortraitUpsideDown:
case UIDeviceOrientationPortrait:
_imagePicker.cameraViewTransform =
CGAffineTransformMakeRotation(0);
break;
default:
break;
}