UILabels
は のサブクラスでUIView
あるため、iOS 7 で実行している場合、プロパティがあり、ティント カラーが に設定されている場合 (デフォルト) tintColor
、親ビューからその色を継承します。nil
Appleのドキュメントから:
デフォルトでは、ビューのティント カラーは nil です。これは、ビューがその親のティントを使用することを意味します。また、ビューにティント カラーを要求すると、設定していなくても常にカラー値が返されることも意味します。
ただし、「アプリのランタイム内の任意の時点で window.tintColor を変更すると、UILabel の tintColour も自動的に変更されるかどうか」という質問も出されます。Apple は、項目が画面に表示されているときは色合いを変更しないことをお勧めします。
一般に、ビューが画面外にあるときにビューの色合いを変更することをお勧めします。
これは、さまざまな UI 要素がすべて tintColor の変更を検出し、表示されているビューを更新するという保証がないためだと思います。ただし、UIView
ドキュメントでは、画面に表示されtintColor
ている間に更新する場合の回避策を提案しています。UILables
このプロパティが変更されたときにサブビューのレンダリングを更新するには、tintColorDidChange メソッドをオーバーライドします。
そのため、親ビューの が変更さtintColorDidChange
れたときに色合いが更新される必要がある、現在画面上にあるビューを呼び出すようにしてください。tintColor
UILabel
しかし、あなたの の色を更新しないのはなぜですか?
上記は、さまざまな を設定および更新するのに役立ちますがtintColor
、効果が見られません-なぜですか?
それは、Apple が Tint に表示するように設計したことと関係があります。ヒューマン インターフェイス ガイドラインから:
色はインタラクティブ性を強く視覚的に示します
Apple は、インタラクティブな要素の周りの境界線とグラデーションを取り除き、それらを色に置き換えましたtintColor
。背後にある全体的な考え方tintColor
は、ユーザーがタップできるものは取得し、タップできないものは取得しないということです。
UILabel
はインタラクティブな要素ではなく、テキストによる説明です。そのため、Apple では を設定することができますがtintColor
(いずれもUIView
がありますtintColor
)、tintColor
描画方法は変更されません。
それで、あなたは何をすべきですか?まず、ボタンだけでなく薄い色にすることは、アプリの UI の選択として適切ではない可能性があることに注意してください。iOS 7 ユーザーと Apple アプリのレビュアーは、これらのルールに従うことを期待しています。
それで、あなたUILabel
は色から自由に保つことを余儀なくされていますか?
いいえ-特に「正しい」ことをしている場合。アップルは次のように説明しています。
コンテンツ領域では、必要な場合にのみボタンの境界線または背景を追加します。バー、アクション シート、およびアラートのボタンに境界線は必要ありません。ユーザーは、これらの領域のほとんどのアイテムがインタラクティブであることを知っているからです。一方、コンテンツ領域では、他のコンテンツと区別するために、ボタンに境界線または背景が必要になる場合があります。
アプリの UI を検討することをお勧めします。非tintColor
インタラクティブな要素をインタラクティブな要素と同じにしたい場合は、境界線や背景色など、より多くのものを使用して、ユーザー (および Apple アプリのレビュアー) がクリック可能なものとそうでないものを理解できるようにしてください。 .
色を更新する方法については、手動でプロパティを任意の色に設定するか、そのオーバーライドtextColor
の独自のサブクラスを作成して、通知が送信されたときにプロパティを更新する必要があります。親の に一致するようにテキストが更新される。UILabel
- (void)tintColorDidChange
textColor
UILabel
tintColor
これが役立つことを願っています!