iOS实用技巧 - 简易实现多皮肤功能

前言:不记得谁说的了,中国的用户大概是世界上最喜欢多皮肤功能的用户了。我很讨厌写安卓程序,图形界面设计工具及其难用,还不如手写,编辑器慢如蜗牛,智能提示总是跟不上我输入的速度,相同的功能,安卓的代码量至少是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


DEMO工程


你可能感兴趣的:(ios,换肤功能)