次の 3 つのことを行う必要があります。
- imagePicker を提示している viewController に、縦向きのみをサポートするように伝えます。
- ライブ カメラ フィードを回転しないように imagePicker に指示します。
- キャプチャした画像の回転を解除します。
imagePicker は、デバイスの向きの変更の通知を直接受け取ります。ライブ カメラ フィードがデバイスと一緒に回転しないようにするには、UIDevice に次の方法で imagePicker が表示された後に向きの通知を生成することを終了するように指示することで、これらの通知の受信を停止できます。
while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];
ループに入れる理由は、imagePicker が GeneratingDeviceOrientationNotifications を開始し、それが閉じられると終了し、通常のデバイスの通知カウントが 1 から 2 から 1 に戻るためです。
imagePicker が閉じられた後、次を呼び出すことができます。
while (![currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice beginGeneratingDeviceOrientationNotifications];
ViewControllers が引き続き方向変更通知を受信できるようにします。
残念ながら、これをオフにした後でも、画像はキャプチャ時にカメラの正しい imageOrientation で保存されます。そのため、画像を保存する前、または画像で何かを行う前に、適用された方向変換を手動でカウンターして削除する必要があります。 :
-(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;
}