通常使用Category時,只能添加方法,不可添加屬性。但是在使用Storyboard時我們可能會使用到keyPath,這裏設置的key都需要是所設置視圖的屬性值,並且類型有所限制。
例如:我現在有一個按鈕,我想設置成圓角,並且是紫色邊框。並且我不想寫代碼,想通過storyboard直接設置。這樣看起來很帥(其實就是一個強迫症吧,因爲一直在用sb設置整個界面,但是突然出現幾個樣式,在sb中不可以直接設置,這種感覺很煩躁的,所以要解決掉它)。
遇到的問題:這裏key path 的type類型是固定的,這裏我們不可以添加。這裏只有一個UIColor類型的color,但是設置邊框的顏色,應該是CGColor的,所以類型不匹配,我們需要爲CALayer添加一個UIColor的屬性。這裏我們使用Category,不用疑問,對,是使用Category爲CALayer添加一個UIColor的屬性。
CALayer+Addition.h
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
@interface CALayer (Additions)
@property(nonatomic, strong) UIColor *borderColorFromUIColor;
- (void)setBorderColorFromUIColor:(UIColor *)color;
@end
CALayer+Addition.m
#import "CALayer+Additions.h"
#import <objc/runtime.h>
@implementation CALayer (Additions)
//static const void *borderColorFromUIColorKey = &borderColorFromUIColorKey;
//@dynamic borderColorFromUIColor;
- (UIColor *)borderColorFromUIColor {
return objc_getAssociatedObject(self, @selector(borderColorFromUIColor));
}
-(void)setBorderColorFromUIColor:(UIColor *)color
{
objc_setAssociatedObject(self, @selector(borderColorFromUIColor), color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self.setBorderColorFromUI: self.borderColorFromUIColor];
}
- (void)setBorderColorFromUI:(UIColor *)color
{
self.borderColor = color.CGColor;
// NSLog(@"%@", color);
}
這樣就成功爲CALayer添加了borderColorFromUIColor屬性,並且在key path裏可能成功設置該屬性,爲按鈕設置邊框顏色了。
實現效果