はじめに
navigationBar
について色々調べていたのですが、iOS13 以降からナビゲーションの挙動がおかしいなと思って色々調べていくうちにどハマりしてしまった案件になります。
iOS13 から結構いろんなパーツがクラス化されたような感じになってるのですね。
環境
iOS バージョン 13
Xcode 11.3
該当コード
/// 呼び出し
- (void)viewDidLoad {
self.navigationItem.prompt = @"ナビゲーションバープロンプト";
// navigationBar の promptColor を変更する
[self promptColor:UIColor.whiteColor];
}
/// navigationBar の promptColor を変更する
- (void)promptColor:(UIColor *)promptColor {
/// 参考(appearance)
Class promptClass = NSClassFromString(@"_UINavigationBarModernPromptView");
if (promptClass) {
UILabel *promptLabel = [UILabel appearanceWhenContainedInInstancesOfClasses:@[promptClass]];
promptLabel.textColor = promptColor;
}
// Promptを探し出して、色を変更する
[self searchPromptSubviews:self.view promptColor:promptColor];
}
/// Promptを探し出して、色を変更する
- (void)searchPromptSubviews:(UIView *)superView promptColor:(UIColor *)promptColor {
/// 参考(__kindof)
for (__kindof UIView *view in [superView subviews]) {
/// 参考(_UINavigationBarModernPromptView)
if ([superView isKindOfClass:NSClassFromString(@"_UINavigationBarModernPromptView")]) {
if ([view isKindOfClass:[UILabel class]]) {
UILabel *promptLabel = view;
promptLabel.textColor = promptColor;
}
}
[self searchPromptSubviews:view promptColor:promptColor];
}
}
抑えておきたいポイント
_UINavigationBarModernPromptView
今回のメインテーマであります prompt はどこにあるのか?というところで、self.view の上にいくつかの subviews の上にpromptViewやpromptLabel があるはず!!
というのを信じて、Apple で、定義されているものがあったりと、いろんなクラス定義で、作られています。
もちろんpromptも例外ではないですが、そもそも一度も生成していないと設定していないと、変更されません。。。
if ([superView isKindOfClass:NSClassFromString(@"_UINavigationBarModernPromptView")]) {
if ([view isKindOfClass:[UILabel class]]) {
UILabel *promptLabel = view;
promptLabel.textColor = promptColor;
}
}
appearance
今回これが結構キーな気がします。最初の状態では、promptを設定していない場合は、以下の書き方が必要になります。
実は、共通で指定するクラスへアプローチをかけれる(appearance)ですが、以下のように指定するクラスに対して絞り込みをすることが可能です。
※ これは生成されてしまうと呼ばれないようなので、今回ここでつまづきました。
appearanceWhenContainedInInstancesOfClasses
Class promptClass = NSClassFromString(@"_UINavigationBarModernPromptView");
if (promptClass) {
UILabel *promptLabel = [UILabel appearanceWhenContainedInInstancesOfClasses:@[promptClass]];
promptLabel.textColor = promptColor;
}
__kindof
この辺りは結構テクニックなのですが、__kindof を用いることで、似たような類似のクラスという定義にすることができます。
for (__kindof UIView *view in [superView subviews]) {
/// 処理を行う
}
おわり
上記のように 表示されているビュー全部をみる時などは、メソッド内メソッドの呼び出しは、テクニックが必要になってきます。
最悪の場合、ループに入ってしまったりするので、呼び出しの際注意が必要だったりしますね!!
ちなみに、iOS12 デザインを採用したい場合は以下を参考に
関連記事
-
【ObjectiveC】- ナビゲージョンバー 背景を変更する
-
【ObjectiveC】- ナビゲージョンバー prompt の色変更
関連記事
【About】(http://qiita.com/sunstripe) - サンストライプ
制作チーム:サンストライプ
(月1 WEBコンテンツをリリースして便利な世の中を作っていくぞ!!ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)
緩募
地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます!!
https://the.themedia.jp/
ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える
プログラミングワークショップ・ウェブ塾の開講!!!
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
プログラミングサロン 月1だけのプログラミング学習塾
協力応援 / 支援者の集い
チーム:サンストライプ
プログラミングラボ
一緒にポートフォリオを作りませんか?現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週1のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております!!
興味がある方は、DMに話しかけてみてください。
トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼、人と考えてます。
「コンサルティング」と「クリエイティブ」の両角度から「人材戦略パートナー」としてトータル的にサポートします!!
キャリア教育事業
青空プログラミング
広域学習支援プラットフォーム『のびのび日和』
#スポンサー募集
ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております