UITabBarItem:覆盖子类中的默认外观

时间:2014-03-06 21:28:10

标签: objective-c nsattributedstring

我有一个奇怪的问题,让我解释一下:我使用[UITabBarItem appearance]来更改我的应用中所有UITabBarItem的字体和颜色。这就像一个魅力,所有UITabBarItem的样式都正确。

代码是:

// Set the normal state
[[UITabBarItem appearance] setTitleTextAttributes:
@{
    UITextAttributeTextColor: AUIColorObject
} forState:forState:UIControlStateHighlighted];

现在我想为单个UITabBar覆盖该样式。我扩展了UITabBar子类来处理类似样式的东西,在我的例子中,可能的值是RootTabBarControllerStyleDefaultRootTabBarControllerStyleBox

如何为此单TitleTextAttributes设置UITabBarItem ?我使用子类UITabBarControllerUITabBar来进行最大程度的控制。

更详细,这是我的工作解决方法:

1)UITabBar具有静态方法来设置外观,如下所示:

+ (void)setAppearinaceForStyle:(RootTabBarControllerStyle)_style 
{
    [[UITabBarItem appearance] setTitleTextAttributes:
    @{
      UITextAttributeTextColor: (_style == RootTabBarControllerStyleDefault ? UIColor1 : UIColor2)
    } forState:UIControlStateHighlighted];
}

2)然后我为我的UITabBarController设置了一个代理,做了以下事情:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    [RootTabBar setAppearinaceForStyle:RootTabBarControllerStyleBox];

    [tabBarController.tabBar setNeedsDisplay];

    for (UITabBarItem *item in tabBarController.tabBar.items)
    {
        NSString *oldString = item.title;

        // Change the title string to force a redraw
        [item setTitle:[NSString stringWithFormat:@"%@ ", item.title]];

        // Set the title back to its default value
        [item setTitle:oldString];
    }

    [RootTabBar setAppearinaceForStyle:RootTabBarControllerStyleDefault];
}

这允许我为这个单UITabBar设置不同的样式,但我希望有更好/更清晰的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

所以你想要以不同的方式自定义一个UITabBarItem'

如果是这样,您已经拥有该单个项目的子类,只有我们[MyTabBarItemSubclass appearance]而不是其他项目使用的常规[UITabBarItem appearance]

答案 1 :(得分:0)

[UIAppearance文件]( https://developer.apple.com/library/ios/documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html)声明:

  

使用UIAppearance协议获取类的外观代理。   您可以通过发送自定义类实例的外观   外观修改消息到类的外观代理。

     

注意:当视图进入窗口时,iOS会应用外观更改   不会更改已在窗口中的视图的外观。 要   更改当前在窗口中的视图的外观,删除   视图层次结构中的视图然后将其放回

您应该使用视图层次结构来删除包含标签栏并再次放置的视图。但是,你的方法或多或少地做了同样的工作(因此不那么优雅)。

如果您关注Apple的文档,我认为结果将是相同的