`
啸笑天
  • 浏览: 3435751 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

UIAppearance 协议自定义视图

 
阅读更多

在iOS 5以前,自定义原生控件的外观并没有原生支持,因此开发人员感觉很麻烦。开发人员经常面临的问题是修改一个控件所有实例的外观。解决这个问题的正确方法是重写一遍控件。但由于这么做非常费时,一些开发人员开始覆盖或混写一些方法,如drawRect:。

从iOS 5开始,苹果通过两个协议(UIAppearance和UIAppearanceContainer)规范了对许多UIKit控件定制的支持。所有遵循UIAppearance协议的UI控件通过定制都可以呈现各种外观。不仅如此,UIAppearance协议甚至允许开发者基于控件所属的区域指定不同的外观。也就是说,当某个控件包含在特定视图中时,可以指定它的外观(如UIBarButtonItem的tintColor)。也可以获取该控件类的外观代理对象,用该代理定制外观来实现。

 

 

+ (instancetype)appearance;

 

+ (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION;

第一个方法是统一全部改,比如你设置UINavBar的tintColor,你可以这样写:[[UINavigationBar appearance] setTintColor:myColor];

第二个方法是当出现在某个类的出现时候才会改变:例如:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UIPopoverController class], nil] setTintColor:myPopoverNavBarColor];

注意:全局的设置最好在所有界面初始化前开始设置,否则可能失效。一般写在appDelegate.m文件中。

 

那么,,怎么确定哪些情况下能够通过UIKit的外观代理来定制所有元素(以及元素中的哪些属性)呢?

有两种方式。老办法是查阅文档,另一个办法是大多数开发人员使用的快捷方式:读头文件。打开对应的UIKit元素的头文件,其中所有带有UI_APPEARANCE_SELECTOR标记的属性都支持通过外观代理来定制。举个例子,UINavigationBar.h中的tintColor属性带有UI_APPEARANCE_SELECTOR标记: @property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

 

例子:

http://blog.csdn.net/shenjx1225/article/details/8552449

分享到:
评论
1 楼 啸笑天 2014-01-23  
http://stackoverflow.com/questions/9424112/what-properties-can-i-set-via-an-uiappearance-proxy

相关推荐

Global site tag (gtag.js) - Google Analytics