如何在Cocoa Touch中创建等效的外观代理

时间:2012-10-10 18:29:54

标签: objective-c cocoa-touch

我可以使用外观代理为iOS中的给定类型的所有控件设置属性。例如,我可以说:

UIFont *futura = [UIFont fontWithName:@"Futura" size:13];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:futura forKey:UITextAttributeFont];

[[UIBarButtonItem appearance] setTitleTextAttributes:attributes forState:UIControlStateNormal];

使我的所有工具栏按钮都使用Futura字体。

我有自己的自定义控件,UIControl的子类。有没有什么办法可以使用相同的技术来设置我的控件独有的自定义属性?否则,它会直接遍历应用程序设置属性中的每个实例。问题是,如何像外观代理一样创建自己的属性代理?

我可以想象设置一个单例来保存我关心的属性,然后让我的控件调用它来获取它们的值。这似乎很难处理我想要将某些实例的属性设置为与全局默认值不同的情况,因为我可以使用上面的一个或两个UIBarButtonItems。然后变成一个每个新实例用代理注册自己的地方,所以代理可以通知他们如果他们改变了设置......但现在我想知道是否有更好的方法?这看起来很复杂。

1 个答案:

答案 0 :(得分:0)

查看UIAppearanceContainer的文档。您可以让子类符合UIAppearanceContainer协议,然后在头文件中使用UI_APPEARANCE_SELECTOR标记访问者。 UIBarButtonItem的方法声明示例如下:

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

- (UIImage *)backButtonBackgroundImageForState:(UIControlState)state
         barMetrics:(UIBarMetrics)barMetrics UI_APPEARANCE_SELECTOR;
- (void)setBackButtonBackgroundImage:(UIImage *)backgroundImage
    forState:(UIControlState)state
    barMetrics:(UIBarMetrics)barMetrics UI_APPEARANCE_SELECTOR;