如何更改 UITabbar 选定的颜色?

Posted

技术标签:

【中文标题】如何更改 UITabbar 选定的颜色?【英文标题】:how to change UITabbar selected color? 【发布时间】:2010-03-24 08:44:23 【问题描述】:

据此post 目前,Apple 是否也会拒绝此代码?

以及如何实现苹果将批准的内容?

@interface UITabBar (ColorExtensions)
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur;
@end

@interface UITabBarItem (Private)
@property(retain, nonatomic) UIImage *selectedImage;
- (void)_updateView;
@end

@implementation UITabBar (ColorExtensions)
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur

        CGColorRef cgColor = [color CGColor];
        CGColorRef cgShadowColor = [shadowColor CGColor];
        for (UITabBarItem *item in [self items])
                if ([item respondsToSelector:@selector(selectedImage)] &&
                    [item respondsToSelector:@selector(setSelectedImage:)] &&
                    [item respondsToSelector:@selector(_updateView)])
                
                        CGRect contextRect;
                        contextRect.origin.x = 0.0f;
                        contextRect.origin.y = 0.0f;
                        contextRect.size = [[item selectedImage] size];
                        // Retrieve source image and begin image context
                        UIImage *itemImage = [item image];
                        CGSize itemImageSize = [itemImage size];
                        CGPoint itemImagePosition; 
                        itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width) / 2);
                        itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height) / 2);
                        UIGraphicsBeginImageContext(contextRect.size);
                        CGContextRef c = UIGraphicsGetCurrentContext();
                        // Setup shadow
                        CGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor);
                        // Setup transparency layer and clip to mask
                        CGContextBeginTransparencyLayer(c, NULL);
                        CGContextScaleCTM(c, 1.0, -1.0);
                        CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [itemImage CGImage]);
                        // Fill and end the transparency layer
                        CGContextSetFillColorWithColor(c, cgColor);
                        contextRect.size.height = -contextRect.size.height;
                        CGContextFillRect(c, contextRect);
                        CGContextEndTransparencyLayer(c);
                        // Set selected image and end context
                        [item setSelectedImage:UIGraphicsGetImageFromCurrentImageContext()];
                        UIGraphicsEndImageContext();
                        // Update the view
                        [item _updateView];
                

@end

【问题讨论】:

是的,Apple 拒绝它.. 任何解决方案?? 【参考方案1】:

是的,如果您使用该代码,Apple 拒绝某个应用。

我刚刚有一个应用因使用私有 API 调用而被拒绝。特别是“_updateView”。我使用了与上面完全相同的代码。

(如果其他人说他们的应用使用相同的代码获得了批准,那只是因为没有检查它是否使用私有 API。)

【讨论】:

是的,Apple 拒绝它.. 任何解决方案??任何帮助将不胜感激。谢谢 如果你只为 ios 5+ 开发,你可以使用appearance 方法来配置标签栏。在 iOS 5 之前,我通常为标签栏的每个状态创建图像(即,如果有三个项目,我需要三个图像:每个选定的项目一个)并将图像放在整个标签栏的顶部。搜索“自定义标签栏”应该会产生大量示例。【参考方案2】:
[[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]];

【讨论】:

你把这个放在哪里?在所有视图中,是否加载了选项卡栏项目视图控制器、应用程序委托或其他地方? 这在应用委托的 didFinishLaunchingWithOptions 方法中【参考方案3】:

我建议你为什么不使用选定的 tabbaritem 图像而不是改变颜色, 像 在 iOS 6 中,我更改了选定的 tabbatitem 图像,例如 -

在标签栏控制器委托方法中

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController


    if([tabBarController selectedIndex] == 0)
    
        [viewController.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"selected.png"]withFinishedUnselectedImage:[UIImage imageNamed:@"unselect.png"]];
        

通过这个你可以改变你的形象。

或者您可以直接在视图控制器中使用 init(或 ViewWillAppear)方法,例如

        [viewController.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"selected.png"]withFinishedUnselectedImage:[UIImage imageNamed:@"unselect.png"]];

【讨论】:

【参考方案4】:

对于 iOS 10(或更高版本):

要设置选定的颜色,只需设置:

let tabBarAppearace = UITabBar.appearance()
tabBarAppearace.tintColor = UIColor.nowYouBlue

以上内容适用于当前支持的所有 iOS 版本,但要更改未选择的颜色:

    if #available(iOS 10.0, *) 
        tabBarAppearace.unselectedItemTintColor = UIColor.red
     else 
        // Fallback on earlier versions
    

以上代码在 iOS 10 上将如下所示。

【讨论】:

以上是关于如何更改 UITabbar 选定的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView 更改 UITabbar 项目选定的颜色

解雇后如何以编程方式更改UITabBar选定的索引?

UITabBar 所选项目色调颜色

在 UITabBar 中为选定选项卡设置色调颜色

如何防止使用 UIAppearance 和 UIView 的 tintColor 更改所有 UITabBar 图标颜色?

UITabBar 未在 ios 7 中显示所选项目图像