アプリにUIWebViewがありますが、問題は、セグメント化されたコントロールの外観を変更するUIAppearanceがあるため、UIWebViewテキストフィールドの入力アクセサリビューのセグメント化されたコントロールを変更することです。正しく表示されるようにしたいと思います。またはそれを変更しようとしないでください。これは現在のように見えます:
2 に答える
[UIAppearanceappearance]の代わりに[UIAppearanceappearanceWhenContainedIn:]を使用して、この問題を自分で解決しました。
これを使用するには、カスタマイズする要素を含むすべてのカスタムViewControllerクラスのnilで終了するリストをセレクターに送信します。だから代わりに
[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
使用する
[[UISegmentedControl appearanceWhenContainedIn:[MyViewController class], [MyOtherViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
すべてのViewControllerをリストする必要はなく、最上位のViewControllerだけをリストする必要があります。これにより、次のトリックも可能になります。サブクラスである以外の何もしないUIViewControllerの「空の」サブクラスCustomizedViewControllerを作成し、UIViewControllerからではなくコード全体からサブクラスを作成します(基本的に、「UIViewController」のすべての出現箇所を「CustomizedViewController」に置き換えます) --CustomizedViewControllerが実際にUIViewControllerをスーパークラスとして宣言した場合を除きます。
次に、
[[UISegmentedControl appearanceWhenContainedIn:[CustomizedViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
さて、私はついにこれの回避策を見つけることができました。その答えが私にとってうまくいかない理由を説明する現在の答えについての私のコメントを参照してください。
繰り返しになりますが、キーボードアクセサリを作成しているiOSコードは、UIToolbarの背景を明示的に設定しているため、UIAppearanceの背景設定は取得できませんが、UIBarButtonItemのスタイルは取得できます。結果はハーフスタイルのビューになり、かなり見栄えが悪くなる可能性があります。幸い、私のデザイナーは、この特定のケースのデフォルトのスタイルにフォールバックすることに問題はありませんでした。
したがって、トリックは、UIAppearanceを介してスタイル設定されないようにそのビューを取得する方法を理解することでした。私がこれをした方法はこれを置き換えることでした:
id barButtonAppearanceProxy = [UIBarButtonItem appearance];
これとともに:
// wtf: Style any UIBarButtonItem associated with a UIViewController
id barButtonAppearanceProxy = [UIBarButtonItem appearanceWhenContainedIn:[UIViewController class], nil];
これは、ビュー階層の観点から包含を考えていたため、最初は奇妙に思えました...しかし、これは、UIViewControllerに関連付けられたUIBarButtonItemsのみをスタイル設定することを示しています。これがキーボードアクセサリに影響を与えない理由は、親ビューのウィンドウに直接追加され、UIViewControllerに関連付けられていないためです。
理想的には、UIAppearanceを使用してキーボードアクセサリのスタイルを設定するだけなので、これはまだ完全なソリューションではありません。また、すべてのツールバーがUIViewControllersに関連付けられていることを前提としています。私(そしておそらくあなたのほとんど)にとって幸いなことに、これは通常の場合です。