IOSアプリを完成させましたが、1つのビューのみを横向きモードに設定する必要があり、残りのビューは縦向きモードでのみ表示できます。
Xcode 5.1を使用しており、右側のパネルからストーリーボードのView Controllerをドロップすることですべてのビューを作成しました。そのため、どこかにコードを記述するように指示する場合は、正確にどこに書き込む必要があるかを教えてください。
ここで1つの解決策を読みました INavigationController Force RotateUIViewController
を手動で作成する必要がありますか?
ここでiOS 7をターゲットにしていると思います(XCode 5.1を使用して、私は正しいと思います)。
まず、ランドスケープの40以上のビューのうち1つでもビューを開くには、アプリでランドスケープとポートレートの両方のインターフェイスの向きを許可する必要があることを理解する必要があります。デフォルトではこのようになっていますが、ターゲットの設定、General
タブ、Deployment Info
セクション(下のスクリーンショットを参照)。
次に、アプリ全体で横向きと縦向きの両方を許可したため、すべての縦向きのみUIViewController
に自動回転しないように指示し、このメソッドの実装を追加する必要があります。
- (BOOL)shouldAutorotate {
return NO;
}
最後に、特定のランドスケープのみのコントローラーについて、そしてモーダルでそれを提示すると言ったので、これらのメソッドを実装するだけです:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft; // or Right of course
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
これが役立つことを願って、
スイフト
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
_
Yaroslavのソリューションをフォローアップするには、1つのビューのみでランドスケープモードへの回転を許可するために、ランドスケープビューコントローラーのviewWillAppearメソッドでshouldRotateをYESに設定し、viewWillDisappearでNOに設定する必要があります。
ViewWillAppearでShouldRotateのみをYESに設定した場合、このView Controllerが存在すると、他のすべてのView Controllerも同様に回転します。そのため、viewWillDisappearでShouldRotateをNOに設定して、ポートレートビューの回転を制限する必要があります。
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)
}
パブリッククラス警告なしでパブリックプロパティを削除するには、shouldRotateをinternalとして宣言する必要があります。 internal var shouldRotate = false