web-dev-qa-db-ja.com

ONE VIEWランドスケープモードのみ

IOSアプリを完成させましたが、1つのビューのみを横向きモードに設定する必要があり、残りのビューは縦向きモードでのみ表示できます。

Xcode 5.1を使用しており、右側のパネルからストーリーボードのView Controllerをドロップすることですべてのビューを作成しました。そのため、どこかにコードを記述するように指示する場合は、正確にどこに書き込む必要があるかを教えてください。

ここで1つの解決策を読みました INavigationController Force RotateUIViewControllerを手動で作成する必要がありますか?

37
maeq

ここでiOS 7をターゲットにしていると思います(XCode 5.1を使用して、私は正しいと思います)。

まず、ランドスケープの40以上のビューのうち1つでもビューを開くには、アプリでランドスケープとポートレートの両方のインターフェイスの向きを許可する必要があることを理解する必要があります。デフォルトではこのようになっていますが、ターゲットの設定、Generalタブ、Deployment Infoセクション(下のスクリーンショットを参照)。

enter image description here

次に、アプリ全体で横向きと縦向きの両方を許可したため、すべての縦向きのみUIViewControllerに自動回転しないように指示し、このメソッドの実装を追加する必要があります。

- (BOOL)shouldAutorotate {
  return NO;
}

最後に、特定のランドスケープのみのコントローラーについて、そしてモーダルでそれを提示すると言ったので、これらのメソッドを実装するだけです:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
  return UIInterfaceOrientationLandscapeLeft; // or Right of course
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  return UIInterfaceOrientationMaskLandscape;
}

これが役立つことを願って、

38
Zedenem

スイフト

AppDelegate.Swift

_internal var shouldRotate = false
func application(_ application: UIApplication,
                 supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return shouldRotate ? .allButUpsideDown : .portrait
}
_

ランドスケープビューコントローラー

_let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true // or false to disable rotation
_

Objective-C

AppDelegate.h

@property (assign, nonatomic) BOOL shouldRotate;

AppDelegate.m

_- (UIInterfaceOrientationMask)application:(UIApplication *)application
 supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return self.shouldRotate ? UIInterfaceOrientationMaskAllButUpsideDown
                             : UIInterfaceOrientationMaskPortrait;
}
_

ランドスケープビューコントローラー

_AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES]; // or NO to disable rotation
_
89
Yaroslav

Yaroslavのソリューションをフォローアップするには、1つのビューのみでランドスケープモードへの回転を許可するために、ランドスケープビューコントローラーのviewWillAppearメソッドでshouldRotateをYESに設定し、viewWillDisappearでNOに設定する必要があります。

ViewWillAppearでShouldRotateのみをYESに設定した場合、このView Controllerが存在すると、他のすべてのView Controllerも同様に回転します。そのため、viewWillDisappearでShouldRotateをNOに設定して、ポートレートビューの回転を制限する必要があります。

6
Tim Le

Swift4

以下のコード行をAppDelegateに追加します

var orientationLock = UIInterfaceOrientationMask.portrait

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

    struct AppUtility {
        static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
            if let delegate = UIApplication.shared.delegate as? AppDelegate {
                delegate.orientationLock = orientation
            }
        }

        static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
            self.lockOrientation(orientation)
            UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        }
    }

横長にするコントローラーに以下のコードを追加します

override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscapeRight, andRotateTo: UIInterfaceOrientation.landscapeRight)
    }

    override func viewWillDisappear(_ animated : Bool) {
        super.viewWillDisappear(animated)
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
    }
6
Bhavesh Patel

パブリッククラス警告なしでパブリックプロパティを削除するには、shouldRotateをinternalとして宣言する必要があります。 internal var shouldRotate = false

1
bleft