Closed2

【Swift】Appearance Customization 0 -> 1

yoshitakayoshitaka

Appearance Customization

アプリにダークモードのサポートを追加し、バーの外観をカスタマイズし、外観プロキシを使用してUIを変更します。

yoshitakayoshitaka

UIAppearance

クラスの外観プロキシへのアクセスを提供するメソッドのコレクション。

protocol UIAppearance

クラスの外観プロキシに外観変更メッセージを送信することにより、クラスのインスタンスの外観をカスタマイズできます。

iOSは、ビューがウィンドウに入るときに外観の変更を適用しますが、すでにウィンドウにあるビューの外観は変更しません。 現在ウィンドウにあるビューの外観を変更するには、ビュー階層からビューを削除してから元に戻します。

オブジェクトの外観をカスタマイズするには、すべてのインスタンスと、コンテナクラスのインスタンスに含まれるインスタンスの2つの方法があります。

  • クラスのすべてのインスタンスの外観をカスタマイズするには、appearance()を使用してクラスの外観プロキシを取得します。 たとえば、UINavigationBarのすべてのインスタンスのバーの背景の色合いを変更するには、次のようにします。
[[UINavigationBar appearance] setBarTintColor:myNavBarBackgroundColor];
  • コンテナクラスのインスタンスまたは階層内のインスタンスに含まれている場合のクラスのインスタンスの外観をカスタマイズするには、appearanceWhenContainedIn:を使用してクラスの外観プロキシを取得します。 たとえば、ナビゲーションバーを含むオブジェクトに基づいて、バーボタンの外観を変更するには、次のようにします。
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
       setBackgroundImage:myNavBarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UIPopoverController class], nil]
        setBackgroundImage:myPopoverNavBarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil]
        setBackgroundImage:myToolbarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], [UIPopoverController class], nil]
        setBackgroundImage:myPopoverToolbarButtonBackgroundImage forState:state barMetrics:metrics];

どのビュー階層でも、最も外側の外観プロキシが優先されます。 特異性(チェーンの深さ)はタイブレーカーです。 つまり、appearanceWhenContainedIn:の包含ステートメントは半順序として扱われます。 具体的な順序(実際のサブビュー階層)が与えられると、UIKitは、ウィンドウから実際の階層を読み取るときに最初に一意に一致する部分的な順序を選択します。

トレイトコレクションを指定することで、クラスのどのインスタンスの外観をカスタマイズするかをさらに絞り込むことができます。 外観(for :)メソッドとappearanceForTraitCollection:whenContainedIn:メソッドを使用して、指定されたトレイトコレクションを持つクラスのプロキシを取得します。

外観のカスタマイズをサポートするには、クラスがUIAppearanceContainerプロトコルに準拠している必要があり、関連するアクセサーメソッドがUI_APPEARANCE_SELECTORでマークされている必要があります。

このスクラップは2021/05/16にクローズされました