我正在開發一個有幾個類的基本繪圖應用程序。其中之一是一個「線」類,它在用戶可以繪製的線上存儲一些信息。當用戶在屏幕上拖動時,會爲其手指的每次移動創建一條線,因此會在手指之後繪製一條線。我將所有線對象存儲在一個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
}
}
請定義「似乎沒有工作」。你的實現至少有幾個問題,但告訴我你首先看到的是我們知道從哪裏開始。 – 2011-03-23 00:09:33
直到我調用'setNeedsDisplay'時才繪製任何東西。考慮到這一點,一點都沒有吸引。 – Jumhyn 2011-03-23 00:15:10
1.您的無效折戟實際上看起來是否合理? drawRect被調用了嗎? 2.您的rectForLine在diffY計算中至少有一個明顯的拼寫錯誤,沒有對算法的其餘部分進行評論。 3.你的測試是否是一條線是錯誤的 - 你需要檢查一條線是否通過一個矩形,不僅僅是一條線開始還是結束。 4.如果你有10px寬的線條,你需要填充無效矩形的外部來考慮這一點。 – 2011-03-23 00:24:14