Подкласс C4Shape не становится строкой с методом экземпляра

Я создал подкласс Lines, который наследуется от C4Shape. Пока все, что он делает - это создает случайную строку при вызове метода класса.

Предполагается, что каждая новая строка начинается с предыдущей строки. pointB (т.е. конечная точка), чтобы сделать непрерывное дерево линий. В конце концов, у меня будет несколько строк с одной и той же конечной точкой, старые исчезнут и т. Д. Вот код, который у меня есть до сих пор:

+(Lines *)createLineFromPoint:(CGPoint)startPoint {
CGPoint endPoint = CGPointMake([C4Math randomIntBetweenA:(startPoint.x-50) andB:(startPoint.x+50)],
                               [C4Math randomIntBetweenA:(startPoint.y-50) andB:(startPoint.y+50)]);
CGPoint linePoints[2] = {startPoint, endPoint};
Lines *newLine = [Lines new];
[newLine line:linePoints]; //This should make newLine a line type, should it not?
newLine.lineWidth = 3.0f;

return newLine;
}

-(void) setup {
[self performSelector:@selector(continueMakingLinesWithLine) withObject:(self) afterDelay:(3.0)];
}

-(void) continueMakingLinesWithLine {
[self.arrayOfLines addObject:[Lines createLineFromPoint:self.pointB]];
}

Насколько я могу судить, он должен зацикливаться после первого вызова continueMakingLinesWithLine в C4WorkSpace; первый вызов создается с помощью случайно сгенерированного CGPoint.

Тем не менее, мне действительно трудно получить доступ к pointB свойство, которое было установлено во время последнего вызова метода.

Я получил ошибку, которая говорит мне, что это потому, что C4Shape*(Линии *) не имеет типа линии или дуги.

Однако метод экземпляра должен делать его такого типа, не так ли?

1 ответ

Решение

Я не уверен, что означает ваша настоящая ошибка. Ваша логика вполне верна, хотя.

Перво-наперво, в вашем коде у вас есть следующее:

[newLine line:linePoints]; //This should make newLine a line type, should it not?

Ответ YES, и это!

Я скопировал ваш код в новый проект и добавил каждую строку на холст по мере его создания. Бег, хотя и не так, как я ожидал. Однако это не твоя вина.

Вы фактически обнаружили небольшую ошибку в реализации метода [shapeObj line:...].

Я исправлю ошибку в проекте C4iOS на GitHub, однако она не появится в вашем проекте с вашим текущим установщиком.

Временное решение

Вы можете сделать одну из двух вещей:

1) Возврат C4Shape от вашего подкласса линий и инициализировать его с помощью [C4Shape line:linePoints]

2) Добавить следующее к line 400 из C4Shape.m:

if(CGRectEqualToRect(CGRectZero, self.frame)) { self.frame = lineRect; }

За 1) Ваш метод должен выглядеть так:

+(Lines *)createLineFromPoint:(CGPoint)startPoint {
    CGPoint endPoint = CGPointMake([C4Math randomIntBetweenA:.. andB:..],
                                   [C4Math randomIntBetweenA:.. andB:..]);
    CGPoint linePoints[2] = {startPoint, endPoint};
    C4Shape *newLine = [C4Shape line:linePoints];
    newLine.lineWidth = 3.0f;
    return (Lines *)newLine;
}

За 2) конец метода в C4Shape.m должен выглядеть так:

-(void)_line:(NSArray *)pointArray {
    //Default implementation
    //..
    //..
    newBounds.origin = CGPointZero;
    if(CGRectEqualToRect(CGRectZero, self.frame)) { self.frame = lineRect; }
    CGPathRelease(newPath);
    _initialized = YES;
}

Если вы делаете 2) вам не нужно исправлять свой текущий +(Lines *) метод.

Другие вещи

Я ужесточил код, который вы разместили выше, чтобы он выглядел следующим образом:

@interface C4WorkSpace ()
@property NSMutableArray *arrayOfLines;
@end

@implementation C4WorkSpace

-(void) setup {
    self.arrayOfLines = [@[] mutableCopy];
    Lines *newLine = [Lines createLineFromPoint:self.canvas.center];
    [self.arrayOfLines addObject:newLine];
    [self.canvas addShape:newLine];
    [self continueMakingLinesWithLine];
}

-(void) continueMakingLinesWithLine {
    CGPoint p = ((Lines *)[self.arrayOfLines lastObject]).pointB;
    Lines *newLine = [Lines createLineFromPoint:p];
    [self.arrayOfLines addObject:newLine];
    [self.canvas addShape:newLine];
    [self runMethod:@"continueMakingLinesWithLine" afterDelay:1.0f];
}
@end

В setup Я создаю первую строку и добавляю ее на холст И в массив. Затем я позволил continueMakingLinesWithLine метод найти предыдущую строку, построить новую и затем вызвать себя снова.

Другие вопросы по тегам