[解決済み] Swiftで1つのビューコントローラの向きを縦向きのみに固定する方法
2022-07-23 17:07:40
質問
私のアプリはすべての方向をサポートするようになったので 特定のUIViewControllerにポートレートモードのみをロックしたいのですが。
例:タブ型アプリケーションで、サインインビューが表示されたとき、ユーザーがデバイスをどのように回転させても、また現在のデバイスの向きがどうであっても、そのサインインビューだけをポートレートモードにしたい。
どのように解決するのですか?
複数のナビゲーションコントローラやタブビューコントローラを持つような複雑なビュー階層を持つ場合、事態は非常に混乱します。
この実装では、App Delegate がサブビューを順次検索する代わりに、個々のビューコントローラが方向性をロックするタイミングを設定するようになっています。
Swift 3, 4, 5
AppDelegateで。
/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
他のグローバルな構造体やヘルパークラスで、ここではAppUtilityを作成しました。
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
/// OPTIONAL Added method to adjust lock and rotate to the desired orientation
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
次に、目的のViewControllerで、向きを固定したい。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
// Or to rotate and lock
// AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Don't forget to reset when view is being removed
AppUtility.lockOrientation(.all)
}
iPadまたはユニバーサルアプリの場合
ターゲット設定 -> General -> Deployment Info で "Requires full screen" にチェックが入っていることを確認します。
supportedInterfaceOrientationsFor
にチェックが入っていないと、デリゲートが呼び出されません。
関連
-
Swiftがエラーを報告。アボートトラップ:6
-
Swift Error fatal error: Optional value のアンラップ中に予期せず nil を発見した。
-
swift 4.0でのdispatch_async,dispatch_afterの使用について
-
[解決済み】強制的に縦長モードにする方法
-
[解決済み] Flutter。画面の向きをオンデマンドで設定・ロックする方法
-
[解決済み] Swiftダブルからストリング
-
[解決済み] ""内の二重引用符を印刷するには?
-
[解決済み] Swift: PREPROCESSORフラグ(`#if DEBUG`など)を使ってAPIキーを実装する方法とは?
-
[解決済み] Swift: インデックスで文字列配列を置換する
-
[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Swiftがエラーを報告。アボートトラップ:6
-
Swift Error fatal error: Optional value のアンラップ中に予期せず nil を発見した。
-
Swift の Optional 値 && Optional のアンラップ時に予期せず nil が検出された場合の説明
-
[解決済み] Swiftダブルからストリング
-
[解決済み] ""内の二重引用符を印刷するには?
-
[解決済み] Swiftで範囲を作成する方法は?
-
[解決済み] Swift: PREPROCESSORフラグ(`#if DEBUG`など)を使ってAPIキーを実装する方法とは?
-
[解決済み] Swift: インデックスで文字列配列を置換する
-
[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える
-
[解決済み] swiftにおける "precondition "と "assert "の違いとは?