2010-04-12 2 views
0

CGContext가 직접 그릴 수 없다는 것을 알고 있으며 drawInContext의 드로잉 로직을 채우고 "setNeedsDisplay"를 사용하여 그릴 CGContext를 호출해야하므로 실행할 cmd가 설계되었지만 일부는 이 같은 문제 ... : CGContext를 사용하여 그리는 방법은 무엇입니까?

Why I can't draw in a loop? (Using UIView in iPhone)

내가 CGContext 내 이전의 프로그래밍 경험이 매우 다른 생각 ... (그래서, 내가 그리는 후, 좀 더 세부 사항을 추가 할 수 있도록 HTML5 캔버스를 사용 Java Swing 수행) 실제로, 나는 사과의 프로그래머 마음에 이런 종류의 것을 구현하는 데 적합한 지 알고 싶다. Thz.

답변

6

당신이 묻는 것에는 세 가지 접근법이 있습니다. drawRect:에 모든 것을 그릴 수 있으며 여러 레이어를 관리하거나 이미지를 그릴 수 있습니다. 각각에는 장점이 있지만 우선 성능에 대한 문제를 일으키지 않도록 문제에 대해 올바르게 생각해야합니다.

그림이 끊임없이 발생합니다. 모든 것이 바뀔 때마다,해야 할 그림이 꽤 많이있을 수 있습니다. 일반적으로 전체 화면은 아니지만 여전히 많은 그림이 있습니다. drawRect:drawInContext:은 여러 번 호출 할 수 있기 때문에 효율적이어야합니다. 즉, 값 비싼 계산을 많이하고 싶지 않고 쓸모없는 그림을 많이 쓰고 싶지는 않습니다. "쓸데없는"이란 "화면 밖이거나 다른 그림에서 가려져 있기 때문에 실제로 표시되지 않습니다."라는 의미입니다.

일반적인 경우에는 실제 도면 코드를 drawRect:에 넣지 만 일반적으로 데이터가 변경되면 다른 곳에서 모든 계산을 수행합니다. 예를 들어 데이터를 변경할 때마다 파일을 읽고 좌표를 계산하고 CG 경로를 만드는 등의 작업을 수행합니다. 모든 결과를 ivars로 저장 한 다음 drawRect:에서 최종 결과를 그립니다. 따라서 루프 예제에서는 뷰 객체에 NSArray 이미지가 있고 drawRect:에는 모두 순서대로 그릴 것입니다.

또 다른 방법은 각 이미지에 대해 별도의 레이어를 만들고 이미지를 콘텐츠로 설정 한 다음 레이어를보기에 첨부하는 것입니다. 그 시점에서 끝났습니다. 작성해야 할 도면 코드가 더 이상 없습니다. Quartz는 레이어를 매우 효율적으로 처리하므로 다양한 문제에 대한 매우 훌륭한 솔루션이 될 수 있습니다.

마지막으로 모든 것을 이미지로 합성 한 다음 해당 이미지를 이미지보기에 고정하거나 뷰에 직접 그려 넣거나 이미지를 레이어에 첨부 할 수 있습니다. 매우 복잡한 드로잉 (특히 CGPath 사용)이 있으면이 방법이 좋습니다. 새로운 이미지 컨텍스트를 만들고 새로운 컨텍스트에 이전 이미지를 그린 다음 그 위에 이미지를 그려 넣고 컨텍스트에서 새 이미지를 만들어야하기 때문에 끊임없이 변화하는 경우 비용이 많이 듭니다. 하지만 자주 변경되지 않는 복잡한 그림을 그리는 것이 좋습니다.

맞지만 CGContext는 캔버스와 다릅니다. 그릴 때마다 다시 그려야합니다. 직접 할 수도 있고 UIImageView와 같은 다른 뷰 객체를 사용하여 직접 할 수도 있습니다. 그러나 그것은 일방적으로 행해져 야합니다.

+0

저는 CGContext에 대한 아이디어를 얻지 못했고, 왜 애플이 캔버스를 대신 구현하지 않았는지, 따라하기가 훨씬 쉽다고 생각합니다. 제 경우는 CGContext를 사용하여 애니메이션을 몇 개 만들 것입니다. 여러 레이어가 저에게 적합하다고 생각합니까? – Tattat

+0

다양한 이미지를 합성하는 위치를 설명하는 경우 여러 레이어가 좋은 접근 방법 일 수 있습니다. 애니메이션은 레이어와 함께 매우 효율적입니다. –

+0

+1 다른 기술에 대한 좋은 요약 – manifest