2012-06-16 3 views
0

내부에 피아노 키보드가있는 사용자 정의보기가 있습니다. 각 키는 별도의 호출로 그려 지므로 다시 그려야하는 키만 그릴 수 있습니다. 이 뷰는 여러 개의 터치를 지원하므로 한 번에 여러 개의 키를 누르고있을 수 있습니다.iOS setNeeds 여러 지역에서 표시

각 키는 다소 비싸므로 전체보기 (눈에 띄는 지연 시간이 있음)를 다시 그리지 않으려면보기에서 터치가 감지 될 때마다 setNeedsDisplay에 특정 영역을 전달합니다.

터치를 여러 번 처리하려면 수신 된 터치 집합을 반복하고 각 터치가 키 중 하나에 있는지 확인한 다음 업데이트가 있으면 업데이트하고 setNeedsDisplay를 해당 키의 사각형으로 호출하십시오. 즉, setNeedsDisplay는 한 함수에서 여러 번 호출되지만 매번 다른 rect로 호출됩니다.

예상되는 동작은 drawRect가 다른 더티 영역으로 여러 번 호출되지만, 동시에 맨 왼쪽과 맨 오른쪽 키를 누르면 전체 뷰가 다시 그려지는 것처럼 보입니다. 맨 왼쪽과 오른쪽의 키만 누르면 (사이의 모든 키가 불필요하게 다시 그려집니다).

내가 원하는 것을 얻기 위해 무엇을 할 수 있습니까? 나는 두 개의 더러운 키 사이에있는 모든 키가 아닌, 터치 된 키를 그려야합니다.

답변

1

나는 이것에 부딪쳤고 내 질문 here을 게시했습니다.

흥미롭게도 키보드 (88 개 키)를 그렸습니다. 나는 그것을 결코 풀지 않았고 그것이 성능 문제로 밝혀지면 그것을 처리하겠다고 결심했다. (당신이 필요 할 때까지는 최적화하지 않는다.) 내가 한 일은 시작시 기본 키보드를 이미지로 렌더링하여 기본 키보드로 사용했기 때문에 전체 키보드가 아닌 눌려진 키만 그리기 만했습니다. 모든 CGPath 물건보다 이미지를 그리는 것이 더 빠릅니다.

내가 연주 한 미디 노트가 표시되어 성능이 좋았습니다. 지금 당장 걱정할 필요가 없습니다.

+0

벡터를 비트 맵으로 렌더링하는 것이 나에게 가장 좋은 솔루션처럼 들립니다. 고마워요! – phosphoer

3

setNeedsDisplayInRect:을 몇 번이나 호출했는지에 관계없이 시스템은 주 실행 루프의 턴당 하나의 drawRect: 메시지를 보냅니다. setNeedsDisplayInRect:에 전달 된 모든 더러운 직사각형의 "합집합"이상인 직사각형을 통과시킵니다. 시스템은 어떤 rect가 setNeedsDisplayInRect:으로 전달되었는지 정확히 알 수있는 방법이 없습니다.

당신은 더러운의 구형의 배열을 유지하기 위해 setNeedsDisplayInRect:을 무시할 수 (당신은 유용한 +[NSValue valueWithCGRect:] 발견 할 것이다), 그리고 drawRect:에서 배열을 취소합니다.

더러운 키 배열을 유지하고 setNeedsDisplay을 호출하는 고유 한 setNeedsDisplayForKey: 메서드를 만들 수 있습니다.