web-dev-qa-db-ja.com

iOS7 iPadランドスケープのみのアプリ、UIImagePickerControllerを使用

これは一般的な問題であり、iOS7の下でiPadアプリが横向きのみでUIImagePickerControllerとソースUIImagePickerControllerSourceTypePhotoLibraryまたはUIImagePickerControllerSourceTypeCamera

それを正しく設定するにはどうすれば100%機能しますか?また、混合方向を取得せず、「サポートされている方向にはアプリケーションと共通の方向がないため、shouldAutorotateYESを返します」というエラーを回避できます。

32
Peter Lapisu

IPadアプリがすべての条件でのみ横向きの場合は、次の3つの手順を実行してください。

1)アプリのデリゲート内

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskAll;
}

2)カテゴリヘッダーを作成する

#import "UIViewController+OrientationFix.h"

@implementation UIViewController (OrientationFix)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

)カテゴリー実装を作成します

#import "UIImagePickerController+OrientationFix.h"

@implementation UIImagePickerController (OrientationFix)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

注:これらのカテゴリをどこかにインポートする必要はありません。プロジェクトでコンパイルされていれば十分です。

注:これらのメソッドをVCに実装する必要はありません

注:plistでサポートされている方向を変更する必要はありません

これはテストされ、任意の条件下で動作しています

83
Peter Lapisu

Appleのサンプルコードからこのコードを見てきました。

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;

このため、IModalPresentationCurrentContextUIImagePickerControllerは、デバイスの現在の方向に従って開かれます。

41

Appleのドキュメントによると:

「重要:UIImagePickerControllerクラスは縦向きモードのみをサポートします。」

ただし、フルスクリーンの横向きやiOS 6では問題なく機能します。

IImagePickerControllerクラス参照

1
Collin

ほとんどの回答は.currentContextの使用を推奨していますが、イメージピッカーを閉じた後、すべてが間違っていることがわかりました。

横長のiPadでは、imho.formSheetを使用するのが最適です。

let picker = UIImagePickerController()
picker.modalPresentationStyle = .formSheet
picker.sourceType = .photoLibrary
picker.delegate = self
self.present(picker, animated: true)
0
dOM

上記のPeter Lapisuの提案に感謝します。私には機能しません(おそらくiOS 8.3を使用しています)が、方向の問題を修正するように変更することができました。私のコードは以下です

アプリの委任中

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskAll;
}

UIImagePickerControllerカテゴリ

@implement UIImagePickerController (extensions)
- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[UIApplication sharedApplication] statusBarOrientation];
}

@end

UIViewControllerカテゴリ

@implementation UIViewController (extensions)

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

@end
0
Tien Dinh

Swift 4 解決

NavigationViewControllerにViewControllerが埋め込まれている場合は、そこに修正を加えるようにしてください。この制限をViewControllerに追加しても機能しません...

import UIKit

class MainNavigationViewController: UINavigationController {

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
    }
}

そしてもちろん、AppDelegateの上記のコード:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return .all
}

ところで、これはiOS 10以下でのみ必要です。 AppleはiOS 11以降で修正されているようです...

0
simon