2012-10-31 3 views
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).

ответ

0

Конечно, bezierPathWithRoundedRect возвращает UIBezierPath, потому что это метод класса UIBezierPath. Вы должны создать метод в вашем новом подклассе (MyUIBezierPath), эквивалентном одному из родительского класса, который явно создает экземпляр этого родительского класса.

Но я думаю, что это очень трудно сделать, поскольку нет методов для вызова. FWIK это почти невозможно обойтись без метода, как «initWithRoundedRect: byRoundingCorners: cornerRadii:»

+0

Так вы как раз говорил, что я должен создать 'initWithRoundedRect', что это перевыполнение' bezierPathWithRoundedRect'. Я действительно не вижу повторного использования кода здесь. Не следует ли мне что-то делать с экземпляром UIBezierPath, возвращаемым 'bezierPathWithRoundedRect'? – alecail

+0

Проблема в том, что он всегда будет возвращать экземпляр UIBezierPath. Поскольку единственный способ создания и инициализации экземпляров - использовать методы класса, я не могу понять, как инициализировать подкласс этого класса. – Gabriel

1

Один из способов сделать это путем переопределения метода в подклассе и изменить класс возвращаемого объекта:

#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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^