1

次のコードを使用して、iPad アプリ (Cocos2D を使用) でイメージ ピッカーを起動しています。

UIImagePickerController * imagePickerController = [[UIImagePickerController alloc] init];

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 

    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePickerController.showsCameraControls = YES;
    imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    imagePickerController.delegate = self;
    imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    [self.view addSubview:imagePickerController.view];
    [self presentModalViewController:imagePickerController animated:YES];

}

常に縦向きモードで起動したいのですが、常に次のように起動します。

ここに画像の説明を入力

画像は縦向きで表示され、画像ピッカー UI は横向きモードです。しかし、画像をキャプチャすると、時計回りに 90 度回転します。

画像ピッカーの UI と撮影した画像の両方をポートレート モードにしたい。どうすればこれを修正できますか?

4

2 に答える 2

0

すべての助けをありがとう、しかし私のために働いたのは次のとおりです:

それで、原因はXcodeのCocos2Dテンプレートであることがわかりました。RootViewController に次のコードが生成されました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

//
// There are 2 ways to support auto-rotation:
//  - The OpenGL / cocos2d way
//     - Faster, but doesn't rotate the UIKit objects
//  - The ViewController way
//    - A bit slower, but the UiKit objects are placed in the right place
//

#if GAME_AUTOROTATION==kGameAutorotationNone
//
// EAGLView won't be autorotated.
// Since this method should return YES in at least 1 orientation, 
// we return YES only in the Portrait orientation
//
return ( interfaceOrientation == UIInterfaceOrientationPortrait );

#elif GAME_AUTOROTATION==kGameAutorotationCCDirector
//
// EAGLView will be rotated by cocos2d
//
// Sample: Autorotate only in landscape mode
//
if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft ) {
    [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationLandscapeRight];
} else if( interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
    [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationLandscapeLeft];
}

// Since this method should return YES in at least 1 orientation, 
// we return YES only in the Portrait orientation
return ( interfaceOrientation == UIInterfaceOrientationPortrait );

#elif GAME_AUTOROTATION == kGameAutorotationUIViewController
//
// EAGLView will be rotated by the UIViewController
//
// Sample: Autorotate only in landscpe mode
//
// return YES for the supported orientations

return ( UIInterfaceOrientationIsLandscape( interfaceOrientation ) );

#else
#error Unknown value in GAME_AUTOROTATION

#endif // GAME_AUTOROTATION


// Shold not happen
return NO;
}

上記のコードで、これを変更しました:

return ( UIInterfaceOrientationIsLandscape( interfaceOrientation ) );

これに:

return ( UIInterfaceOrientationIsPortrait( interfaceOrientation ) );

そして、それはそれを修正しました。

于 2012-07-14T17:07:57.247 に答える
0

次の 3 つのことを行う必要があります。

  1. imagePicker を提示している viewController に、縦向きのみをサポートするように伝えます。
  2. ライブ カメラ フィードを回転しないように imagePicker に指示します。
  3. キャプチャした画像の回転を解除します。

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;
}
于 2012-07-14T07:41:52.483 に答える