您的位置:首页 > 其它

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

2016-04-05 10:23 375 查看
使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息