外观代理&图层

时间:2012-01-08 15:24:37

标签: ios ios5 uikit

是否可以使用iOS 5外观代理来重构在图层上设置属性的代码?

_button.layer.cornerRadius = 5.0f;
_button.layer.borderWidth = 1.0f;
_button.layer.borderColor = [[UIColor blackColor] CGColor];
_button.layer.masksToBounds = YES;

2 个答案:

答案 0 :(得分:6)

接受的答案不正确。您可以在图层上设置属性,但是,您需要对视图进行子类化并通过访问器公开图层属性。

为了说明,我将只使用问题中的一个属性cornerRadius

第1步: 实现UIButton子类。

#import <UIKit/UIKit.h>

@interface MyRoundedCornerButton : UIButton

@end

第2步: 添加标有UI_APPEARANCE_SELECTOR的属性。

#import <UIKit/UIKit.h>

@interface MyRoundedCornerButton : UIButton

@property (readwrite, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR;

@end

第3步: 实现新类。

@implementation MyRoundedCornerButton

- (void)setCornerRadius:(CGFloat)cornerRadius
{
    self.layer.cornerRadius = cornerRadius;
}

@end

第4步: 在外观代理中设置角半径。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    [MyRoundedCornerButton appearance].cornerRadius = 10.0;
    ...
}

第5步: 然后在IB中,(或者在您定义视图创建的任何地方),将自定义视图类设置为(或实例化)MyRoundedCornerButton而不是UIButton。

注意: 我这样做是为了在我的应用程序中应用一个易于更改的渐变背景。在我的例子中,所有视图控制器的根视图都使用自定义类。此自定义类通过CAGradientLayer方法提供+(Class)layerClass。然后,我使用colors标记公开基础渐变图层的locationsUI_APPEARANCE_SELECTOR属性。在应用初始化时设置一次可自定义整个应用。您甚至可以将颜色显示给用户,以允许他们完全自定义各种控件的颜色。

答案 1 :(得分:2)

没有。苹果公司说:

  

为了支持外观定制,一个类必须符合   UIAppearanceContainer协议和相关的访问方法必须是   用UI_APPEARANCE_SELECTOR标记。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

UIButton没有。

修改 并且UIButton没有任何标有UI_APPEARANCE_SELECTOR的方法。