基本的には縦画面固定で、動画をフルスクリーンで再生するときだけ横画面を許可したいのですが、方法はありますでしょうか?
WebViewでInstagramの画像やYoutubeの動画を表示しており、そこでは縦画面で固定しているのですが、Youtubeの動画を再生するときだけは、横画面表示を許可したいです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
質問者さんが質問されたことには私もかなり苦戦しました
以下は、私がxcode8のswift2.3(本当はswift3.0なのですが、Build SettingsのSwift Compiler versionででUse Legacy Swift Language versionをYesにしています)で実装してうまくいった方法です(非常に回りくどいので確実にもっといい方法があるでしょうが…)
ただ、画面の回転可能性の設定に関しては、swiftのバージョンやiosのバージョンによっても方法がかなり異なり、うまくいったりいかなかったりするので、注意が必要です
方法の概要は、まず一旦全方向の回転を許可しておき、回転を禁止するビューにはそれぞれ回転を禁止する処理を書きます。次に、動画を表示するビューは最初は回転を禁止し、画面が全画面になったことを検知して回転を許可します。
先に参考になったページを載せておきますね
How to lock viewController in Portrait mode -stack overflow
- まず[アプリ名]→General→Deployment Info→Device Orientation のチェックボックスの「
Portrait
」と「Landscape Left
」と「Landscape Right
」にチェックを入れてください
(一旦全ての方向の回転を許可します)
2. AppDelegate.swift
内のAppDelegate
クラス直下に、以下を書き込んでください
swift
1var shouldSupportAllOrientation = false 2 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { 3 if (shouldSupportAllOrientation == true){ 4 return UIInterfaceOrientationMask.All 5 } 6 return UIInterfaceOrientationMask.Portrait 7 }
3.回転を全面禁止するビューのviewControllerの、viewWillAppear
メソッドの中に、以下を書き込んでください。これにより回転を禁止します
swift
1 //回転禁止 2 let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate 3 appdelegate.shouldSupportAllOrientation = false
4.次に全画面表示になったことを検知しましょう。動画を再生するviewControllerのviewDidLoad
メソッド内に、以下を書き込んでください
swift
1//全画面表示になったことを検知 2//wideViewメソッドはあとで書きます 3NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.wideView), name: UIWindowDidBecomeKeyNotification, object: nil)
これにより、同じクラス内の、wideView
メソッドが呼ばれます。ただし、このnotificationは**「全画面になった時」と「全画面を閉じた時の両方呼ばれる**ので、注意が必要です
5.wideView
メソッドを定義する前に、二つほど準備があります
まず、変数名はどうでもいいですが、canRotateInt
という変数を定義します。
これは、1の時回転不可、-1の時回転可能になるようにします。(このようにすることでうまいこといきます)
これをまずクラス変数として定義し、初期値は1とします。
swift
1 var canRotateInt = 1 //1は回転不可、−1は回転可能
次に、rotateSet
という、canRotateInt
の値に従って画面の回転可能性を司るメソッドを定義します。
swift
1//画面の回転可能性の設定 2 func rotateSet(rotateInt: Int){ 3 let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate 4 if rotateInt == 1{ 5 //強制的に縦表示に戻す 6 appdelegate.shouldSupportAllOrientation = false 7 let value = UIInterfaceOrientation.Portrait.rawValue 8 UIDevice.currentDevice().setValue(value, forKey: "orientation") 9 }else{ 10 //回転を許可する 11 appdelegate.shouldSupportAllOrientation = true 12 } 13 }
また、動画再生画面に遷移してきた時はまだ回転可能にしたくないので、viewDidLoad
メソッド内で、
swift
1 rotateSet(1)
と書き、初めは回転を禁止しておきます。
6.最後に、wideView
メソッドです。同じく動画を再生するviewControllerの中に以下のメソッドを追加してください
swift
1//全画面表示になった時に呼び出される処理 2 func wideView(){ 3 //回転可能と不能を切りかえる 全画面になる時と閉じる時の両方呼ばれるからこうしなきゃいけない 4 canRotateInt = canRotateInt*(-1) 5 rotateSet(canRotateInt) 6 }
先述のようにwideView
メソッドは全画面になった時と全画面を閉じた時の両方呼ばれるので、canRotateInt
を-1倍することで、回転可能と回転禁止を切り替えることができます。
私はまだまだswift初心者なので、コードが非常に回りくどく、面倒なものになってしまいましたが、私の環境下では実行できました!
投稿2016/12/04 16:19
総合スコア31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。