我想子类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/

10-14 04:35