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

使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值