2012-04-21 6 views
0

iOS 앱의 경우 사용자가 화면에서 손가락을 슬라이드하면 50,000 도트가 기록됩니다. 도면을 drawRect이 모든 점에 대해 수행되는 경우, 다음 번에 사용자가 touchesMoved 다음 줄의 끝에서, 50,001 점을 감동iOS에서 drawRect를 사용하지 않고 무언가를 그릴 수 있습니까?

[self.view setNeedsDisplay]; 

다시 실행 drawRect의 원인이 모두 50,001 점으로 그려진 것 다시. 따라서 새로운 손가락 움직임 1 개마다 1 개의 점마다 50,001 개의 점을 다시 그려야하며 효율적인 방법은 아닙니다.

drawRect의 마지막 점을 그리기 만하면 기존보기를 "추가"하지 않고 "모든 것을 지우고"한 점을 그립니다.

1) 할 수있는 방법이 drawRect 호출이 필요없이 그 일 추가 점을 그릴 수 있습니까?
2) 또는 drawRect 전체 화면을 처음으로 닦지 않고 여분의 점 하나를 그릴 수 있습니까?

+2

50k 도트를 모두 기록하지 말고 refresh-call (drawRect)에서 가장 최근의 것만을 그립니다. 다른 하나 (49.9k)는 기본적으로 캐시로 작동하는 비트 맵에 직접 그릴 수 있습니다. 따라서 비트 맵 도트는 하나씩 다시 그릴 필요가 없으며 한 번에 blitted 할 수 있습니다. – Till

답변

1

터치를 끝낼 때 이미지로 렌더링 한 다음 더 많은 경로가 생성 될 때 이미지에 계속 추가 할 수 있습니다. 필요한 경우 배열에 경로를 저장하고 버퍼를 실행 취소하거나 도면을 재생성해야 할 수 있습니다. FWIW, 내가 iOS5를 홀수/버그로 setNeedsDisplayInRect:을 발견했다 -

은 오

UIGraphicsBeginImageContextWithOptions(size, NO, 1.0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
// do some drawing 
UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

(당신은 분명,이보다 더 많은 코드가 필요합니다). 첫 번째 호출은 전체 뷰 rect이며 param으로 전달 된 rect는 아닙니다. 적어도 그것은 그것을 사용하려고 할 때 발견 한 것입니다. 아마도 내가 간과 한 구현 세부 사항이있을 수 있습니다.

+1

난 drawRect : 첫 번째 때,보기 전체 rect (UIKit, setNeedsDisplayInRect 함께 귀하의 요청에 의해 호출 된)로 표시됩니다 호출됩니다 : 그것은 예상 된 동작입니다. setNeedsDisplayInRect를 사용하여 이미 그려진 뷰의 일부만 무효화합니다. – graver

+0

여기에 내 원래 질문 : http://stackoverflow.com/questions/9299018/setneedsdisplayinrect-bug-in-ios5 -보기가 이미로드 된 후 특정 터치 방식으로 문제를보고있었습니다.나는 다른 날에 docs @ "view가 참조 될 때 생성됩니다"또는 이와 비슷한 것을 보았습니다 - 그래서 내가 코드에서 처음 참조 할 때 전체보기가 그려지 는가? 그래도 버그 같아. –

1

-(void)setNeedsDisplayInRect:을보십시오. 보기를 요청하여 자신의 지정된 사각형을 다시 그리지 만 drawRect: 메서드를 구현할 때는주의해야합니다. 전달 된 rect 인수는보기의 전체 rect 조각 일 뿐이지 만 그리기 논리가 다를 수 있다고 가정해야합니다. 또한 UIView의 clearContextBeforeDrawing 속성을 고려해 볼 수 있습니다.

+0

이상한,'self.clearsContextBeforeDrawing = NO;'를'TestView'의'initWithFrame'에 넣고 ViewController에'[self.view setNeedsDisplay];를 호출하기 전에 (self.view.clearsContextBeforeDrawing = NO; ') 어떤 것이 그려지기 전에 뷰가 여전히 지워집니다. –

+0

setNeedsDisplayInRect를 호출하면 어떻게됩니까? setNeedsDisplay는 일반적으로 전체보기를 다시 그려야 함을 의미합니다. – graver

+0

단순함 때문에 나는 '[self.view setNeedsDisplayInRect : CGRectMake (0, 0, 600, 600)];'를 사용하고 왼쪽 상단 600 x 600 영역을 그렸다. –

관련 문제