是否可以使用iOS 5外观代理来重构在图层上设置属性的代码?
_button.layer.cornerRadius = 5.0f;
_button.layer.borderWidth = 1.0f;
_button.layer.borderColor = [[UIColor blackColor] CGColor];
_button.layer.masksToBounds = YES;
答案 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
标记公开基础渐变图层的locations
和UI_APPEARANCE_SELECTOR
属性。在应用初始化时设置一次可自定义整个应用。您甚至可以将颜色显示给用户,以允许他们完全自定义各种控件的颜色。
答案 1 :(得分:2)
没有。苹果公司说:
为了支持外观定制,一个类必须符合 UIAppearanceContainer协议和相关的访问方法必须是 用UI_APPEARANCE_SELECTOR标记。
UIButton没有。
修改强> 并且UIButton没有任何标有UI_APPEARANCE_SELECTOR的方法。