1

実装したいアイデアがあります:

基本的に、アプリケーションにログインしているかどうかを簡単に区別できるようにしたいと考えています。私の考えでは、ユーザーがログインしていない場合、アプリは UIAppearence プロキシで背景色などを設定します。ログイン後、これらの値は UIAppearence 設定を変更することで変更されます。

私はこの種の作品を見つけましたが、UIAppearence を変更した後にすべての UI 要素が更新されるわけではありません。最も顕著な例は、私の UITabBarController (私のウィンドウの rootViewController) のタブ バーです。

この問題の解決策を探しているときに、ビューを更新して UIAppearence への変更を適用するために呼び出す必要があるいくつlayoutSubviewsかの提案を見つけました。drawRectただし、アプリのデリゲートで次のすべてを試しましたが、成功しませんでした。

[self.window.rootViewController.view setNeedsLayout]
[self.window.rootViewController.view setNeedsDisplay]

[self.tabbarController.tabBar setNeedsLayout]
[self.tabbarController.tabBar setNeedsDisplay]

[self.tabbarController.view setNeedsLayout]
[self.tabbarController.view setNeedsDisplay]

タブバー (およびその他のビュー) を強制的に再描画する方法について、トリックや洞察を持っている人はいますか? layoutSubviewsUIView階層のずっと下まで呼び出しを送信したいだけだと思っていますが、そうであれば、まだそれを行う方法が見つかりません。

4

4 に答える 4

4

UIAppearance プロパティは、ビューがビュー階層に追加された後に設定されます。再度トリガーする最も簡単な方法は、キー ウィンドウの rootViewController をデタッチしてから、再度アタッチすることです。キー ウィンドウのサブビューを削除して、再度追加することもできます。

于 2013-04-14T22:57:33.270 に答える
1

KVOを使用してカスタムUITabBarに通知しました。

私のトリックは:

  1. UITabBarサブクラスを作成します
  2. XIB/StoryBoardのUITabBarControllerにリンクします
  3. アイテムの作成時にオブザーバーを追加します(オーバーライド-(void)setItems:(NSArray *)itemsアニメーション:(BOOL)animate)
  4. オブザーバーを処理する
于 2013-01-16T10:54:14.240 に答える
1

内部テーマを変更した後、アプリケーションの UIAppearance を更新するために使用するスニペットを次に示します。

NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window in windows) {
    for (UIView *view in window.subviews) {
        [view removeFromSuperview];
        [window addSubview:view];
    }
}

http://snipplr.com/view/75259/refresh-uiappearance-after-application-loaded/

それがあなたのニーズに合うことを願っています、私にとっては完璧です.

于 2014-07-17T07:42:43.313 に答える
0

あなたがこの問題を尋ねてから長い時間が経ちました。ダークモード(iOS13)を適用しようとしたときに同じ問題に直面しました。

UITabbar は「appearance API」で変更され、モードが変更されたときに変更されましたが、何も変更されていません。テキストの色とフォントを強制的に変更する必要があります。

私の解決策は次のとおりです。

  1. UIViewController のサブクラスに「traitCollectionDidChange」API を実装します。
  2. UITabbar の項目を繰り返す
  3. UITabbarItem の「setTitleTextAttributes」を使用した setTitleAttributes

ありがとう。

于 2019-09-10T01:07:19.707 に答える