サーチ…


備考

適応型アプリケーションを構築する際には、サイズクラスの限界に留意してください。正確なピクセルサイズやデバイスを特定するガイドではなく、 一般化されています。アプリが実行されているデバイスや、サイズクラスに基づいて分割画面モードになっているデバイスを決して特定しないでください。

代わりに、サイズクラスに関する高レベルのレイアウト決定を行い、オートレイアウトを使用して正確なビューフレームを変更します。 (移行後のコントローラのビューの大きさのより正確な通知については、UIViewControllerメソッドviewWillTransition(to:with:)を参照してください)。

特集コレクション

iOSアプリケーションでは、ユーザーインターフェースは一般的な形状とサイズのうちの1つを取ることができます。これらはサイズクラスを使用して定義され、ビューまたはビューコントローラの特性コレクションを通じて使用できます。

Appleは、 レギュラーコンパクトという 2つのサイズクラスを定義しています。これらのサイズクラスはそれぞれ、デバイスの両方の軸( 水平および垂直 )で使用できます。あなたのアプリは、これらの4つの州に存続しています。簡略化して、開発者は、水平軸を先にして、2つのサイズクラスを記述または記述することによって、サイズクラスの組み合わせを記述することがよくあります。「コンパクト/レギュラー」は、水平にコンパクトですが、

あなたのアプリでは、UITraitEnvironmentプロトコルのメソッドを使って現在のサイズクラスをチェックし、変更に対応します:

class MyViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Horizontal size class: \(traitCollection.horizontalSizeClass)")
        print("Vertical size class: \(traitCollection.verticalSizeClass)")
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print("Trait collection changed; size classes may be different.")
    }
}

UIViewとUIViewControllerの両方がUITraitEnvironmentに準拠しているため、現在の特性コレクションを見て、どちらかのサブクラスの変更を処理できます。

特性コレクションの変更による自動レイアウトの更新

レイアウトを変更してサイズクラスの変更に対応するアプリを適応させるには、多くの場合、自動レイアウトシステムのサポートが必要です。アプリが適応的になる主な方法の1つは、ビューのサイズクラスが変更されたときにアクティブな自動レイアウト制約を更新することです。

たとえば、UIStackViewを使用して2つのUILabelを配置するアプリケーションを考えてみましょう。これらのラベルを水平にコンパクトな環境で重ねることをお勧めしますが、水平に規則的な環境に少し余裕があるときは、隣り合わせに座ってください。

class ViewController: UIViewController {
    var stackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        stackView = UIStackView()
        for text in ["foo", "bar"] {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = text
            stackView.addArrangedSubview(label)
        }
        
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    private func updateAxis(forTraitCollection traitCollection: UITraitCollection) {
        switch traitCollection.horizontalSizeClass {
        case .regular:
            stackView.axis = .horizontal
        case .compact:
            stackView.axis = .vertical
        case .unspecified:
            print("Unspecified size class!")
            stackView.axis = .horizontal
        }
    }
}

iPadでのiOSマルチタスクのサポート

最新のiOSアプリでは、適応性の重要な部分がiPad上でマルチタスクをサポートしています。デフォルトでは、Xcode 7以降で作成されたアプリケーションは、マルチタスクをサポートするように設定されます。自動レイアウトを使用するLaunchScreen.storyboardファイルがあります。

既存のアプリがマルチタスキングを選択する最も簡単な方法は、そのようなストーリーボードを作成し、それをプロジェクトの起動画面として設定することです。

起動画面ストーリーボードの追加

Launch Screen Fileオプションの設定

あなたのアプリがiPadのマルチタスクをサポートしたら、既存のビューを監査してコントローラを表示して、自動レイアウトを使用していることを確認し、さまざまなサイズクラスの組み合わせをサポートできます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow