Swiftで横画面を固定する方法10選

Swift言語を使用して横画面を固定するアイコンとサンプルコード Swift
この記事は約21分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

アプリ開発におけるデザインやUI/UXはユーザー体験を大きく左右します。特に、アプリの画面向きはその一部として非常に重要です。

この記事を読めば、Swiftを使ってアプリの横画面を固定する方法を10通り学べます。

何度か使ってみて、「このアプリは縦画面でしか使えないのかな?」と思ったことはありませんか?

また、逆に「縦画面でこの機能を使いたいのに…」と感じることもあるでしょう。

アプリの画面向きを制御することで、そういったユーザーのニーズに応えられるようになります。

●Swiftとは

Swiftは、Appleが2014年に公開したプログラミング言語です。

iOS、macOS、watchOS、tvOSなど、Appleの各プラットフォーム向けのアプリケーション開発に利用されています。

CやObjective-Cとは異なり、Swiftはモダンで、安全性や性能向上に焦点を当てた言語設計となっています。

○Swiftの基本概要

Swiftは、コードが読みやすく、効率的であることを特長としています。

型推論を活用して冗長性を減少させつつ、コンパイラの最適化により高速に実行できるコードを生成します。

また、Swiftはオブジェクト指向、プロトコル指向、関数型プログラミングの各パラダイムをサポートしており、多様なプログラミングスタイルに対応しています。

○横画面とその重要性

スマートフォンやタブレットの利用シーンは多岐にわたります。動画視聴、ゲーム、文書作成など、タスクによって適切な画面向きが異なります。

そのため、アプリ開発者としては、ユーザーの利用シーンやデバイスの特性を考慮し、適切な画面向きを提供することが求められます。

横画面を固定することで、アプリが提供する情報や機能を最大限に活用するための画面レイアウトを提供することができます。

特に、動画再生やゲームなどのコンテンツでは、横画面がユーザーにとって最も自然で快適な体験を提供できる場合が多いです。

●横画面を固定する10の方法

Swiftでアプリ開発を進める際、横画面の固定は数多くのシチュエーションで求められます。

ここでは、横画面を固定するための10の方法を、サンプルコードとともにご紹介します。

○サンプルコード1:基本的な横画面固定法

このコードでは、アプリの横画面を基本的な方法で固定するコードを紹介しています。

この例では、プロジェクトの設定から固定しています。

  1. Xcodeのプロジェクト設定を開く
  2. 「General」タブを選択
  3. 「Deployment Info」セクションにある「Device Orientation」で、「Landscape Left」と「Landscape Right」のみを選択し、他は非選択とする。

これにより、アプリは横画面のみで表示されるようになります。

○サンプルコード2:特定のビューコントローラでの固定法

特定のビューコントローラだけで画面の向きを固定したい場合は、次のようなコードを使います。

この例では、UIViewControllerのメソッドをオーバーライドして、固定したい向きを返すようにしています。

import UIKit

class LandscapeViewController: UIViewController {

    // 画面の向きのサポートをオーバーライド
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
    }
}

上記のコードでは、LandscapeViewControllerというビューコントローラでは、画面が横向きにしかならないように指定しています。

このビューコントローラを表示すると、自動的に横画面になり、他の画面に移動すると、再び縦画面に戻ります。

○サンプルコード3:条件に応じた横画面固定

Swiftでのアプリ開発では、ユーザーのアクションやアプリの状態に応じて、画面の向きを動的に制御することが求められる場面があります。

このコードでは、特定の条件下でのみ横画面を固定する方法を表しています。

この例では、特定のボタンが押されたときに、横画面に固定する機能を実装しています。

import UIKit

class DynamicOrientationViewController: UIViewController {

    var isLandscapeLocked = false

    // 画面の向きのサポートをオーバーライド
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return isLandscapeLocked ? .landscape : .all
    }

    @IBAction func lockLandscapeButtonPressed(_ sender: UIButton) {
        isLandscapeLocked = true
        // 強制的に画面の向きを更新
        UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
    }
}

上記のコードでは、isLandscapeLockedという変数で横画面固定の状態を管理しています。

lockLandscapeButtonPressedメソッドが呼び出されると、この変数がtrueになり、アプリの画面が横画面に固定されます。

また、UIDevice.current.setValueを使用して、画面の向きを強制的に変更しています。

このような実装を取り入れることで、アプリの中で条件に応じて画面の向きを制御することが可能になります。

○サンプルコード4:ユーザーの設定による固定法

多くのアプリでは、ユーザーが自身の好みに応じて、画面の向きを固定できる設定を提供しています。

このコードでは、ユーザーの設定に基づいて横画面を固定する方法を紹介しています。

この例では、UserDefaultsを使用して、ユーザーの設定を保存・取得しています。

import UIKit

class UserSettingViewController: UIViewController {

    // UserDefaultsのキー
    let landscapeLockKey = "landscapeLockKey"

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UserDefaults.standard.bool(forKey: landscapeLockKey) ? .landscape : .all
    }

    // ユーザーの設定を保存するメソッド
    func saveUserSetting(isLandscape: Bool) {
        UserDefaults.standard.set(isLandscape, forKey: landscapeLockKey)
    }
}

このコードのsaveUserSettingメソッドを呼び出すことで、ユーザーの設定を保存できます。保存された設定に基づいて、画面の向きが制御されます。

この実装を採用することで、ユーザーの好みを反映した画面向きの制御が実現されます。

○サンプルコード5:複数のデバイスに対応した固定法

Swiftでのアプリ開発では、iPhoneやiPadといった異なるデバイスに対応する必要があります。

それぞれのデバイスでの表示や操作性を最適化するため、デバイスごとに異なる画面固定の方法を採用することが考えられます。

このコードでは、デバイスのタイプに応じて横画面を固定する方法を紹介しています。

この例では、UIDeviceのプロパティを活用してデバイスの判定を行い、それに基づいて画面の向きを固定しています。

import UIKit

class DeviceSpecificViewController: UIViewController {

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        // iPadの場合
        if UIDevice.current.userInterfaceIdiom == .pad {
            return .all
        } else { // iPhoneの場合
            return .landscape
        }
    }
}

このサンプルコードでは、UIDevice.current.userInterfaceIdiomを使用してデバイスのタイプを判定しています。

iPadの場合は、任意の画面向きをサポートし、iPhoneの場合は横画面に固定するようにしています。

○サンプルコード6:横画面固定時のUI調整

横画面に固定する際、UIのレイアウトや配置が不自然になる場合があります。そのような時は、横画面固定時にUIの調整を行うことが必要です。

このコードでは、横画面固定時にUIの位置やサイズを調整する方法を表しています。

この例では、画面の向きを検出し、その向きに応じてUIの配置を変更する処理を行っています。

import UIKit

class LandscapeUIAdjustmentViewController: UIViewController {

    @IBOutlet weak var sampleLabel: UILabel!

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        if view.bounds.width > view.bounds.height { // 横画面の場合
            sampleLabel.font = UIFont.systemFont(ofSize: 30)
        } else { // 縦画面の場合
            sampleLabel.font = UIFont.systemFont(ofSize: 20)
        }
    }
}

上記のコードでは、viewWillLayoutSubviewsメソッドをオーバーライドして、画面の向きに応じてラベルのフォントサイズを調整しています。

このようにして、横画面時には大きなフォント、縦画面時には小さなフォントを表示するようにしています。

○サンプルコード7:アニメーションとの連動

Swiftにおけるアプリ開発では、横画面固定だけでなく、アニメーションとの連携も頻繁に行われるケースが増えています。

例えば、画面の回転アニメーションとともに特定のUI要素をアニメーションさせると、ユーザーエクスペリエンスの向上が期待できます。

このコードでは、横画面固定とアニメーションを組み合わせて、スムーズな画面遷移を実現する方法を紹介しています。

この例では、画面の向きが変わる際のアニメーションをカスタマイズして、特定のUI要素にもアニメーションを適用しています。

import UIKit

class AnimationLinkedViewController: UIViewController {

    @IBOutlet weak var animatedImageView: UIImageView!

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: { context in
            if self.view.frame.width < self.view.frame.height { // 横画面の場合
                self.animatedImageView.transform = CGAffineTransform(rotationAngle: .pi/2)
            } else { // 縦画面の場合
                self.animatedImageView.transform = .identity
            }
        })
    }
}

上記のサンプルコードでは、viewWillTransitionメソッドを使用して、画面の向きが変わるタイミングでアニメーションをカスタマイズしています。

特に、coordinator.animate(alongsideTransition:)を使用することで、画面の回転アニメーションと同時に、animatedImageViewの回転アニメーションも実行されるようになります。

○サンプルコード8:外部ライブラリを用いた方法

Swiftのアプリ開発には、様々な外部ライブラリが活用されています。横画面固定に関しても、効率的に実装するための外部ライブラリがいくつか存在します。

このコードでは、人気のある外部ライブラリを利用して、横画面固定を実現する方法を紹介しています。

この例では、特定のライブラリを導入して、簡単な設定だけで横画面固定を行っています。

// 必要なライブラリをインポート
import PopularScreenLockLibrary

class LibraryBasedViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // ライブラリの関数を使用して、横画面固定を設定
        PopularScreenLockLibrary.lockToLandscape()
    }
}

このサンプルコードで使用しているPopularScreenLockLibraryは、例示のための架空のライブラリ名です。

実際の開発では、使用するライブラリの公式ドキュメントやリファレンスを参照し、適切な方法で導入してください。

○サンプルコード9:特定の画面解像度での固定

アプリ開発を行う上で、多種多様なデバイスに対応することは避けては通れない課題となっています。

特に、iOSデバイスの中には様々な画面解像度が存在するため、特定の解像度のデバイスだけで横画面を固定する、といった対応が求められることもあります。

このコードでは、特定の画面解像度において横画面を固定する方法を紹介しています。

この例では、デバイスの画面解像度を取得し、それに基づいて横画面固定の設定を行っています。

import UIKit

class ResolutionSpecificViewController: UIViewController {

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        let screenSize = UIScreen.main.bounds.size
        let width = max(screenSize.width, screenSize.height)
        let height = min(screenSize.width, screenSize.height)

        // 例:iPhone 12 Pro Maxの解像度の場合のみ横画面固定
        if width == 844.0 && height == 390.0 {
            return .landscape
        } else {
            return .allButUpsideDown
        }
    }
}

このサンプルコードでは、デバイスの画面解像度を取得して、その解像度が特定の値(この場合、iPhone 12 Pro Maxの解像度)と一致する場合のみ、横画面に固定する設定を行っています。

それ以外の解像度の場合は、通常どおり全ての向きをサポートします。

○サンプルコード10:例外処理を伴う固定法

アプリの横画面固定に関する処理は、基本的には順調に動作しますが、稀に予期せぬエラーや例外が発生することがあります。

このような場合、例外処理を行うことで、ユーザーエクスペリエンスを損なうことなくアプリを安定して動作させることができます。

このコードでは、横画面固定時に例外が発生した場合のエラーハンドリングを取り入れた方法を紹介しています。

この例では、特定の条件下で横画面固定が正常に行われない場合の例外処理を実装しています。

import UIKit

class ExceptionHandlingViewController: UIViewController {

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        do {
            // 横画面固定の処理
            // 仮の例外条件として、特定の条件下でエラーを発生させる
            let condition = false // 実際の条件をここに記述
            if condition {
                throw NSError(domain: "com.example.myApp", code: 1001, userInfo: nil)
            }
            return .landscape
        } catch {
            print("横画面固定に失敗しました。エラーコード: \(error)")
            return .allButUpsideDown
        }
    }
}

このサンプルコードでは、do-catch文を使用して、横画面固定処理中に例外が発生した場合のエラーハンドリングを行っています。

例外が発生した場合には、エラーメッセージをコンソールに出力し、通常の画面向きを返してアプリのクラッシュを防いでいます。

●横画面を固定する際の注意点

Swiftでのアプリ開発において、横画面を固定する際には、細心の注意が必要です。

適切な固定方法を選択しないと、ユーザーエクスペリエンスの低下やアプリのクラッシュの原因となる可能性があります。

ここでは、横画面を固定する際の主な注意点を取り上げ、それぞれの対策を詳しく説明します。

○画面遷移時の挙動に注意

アプリケーションにおいて画面遷移は頻繁に行われる操作です。

横画面固定を行った際、画面遷移の挙動が予期しないものになることがあります。

特に、横画面固定の設定を行っている画面とそうでない画面が混在している場合には注意が必要です。

例えば、縦画面専用の画面から横画面固定の画面へ遷移すると、レイアウトが崩れることが考えられます。

そのため、画面遷移の前後で適切な画面向きの設定を行うことが求められます。

このコードでは、画面遷移前後の向きを制御するサンプルを紹介しています。

この例では、画面遷移前にデバイスの向きをチェックし、適切な向きに固定する処理を行っています。

import UIKit

class TransitionViewController: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let orientation = UIDevice.current.orientation
        if orientation.isLandscape {
            // 横画面の場合の処理
        } else {
            // 縦画面の場合の処理
        }
    }
}

このように、viewWillAppearメソッドを利用して、画面が表示される直前にデバイスの向きをチェックし、必要に応じて向きを変更することで、画面遷移時の挙動を制御することができます。

○デバイスの種類やOSバージョンによる違い

iOSデバイスは多種多様で、それぞれのデバイスやOSバージョンによって、横画面の固定方法や挙動が微妙に異なることがあります。

特に、古いOSバージョンや特定のデバイスでは、新しい方法がサポートされていない場合があります。

このコードでは、OSバージョンをチェックして、適切な横画面固定の方法を選択するサンプルを紹介しています。

この例では、iOSバージョンに応じて横画面固定の方法を変更する処理を行っています。

import UIKit

class DeviceSpecificViewController: UIViewController {

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if #available(iOS 14.0, *) {
            // iOS 14.0以降の横画面固定の方法
            return .landscape
        } else {
            // iOS 14.0未満の横画面固定の方法
            return .landscapeRight
        }
    }
}

このように、#availableを使用してOSバージョンをチェックし、それに基づいて適切な横画面固定の方法を選択することで、様々なデバイスやOSバージョンに適切に対応することができます。

●カスタマイズ方法

Swiftで横画面を固定する方法を学ぶ上で、さらにアプリケーションをカスタマイズして、ユーザーエクスペリエンスを向上させる方法も非常に重要です。

ここでは、横画面固定に関連するカスタマイズのアプローチをいくつか紹介し、それぞれの方法に対して実際のサンプルコードとその詳細な説明を添えて解説します。

○固定のスタイルやアニメーションの追加方法

横画面固定時に、さらに魅力的なUIやアニメーションを追加することで、ユーザーの満足度を向上させることができます。

例えば、画面の回転時にスムーズなアニメーションを追加することで、遷移の自然さを強調することができます。

このコードでは、UIViewのアニメーションメソッドを利用して、画面の回転時にフェードイン・フェードアウトのアニメーションを追加する方法を紹介しています。

この例では、横画面に遷移する際に0.5秒かけてフェードインして表示する方法を取り上げています。

import UIKit

class AnimationViewController: UIViewController {

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

        self.view.alpha = 0

        coordinator.animate(alongsideTransition: { _ in
            UIView.animate(withDuration: 0.5) {
                self.view.alpha = 1
            }
        }, completion: nil)
    }
}

このように、viewWillTransitionメソッド内でアニメーションを定義することで、画面の回転時にスムーズなアニメーションを追加することができます。

○他のプログラミング言語やツールとの連携

Swiftだけでなく、他のプログラミング言語やツールとの連携を考えることで、アプリケーションの可能性をさらに広げることができます。

例えば、JavaScriptを用いてWebコンテンツとの連携や、外部ツールを使用してデザインのカスタマイズを行う方法などが考えられます。

このコードでは、SwiftとJavaScriptを連携させ、Webコンテンツの横画面固定を制御する方法を紹介しています。

この例では、WKWebViewを使用してWebページを表示し、JavaScriptを実行して横画面固定を行っています。

import UIKit
import WebKit

class WebIntegrationViewController: UIViewController, WKNavigationDelegate {

    var webView: WKWebView!

    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let url = URL(string: "https://example.com") {
            webView.load(URLRequest(url: url))
        }
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.body.style.transform = 'rotate(90deg)';", completionHandler: nil)
    }
}

上記のサンプルコードでは、Webページが完全に読み込まれた後、JavaScriptのdocument.body.style.transformを使用してページを90度回転させ、横画面表示を模倣しています。

まとめ

Swiftを用いてアプリの横画面を固定する方法は多岐にわたり、初心者から上級者までさまざまなテクニックやアプローチが存在します。

本記事では、横画面を固定する基本的な方法から、特定の条件や状況に応じての固定方法、さらにはアニメーションや外部ツールとの連携によるカスタマイズ方法まで、幅広く取り上げました。

横画面固定の基本的な手法をはじめ、さまざまな状況や条件での固定方法を知ることで、アプリ開発時の選択肢が広がります。

また、ユーザーエクスペリエンスの向上のために、アニメーションの追加やカスタマイズも効果的です。

Swiftにおけるこれらの機能や技術を駆使することで、ユーザーにとって使いやすく、かつ魅力的なアプリを作成することができるでしょう。

アプリ開発の際は、本記事で紹介した内容を参考に、横画面固定の最適な方法を選択してください。

最後に、アプリ開発は絶えず進化する分野であり、新しい技術や方法が日々生まれています。

そのため、常に最新の情報や技術にアップデートし続けることが、質の高いアプリを作り上げるための鍵となるでしょう。

これにて、Swiftを使用してアプリの横画面を固定する方法に関する解説を終了します。

あなたのアプリ開発に本記事が少しでも役立てば幸いです。