您需要做三件事:
- 告诉呈现 imagePicker 的 viewController 只支持纵向。
- 告诉 imagePicker 不要旋转实时摄像机源。
- 取消旋转捕获的图像。
imagePicker 直接接收设备方向更改的通知。为了防止实时摄像头随设备旋转,您可以通过告诉 UIDevice 来阻止它接收这些通知,从而在 imagePicker 通过以下方式呈现后生成方向通知:
while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];
你把它放在一个循环中的原因是因为 imagePicker 开始GeneratingDeviceOrientationNotifications,然后在它被关闭时结束它,使普通设备上的通知计数从 1 到 2 回到 1。
imagePicker 关闭后,您可以调用:
while (![currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice beginGeneratingDeviceOrientationNotifications];
以便您的 ViewControllers 可以继续接收方向更改通知。
不幸的是,即使在关闭此功能后,图像仍会在捕获时使用正确的相机图像方向保存,因此在保存图像或对其进行任何操作之前,您必须通过手动反击来删除应用的方向转换:
-(UIImage *)turnMeAround:(UIImage *)image{
CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat scale = [[UIScreen mainScreen] scale]; //retina
CGSize size = CGSizeMake(image.size.width*scale,image.size.height*scale);
switch (image.imageOrientation) {
case UIImageOrientationUp:
return image;
case UIImageOrientationDown:
size = CGSizeMake(size.height,size.width);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationLeft:
transform = CGAffineTransformRotate(transform, -M_PI_2);
break;
case UIImageOrientationRight:
transform = CGAffineTransformRotate(transform, M_PI_2);
break;
}
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage));
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, CGRectMake(0,0,size.width,size.height), image.CGImage);
CGImageRef ref = CGBitmapContextCreateImage(context);
UIImage *upsideRight = [UIImage imageWithCGImage:ref];
CGContextRelease(context);
CGImageRelease(ref);
return upsideRight;
}