몇 가지 클래스가있는 기본 그리기 앱을 개발 중입니다. 이 중 하나는 사용자가 그릴 수있는 줄에 정보를 저장하는 "Line"클래스입니다. 사용자가 화면을 드래그하면 손가락이 움직일 때마다 선이 만들어 지므로 손가락을 따라 선이 그려집니다. 모든 라인 객체를 NSArray에 저장하고 무언가가 바뀔 때마다 다시 그립니다. 그러나 어레이가 계속 커지기 시작하고 궁극적으로 속도가 느려지 기 시작합니다. 새로운 라인을 그릴 수있는 방법이 있을까요?효율적인 드로잉 저장 방법?
편집 : 대답을 읽어보십시오. 그러나 setNeedsDisplayInRect:
은 작동하지 않는 것 같습니다. 그래서처럼 호출 오전 :는 "라인은"데이터 모델의 포인트 단지 한 쌍의 경우
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *t in touches) {
//add line to array w/ x and y values from touch
[self setNeedsDisplayInRect:[self rectForLine:line]];
}
}
-(CGRect)rectForLine:(Line*)line {
CGFloat x1 = [line begin].x;
CGFloat y1 = [line begin].y;
CGFloat x2 = [line end].x;
CGFloat y2 = [line end].y;
CGFloat originX = (x1>x2) ? x1 : x2;
CGFloat originY = (y1<y2) ? y1 : y2;
CGFloat diffX = ((x1>x2) ? x1 : x2) - originX;
CGFloat diffY = ((y1>x2) ? y1 : y2) - originY;
return CGRectMake(originX, originY, diffX, diffY);
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 10.0);
CGContextSetLineCap(context, kCGLineCapRound);
//[[UIColor blackColor] set];
for (Line *line in completeLines) {
if (CGRectContainsPoint(rect, [line begin]) && CGRectContainsPoint(rect, [line end])) {
//draw line onto the screen
}
}
"작동하지 않는 것 같습니다"라고 정의하십시오. 최소한 구현에 몇 가지 문제가 있지만 처음부터 어디서부터 시작해야하는지 알려주세요. –
'setNeedsDisplay'를 호출 할 때까지 아무 것도 그려지지 않습니다. 그걸 꺼내면 아무것도 그릴 수 없습니다. – Jumhyn
1. 유효하지 않은 rect는 실제로 합리적으로 보입니까? drawRect가 호출되고 있습니까? 2. rectForLine에는 나머지 알고리즘에 대해 언급하지 않고 diffY 계산에서 적어도 하나의 명백한 오자가 있습니다. 3. 라인이 rect에 있는지 여부에 대한 테스트가 잘못되었습니다. 라인이 rect에서 지나가는 지 여부를 확인해야합니다. 4. 너비가 10px 인 경우이를 고려하여 유효하지 않은 rect 외부를 채워야합니다. –