如何更改 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 项目选定的颜色
如何防止使用 UIAppearance 和 UIView 的 tintColor 更改所有 UITabBar 图标颜色?