3

我想继承 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:到 path0,而不是 MyUIBezierPath 的一个实例。

我应该修改什么以bezierPathWithRoundedRect返回我的类的实例?

编辑:阅读相关问题后,我觉得在这种情况下子类化可能不是最好的事情(扩展 UIBezierPath 功能)。

4

2 回答 2

1

One way you can do that is by overriding the method in the subclass and changing the class of the returned object:

#import <objc/runtime.h>

+ (UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius
{
    UIBezierPath *path = [super bezierPathWithRoundedRect:rect cornerRadius:cornerRadius];

    object_setClass(path, self);

    return path;
}

The cleaner way to do this is to use Associated Objects to add the property to UIBezierPath in a category.

e.g.:

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);
}
于 2013-04-24T00:03:32.747 回答
0

当然,bezierPathWithRoundedRect 返回一个 UIBezierPath,因为它是 UIBezierPath 类的方法。您必须在新子类 (MyUIBezierPath) 中创建一个方法,该方法等效于显然创建该父类实例的父类之一。

但我认为这很难做到,因为没有方法可以调用。FWIK几乎不可能没有像“initWithRoundedRect:byRoundingCorners:cornerRadii:”这样的方法

于 2012-10-31T16:00:59.200 回答