【问题标题】:How to properly customize UITabBar and UITabBarItem on iOS 7 and iOS 8?如何在 iOS 7 和 iOS 8 上正确自定义 UITabBar 和 UITabBarItem?
【发布时间】:2015-01-24 11:45:30
【问题描述】:

我在谷歌上搜索了很多,但在任何地方都找不到直接合并的答案。

我想自定义 myUITabBarController,这样:

  1. UITabBar 本身是全黑的
  2. 项目标题的文本颜色在非高亮状态下为白色
  3. 项目标题的文本颜色在高亮状态下为红色
  4. 在标签栏中使用彩色图标

1。转UITabBar黑色

我猜我需要为此使用UIAppearance API,实际上我可以使用[[UITabBar appearance] setBarTintColor:[UIColor blackColor]];UITbarBar 变为黑色。

2。和 3. 修改项目标题的颜色

但是,文本项的颜色似乎并没有达到我想要的效果,在谷歌搜索之后,以下解决方案对我来说很有意义,但它只会将 non-highlighted 状态更改为白色,突出显示也保持白色......

NSDictionary *titleAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
[[UITabBarItem appearance] setTitleTextAttributes:titleAttributes forState:UIControlStateNormal];

UIColor *titleHighlightedColor = [UIColor redColor]; 
NSDictionary *highlightedTitleAttributes = @{NSForegroundColorAttributeName : titleHighlightedColor};
[[UITabBarItem appearance] setTitleTextAttributes:highlightedTitleAttributes forState:UIControlStateHighlighted];

4。五彩的物品

关于多色图标,到目前为止,方法是像这样简单地设置 Storyboards 中的图标:

但这并不能满足我的要求,它只会在选中该项目时将整个图标显示为灰色。选择项目后,图标完全消失。

这是原来的图标:

这是当项目被选中时的样子:

这里是在选中状态下,如前所述图标完全消失:

所以,我的问题是我能在多大程度上达到上述要求。我目前缺少什么?我在代码中做所有事情是否比在故事板中更好?

注意:我的目标是高于 7.0 的 iOS 版本,因此如果 iOS 7 和 iOS 8 的行为不同,请提供任何版本特定信息。

【问题讨论】:

    标签: ios objective-c uitabbarcontroller uitabbar uitabbaritem


    【解决方案1】:

    我和你有同样的问题。据我所知,不同的 iOS 版本没有区别。
    我像这样以编程方式解决了它:

    1. 将条形颜色变为黑色的工作原理如下(您已经说过)(在 AppDelegate 中):

      UITabBar.appearance().barTintColor = UIColor.blackColor()

    2. 为了设置不同状态的标题颜色,我使用了这段代码(在 AppDelegate 中):

      UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.redColor()], forState:.Selected)
      UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.whiteColor()], forState:.Normal)
      
    3. (和 4.)通过以编程方式设置图像并将渲染模式(imageWithRenderingMode:)更改为UIImageRenderingMode.AlwaysOriginal,您可以为不同的状态实现不同的项目颜色、多色图标和不同的项目颜色,这看起来像以下(在所有视图控制器的第一个视图控制器类中执行此操作):

      var recentsItem = self.tabBarController!.tabBar.items![0] as UITabBarItem
      var recentsItemImage = UIImage(named:"recents.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
      var recentsItemImageSelected = UIImage(named: "recentsSelected.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
      recentsItem.image = recentsItemImage
      recentsItem.selectedImage = recentsItemImageSelected
      

    希望对您有所帮助,如果您有任何以下问题,请随时问我。

    【讨论】:

    • 我实际上对 3. 也有正确的方法,只是我的错误是我选择了UIControlStateHighlighted 而不是UIControlStateSelected,感谢您指出这一点! :) 另外,关于UIImageRenderingMode 的提示真的很有帮助!
    • 关于#2:我们应该记住UITabBarItem.appearance().setTitleTextAttributes 只能用于自定义.font .foregroundColor.shadow 而不是其他键(参见developer.apple.com/documentation/uikit/uibaritem/…
    【解决方案2】:

    smudis 提供的解决方案很棒,因为我没有足够的声誉来发表评论,我决定在 Objective-C 中发布 smudis 解决方案的第三部分,以防它可能对某人有所帮助:

    要获取 tabBar 的引用,请将上述代码输入 AppDelegate 的方法 application:didFinishLaunchingWithOptions:

    UITabBarController *tbc = (UITabBarController*)self.window.rootViewController;
    UITabBar *tb = tbc.tabBar;
    

    那么图像调整可以如下进行:

    for (UITabBarItem *tbi in tb.items) {
        tbi.selectedImage = [tbi.selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        tbi.image = [tbi.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2017-12-03
      • 2023-01-23
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多