如何iOS更改UIBarButtonItem的文本颜色
来源:互联网 发布:淘宝秒杀优惠券 编辑:程序博客网 时间:2024/05/17 05:03
在iOS平台,UINavigationBar可以通过设置tintColor来改变导航条的背景颜色,但是由于UIBarButtonItem没有文本颜色设置功能,所以如果将UINavigationBar的tintColor设置成whiteColor的话,文字显示就不怎么清晰了。如下图:
这种情况网上一般建议通过建立一个UILabel,赋值给UINavigationItem的titleView属性,改变标题的颜色。建立一个UIButton,通过UIBarButtonItem的
initWithCustomView方法创建UIBarButtonItem对象,得到结果如下图:
效果不尽人意吧。当然可以通过设置背景图片什么的,加强效果。但总体来说不如只改变文本颜色方便。
iOS的Objective C提供了runtime函数,定义在objc目录下面。通过这些运行时库函数可以对系统定义的对象进行修改,比如增加方法,修改方法的代码地址....通过枚举UINavigationBar的子视图,发现显示UIBarButtonItem内容的是UINavigationButton,它有一个子视图类型为UIButtonLabel,UIButtonLabel继承自UILabel,UIButtonLabel类型本身没有重载setTextColor:方法,因此调用class_addMethod给UIButtonLabel类型增加一个setTextColor:方法,然后把传进来的color强制改成其他颜色,再调用UILabel的setTextColor:方法即可。
void ChangeUINavigationButtonTextColor() { // 给UIButtonLabel增加setTextColor:方法 Class class = objc_getClass("UIButtonLabel"); Method m = class_getInstanceMethod([UILabel class], @selector(setTextColor:)); class_addMethod(class, @selector(setTextColor:), (IMP)UIButtonLabelSetTextColor, method_getTypeEncoding(m)); // 修改阴影颜色 m = class_getInstanceMethod([UILabel class], @selector(UIButtonLabelSetShadowColor:)); class_addMethod(class, @selector(setShadowColor:), (IMP)UIButtonLabelSetTextColor, method_getTypeEncoding(m));}void UIButtonLabelSetTextColor(id self, SEL _cmd, UIColor *textColor) { // 改变UIBarButtonItem的文字颜色 if ([[self superview] isKindOfClass:objc_getClass("UINavigationButton")]) { // 因为UIButtonLabel在其他地方也用到了,比如UIAlertView中的按钮,因此这里判断一下,确定是导航条按钮的时候才更改颜色 textColor = [UIColor blackColor]; } struct objc_super super = {self, [UILabel class]}; objc_msgSendSuper(&super, @selector(setTextColor:), textColor);}void UIButtonLabelSetShadowColor(id self, SEL _cmd, UIColor *shadowColor) { if ([[self superview] isKindOfClass:objc_getClass("UINavigationButton")]) { shadowColor = [UIColor whiteColor]; } struct objc_super super = {self, [UILabel class]}; objc_msgSendSuper(&super, @selector(setShadowColor:), shadowColor);}
ChangeUINavigationButtonTextColor是修改UIButtonLabel类型,增加setTextColor:方法,
UIButtonLabelSetTextColor是改变颜色的具体实现。
在UIApplicationDelegate的实现类型中的- (BOOL)application:didFinishLaunchingWithOptions:方法中调用ChangeUINavigationButtonTextColor函数。
@implementation AppDelegate_iPhone@synthesize window;#pragma mark -#pragma mark Application lifecycle- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. ChangeUINavigationButtonTextColor(); UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:[MainFrame makeNewController]] autorelease];navigationController.delegate = self;navigationController.navigationBar.barStyle = UIBarStyleDefault;navigationController.navigationBar.tintColor = [UIColor whiteColor];navigationController.toolbar.tintColor = [UIColor whiteColor];self.window.rootViewController = navigationController;[self.window makeKeyAndVisible]; return YES;}@end
上图为效果,不过还没有完全完成,因为返回按钮和标题的颜色还没有改变
实现方法类似,返回按钮和标题的视图类型是UINavigationItemButtonView,他的父类UINavigationItemView有一个专门用来画文字的函数-(void)drawText:inRect:barStyle:,这个方法在不同的固件版本上可能不一样,在3.x版本可能是-(void)drawText:inRect:这种形式,这个没什么影响,要覆盖低版本的话无非是多写两个函数。下面是完整的实现代码
void ChangeUINavigationButtonTextColor() { Class class = objc_getClass("UIButtonLabel"); Method m = class_getInstanceMethod([UILabel class], @selector(setTextColor:)); class_addMethod(class, @selector(setTextColor:), (IMP)UIButtonLabelSetTextColor, method_getTypeEncoding(m)); m = class_getInstanceMethod([UILabel class], @selector(setShadowColor:)); class_addMethod(class, @selector(setShadowColor:), (IMP)UIButtonLabelSetShadowColor, method_getTypeEncoding(m)); class = objc_getClass("UINavigationItemView"); m = class_getInstanceMethod(class, @selector(drawText:inRect:barStyle:)); method_setImplementation(m, (IMP)UINavigationItemViewDrawText);}void UIButtonLabelSetTextColor(id self, SEL _cmd, UIColor *textColor) { if ([[self superview] isKindOfClass:objc_getClass("UINavigationButton")]) { textColor = [UIColor blackColor]; } struct objc_super super = {self, [UILabel class]}; objc_msgSendSuper(&super, @selector(setTextColor:), textColor);}void UIButtonLabelSetShadowColor(id self, SEL _cmd, UIColor *shadowColor) { if ([[self superview] isKindOfClass:objc_getClass("UINavigationButton")]) { shadowColor = [UIColor whiteColor]; } struct objc_super super = {self, [UILabel class]}; objc_msgSendSuper(&super, @selector(setShadowColor:), shadowColor);}void UINavigationItemViewDrawText(id self, SEL _cmd, NSString *text, struct CGRect rect, UIBarStyle barStyle) { UIFont *f = [self font]; if (!f) { f = objc_msgSend(self, @selector(_defaultFont)); } CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(ctx, [UIColor blackColor].CGColor); [text drawInRect:rect withFont:f lineBreakMode:UILineBreakModeTailTruncation alignment:UITextAlignmentCenter]; CGContextAddRect(ctx, rect);}最后的问题是这些代码能不能通过AppStore的审查,这个我暂时也不知道,感觉应该是可行的,毕竟runtime不算私有API吧。最后上个整图
- 如何iOS更改UIBarButtonItem的文本颜色
- ios如何更改顶部状态栏的颜色
- 如何更改静态文本控件的字体与颜色
- 如何使用 C# 来更改前景颜色和背景颜色,在控制台窗口中的文本的
- iOS 7如何修改状态栏文本颜色?
- iOS 7如何修改状态栏文本颜色?
- uibarbuttonitem颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios更改状态栏(UIStatusBar)的颜色 最新
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- iOS 更改状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- ios上 更改 状态栏(UIStatusBar)的颜色
- UVa 10177 - (2/3/4)-D Sqr/Rects/Cubes/Boxes?
- Command模式
- 《C++设计模式》第一章:创建(对象)型模式之单例模式(单态模式)
- MapReduce及其工作机制 (Book Review & Personal Conclusion)
- 如何在Java中执行其它程序
- 如何iOS更改UIBarButtonItem的文本颜色
- 单元测试System.TypeInitializationException: ......的类型初始值设定项引发异常
- 使用poi读写excel文件
- 安装Cloudstack的部分总结
- Jquery 设置或获取控件的值
- 用Dreamweave cs 5.5+PhoneGap+Jquery Mobile搭建移动开发环境
- ARM指令优化-Coding for NEON - Part 2: Dealing With Leftovers
- Facebook大数据:每天处理逾25亿条内容和500TB数据
- 用Deflater与Inflater实现字节的压缩与解压