前言:不记得谁说的了,中国的用户大概是世界上最喜欢多皮肤功能的用户了。我很讨厌写安卓程序,图形界面设计工具及其难用,还不如手写,编辑器慢如蜗牛,智能提示总是跟不上我输入的速度,相同的功能,安卓的代码量至少是iOS的三倍,每写一行代码,都觉得自己的手指在滴血。可是安卓灵活统一的style功能确实很贴心!5之前,iOS平台上实现相同的功能一直没有个比较好的办法。
iOS5之后,苹果将所有界面组件的设定,都绑定在一个叫UIAppearance的协议上了,你可以简单的通过UIAppearance设定组件的全局风格。
例如,我想把所有的UIButton的title都设成白色:
[[UIButton appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
或者,我想所有的UIButton都有统一的背景图片
[[UIButton appearance] setBackgroundImage:aBackgroundImage forState:UIControlStateNormal];
这样,整个应用的UIButton,title都是白色,背景使用aBackgroundImage的图片了。
当然,实际项目中,不同风格的组件,应该单独定义成一个类,然后在它的initialize方法设置它的UIAppearance,例如我定义了一个AFKButton类,我就可以写成下面这样,这样应用中所有的AFKButton类的Button都是一个风格的了。
@implementation AFKButton ...... + (void)initialize { if (self == [AFKButton self]) { [[self appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [[self appearance] setBackgroundImage:aBackgroundImage forState:UIControlStateNormal]; } } ...... @end
修改UIAppearance,有个限制,就是如果想让它生效,必须在下次装载入app的主窗口时才能生效,所以,如果要通过UIAppearance动态修改组件的风格,我们就需要在UIAppDelegate中实现下面的代码
UIViewController *rootViewController = self.window.rootViewController; self.window.rootViewController = nil; [[UIButton appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [[UIButton appearance] setBackgroundImage:aBackgroundImage forState:UIControlStateNormal]; self.window.rootViewController = rootViewController;
由上所述,我设计的动态切换皮肤的风格如下:
1.首先按照风格建立相应的组件类,例如,你有几种Button,就继承实现几个Button类。
2.设置全局风格标志。
3.触发风格修改的地方,通过全局广播发送消息。
4.UIAppDelegate重新装载window的rootViewController
iOS实用技巧 - 简易实现多皮肤功能,布布扣,bubuko.com
原文:http://my.oschina.net/non6/blog/292549