Mac OS 开发 -- 直接扩展系统类的属性之NSView添加backgroudColor属性

来源:互联网 发布:网络大学是什么 编辑:程序博客网 时间:2024/06/06 18:10

使用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 boundsangle:-90];

    }

}



@end


0 0