Подкласс 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
метод найти предыдущую строку, построить новую и затем вызвать себя снова.