我有一个奇怪的问题,让我解释一下:我使用[UITabBarItem appearance]
来更改我的应用中所有UITabBarItem
的字体和颜色。这就像一个魅力,所有UITabBarItem
的样式都正确。
代码是:
// Set the normal state
[[UITabBarItem appearance] setTitleTextAttributes:
@{
UITextAttributeTextColor: AUIColorObject
} forState:forState:UIControlStateHighlighted];
现在我想为单个UITabBar
覆盖该样式。我扩展了UITabBar
子类来处理类似样式的东西,在我的例子中,可能的值是RootTabBarControllerStyleDefault
和RootTabBarControllerStyleBox
。
如何为此单TitleTextAttributes
设置UITabBarItem
?我使用子类UITabBarController
和UITabBar
来进行最大程度的控制。
更详细,这是我的工作解决方法:
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
设置不同的样式,但我希望有更好/更清晰的方法来做到这一点。
答案 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的文档,我认为结果将是相同的