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
@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
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- jquery 表单验证之通过 class验证表单不为空
- setAttribute 与 class冲突解决
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- 详解js中class的多种函数封装方法
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- jQuery点击改变class并toggle及toggleClass()方法定义用法
- jquery采用oop模式class类的使用示例
- JavaScript更改class和id的方法
- 一篇入门的php Class 文章
- 深入C++中struct与class的区别分析
- js中设置元素class的三种方法小结
- JavaScript操作class和style样式代码详解
- c++中typename和class的区别介绍