@(iOS & Objective-C & iOS架构)
做App的时候,我们经常需要自定义大量的界面,来让我们的界面看起来更加的美观。自从iOS5之后,UIAppearance协议的出现让我们的可以快速的修改系统控件的UI。
note
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.
当一个view进入window的时候才可以实现外观的变化,当一个view已经进入window的时候再进行设置是不会做变更的,对于已经存在window中的view做外观设置需要从当前的视图层级中移除并重新加载。
想要使用这个协议来自定义UI,类必须遵从UIAppearanceContainer协议,并且相关的属性需要有UI_APPEARANCE_SELECTOR标记。
自己创建可自定义外观的控件
@interface CustomCell : UITableViewCell
- (void)setSelectedBackgroundColor:(UIColor*)color UI_APPEARANCE_SELECTOR;
@end
@implementation CustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.selectedBackgroundView = [UIView new];
self.selectedBackgroundView.backgroundColor = [UIColor lightGrayColor];
}
return self;
}
- (void)setSelectedBackgroundColor:(UIColor*)color{
self.selectedBackgroundView.backgroundColor = color;
}
@end
UIAppearance实现原理
在通过UIAppearance调用“UI_APPEARANCE_SELECTOR”标记的方法来配置外观时,UIAppearance实际上没有进行任何实际调用,而是把这个调用保存起来(在Objc中可以用NSInvocation对象来保存一个调用)。当实际的对象显示之前(添加到窗口上,drawRect:之前),就会对这个对象调用之前保存的调用。当这个setter调用后,你的界面风格自定义就完成了。
参考:http://blog.xcodev.com/archives/custom-ui-using-uiappearance/