我想子类uibezierpath来添加cgpoint属性。
@interface MyUIBezierPath : UIBezierPath
@property CGPoint origin;
@end
我是这样用的:
MyUIBezierPath * path0 = [MyUIBezierPath bezierPathWithRoundedRect:
CGRectMake(0, 0, 20, 190) byRoundingCorners:UIRectCornerAllCorners
cornerRadii:CGSizeMake(10, 10)];
编译器抱怨:
Incompatible pointer types initializing 'MyUIBezierPath *__strong' with an expression of type 'UIBezierPath *'
bezierPathWithRoundedRect
返回uibezierpath。所以我不能将
setOrigin:
发送到路径0,因为它不是myuibezierpath的实例。我应该修改什么使
bezierPathWithRoundedRect
返回类的实例?编辑:在阅读了相关的问题之后,我觉得在这种情况下(扩展uibezierpath功能)子类化可能不是最好的做法。
最佳答案
一种方法是重写子类中的方法并更改返回对象的类:
#import <objc/runtime.h>
+ (UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius
{
UIBezierPath *path = [super bezierPathWithRoundedRect:rect cornerRadius:cornerRadius];
object_setClass(path, self);
return path;
}
更干净的方法是使用关联对象将属性添加到类别中的
UIBezierPath
。例如。:
static const char key;
- (CGPoint)origin
{
return [objc_getAssociatedObject(self, &key) CGPointValue];
}
- (void)setOrigin:(CGPoint)origin
{
objc_setAssociatedObject(self, &key, [NSValue valueWithCGPoint:origin], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
关于objective-c - 子类和类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13158237/