UIBezierPath: метод appendPath теряет информацию о каждом отдельном пути - PullRequest
0 голосов
/ 05 сентября 2011

проблема в этом ...

Я создал класс, который расширяет UIBezierClass с именем PathExtended, в который я добавил NSString ID;

У меня есть массив PathExtended. В методе drawrect я написал:

p = [[PathExtended alloc] init];

for (int i=0; i<[arrayOfPaths count]; i++) {

    [p appendPath:[arrayOfPaths objectAtIndex:i]];
    [p closePath];
}

[p applyTransform:CGAffineTransformMake(a, b, c, d, e, f)];
[p fill];

Теперь, если я тестирую методом touchend:

if ([p containsPoint:pointTouched]) {
            NSLog(@"There is!");
        }

Все нормально !!! Вместо этого, если я проверю:

if ([p containsPoint:pointTouched]) {
            NSLog(@"ID= %@", p.ID);
        }

Журнал пуст! !!

Я могу понять, почему это происходит, но я не могу понять, как решить проблему. Я думал, что appendPath создает уникальный путь, поэтому каждая информация о пути, например, ID, теряется. Я также подумал, что если я нарисую каждый путь без использования метода appendPath, я смогу решить проблему, но ... я не знаю ... кажется, что я иду по неправильному пути.

Есть идеи ??? Извините за мой английский (я итальянец: P)

EDIT:

PathExtended .h

@interface PathExtended : UIBezierPath {

NSString* ID;
}

@property (nonatomic, readwrite) NSString* ID;

-(id) initwithID:(NSString*) _ID;

1 Ответ

1 голос
/ 06 сентября 2011

Представьте себе, что произойдет, если вы создадите подкласс NSDecimalNumber, назовите его MyImaginaryNumber, чтобы ваш подкласс хранил воображаемый компонент.Что произойдет, если вы попытаетесь вызвать метод, подобный -decimalNumberByAdding:?Вы бы не ожидали, что реализация этого метода NSDecimalNumber включит вашу мнимую часть в полученное число, не так ли?NSDecimalNumber, очевидно, ничего не знает о мнимой части, поэтому от него нельзя ожидать правильных действий.

Если вы хотите, чтобы -appendPath: работал с вашими объектами PathExtended, вам придется переопределить-appendPath: с реализацией, которая сохраняет дополнительную информацию в PathExtended.Вы все еще можете вызвать реализацию UIBezierPath изнутри своей, если это, конечно, полезно.Например, если ваши идентификаторы являются составными, вы можете сделать что-то вроде:

-(PathExtended*)appendPath:(PathExtended*)path
{
    PathID newID = [self composeID:path.ID];
    PathExtended *newPath = [PathExtended pathWithBezierPath:[super appendPath:path] ID:newID];
    return newPath;
}

Я не уверен, почему ваше сообщение журнала вообще не печаталось, если это то, что произошло, но, скорее всего, из-заUIBezierPath не имеет свойства ID.

...