使用class_getInstanceMethod方法交换本来的draw方法到自己定义的draw方法,然后绘制背景色
@implementation NSView(BackgroudColor)
@dynamic backgroundColor;
@dynamic gradientColor;
- (void)setBackgroundColor:(NSColor *)backgroundColor{
objc_setAssociatedObject(self, [@"backgroundColor" UTF8String], backgroundColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
static dispatch_once_t once;
dispatch_once(&once, ^{
Method method1 = class_getInstanceMethod([NSView class], @selector(drawRect:));
Method method2 = class_getInstanceMethod([NSView class], @selector(__My_Draw_Rect__:));
method_exchangeImplementations(method1, method2);
});
[self setNeedsDisplay:YES];
}
- (void)setGradientColor:(NSGradient *)gradientColor{
objc_setAssociatedObject(self, [@"gradientColor" UTF8String], gradientColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self setNeedsDisplay:YES];
}
- (NSColor *)getBackgroundColor{
NSColor *color = objc_getAssociatedObject(self,[@"backgroundColor" UTF8String]);
return color;
}
- (NSGradient *)getGradientColor{
NSGradient *gradient = objc_getAssociatedObject(self,[@"gradientColor" UTF8String]);
return gradient;
}
- (void)__My_Draw_Rect__:(NSRect)dirtyRect{
[self __My_Draw_Rect__:dirtyRect];
NSColor *backgroudColor = [self getBackgroundColor];
if(backgroudColor){
[backgroudColor set];
NSRectFill(dirtyRect);
}
NSGradient *gradient = [self getGradientColor];
if(gradient){
[gradient drawInRect:[self bounds] angle:-90];
}
}
@end