4

UINavigationBar をUIAppearanceでスタイリングしています。すべての戻るボタンに灰色のテキストを表示し、すべての rightBarButtonItems に緑色のテキストを表示します (色は仮定上のものです)。どちらのボタンもデフォルトで UIBarButtonItems であるため、UIAppearance は 2 つを区別できません。そこで、UIBarButtonItem をサブクラス化し、ActionBarButtonItem と呼ぶことにしました。この新しいサブクラスは、rightBarButtonItem が必要な場所で使用します。

rightBarButtonItem

UIBarButtonItem* done = [[ActionBarButtonItem alloc] 
    initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone
    target:self 
    action:@selector(onDonePress)];
self.navigationItem.rightBarButtonItem = done;
[done release];

UI外観

NSDictionary* buttonStyle = [NSDictionary 
    dictionaryWithObjects:[NSArray 
        arrayWithObjects:
            [UIColor grayColor],
            , nil
        ]
        forKeys:[NSArray
            arrayWithObjects:
                UITextAttributeTextColor,
                nil
        ]
];

NSDictionary* actionStyle = [NSDictionary 
    dictionaryWithObjects:[NSArray 
        arrayWithObjects:
            [UIColor greenColor],
            nil
        ]
        forKeys:[NSArray
            arrayWithObjects:
                UITextAttributeTextColor,
                nil
        ]
]; 

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setTitleTextAttributes:buttonStyle
    forState:UIControlStateNormal
];

[[ActionBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil]
    setTitleTextAttributes:actionStyle
    forState:UIControlStateNormal
];

理論的には、灰色のテキストはすべての UIBarButtonItems に適用されます。次に、ActionBarButtonItems のみの灰色のテキストを緑色のテキストでオーバーライドします。最終結果は期待どおりではありません。理由は不明ですが、すべてのUIBarButtonItem に緑色のテキストが表示されます。なんで?

ここに画像の説明を入力ここに画像の説明を入力

4

1 に答える 1

1

あなたはサブクラス化UIBarButtonしているので、ここでの最初の考えは、結果を呼び出すappearanceWhenContainedInActionBarButtonItemスーパークラスが呼び出されるappearanceWhenContainedInため、これが起こっている理由です。理想的ではありませんが、ロードされたビューの左右のアイテムの外観を変更したり、ビューが各ビューに表示されたりする可能性があります。

NSDictionary* buttonStyle = [NSDictionary 
                                 dictionaryWithObjects:[NSArray 
                                                        arrayWithObjects:
                                                        [UIColor blueColor],nil]
                                 forKeys:[NSArray
                                          arrayWithObjects:
                                          UITextAttributeTextColor,
                                          nil
                                          ]
                                 ];

NSDictionary* actionStyle = [NSDictionary 
                             dictionaryWithObjects:[NSArray 
                                                    arrayWithObjects:
                                                    [UIColor greenColor],
                                                    nil
                                                    ]
                             forKeys:[NSArray
                                      arrayWithObjects:
                                      UITextAttributeTextColor,
                                      nil
                                      ]
                             ]; 



[self.navigationItem.leftBarButtonItem setTitleTextAttributes:buttonStyle forState:UIControlStateNormal];
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:actionStyle forState:UIControlStateNormal];

アプリのデリゲートのような場所にこれを配置して、 でより簡単にアクセスできるようにすることもできます[[UIApplication sharedApplication].delegate setBarButtonColors]。もう 1 つの選択肢は、上のカテゴリである可能性がありますUINavigationBar

于 2012-06-13T23:49:04.953 に答える