당신이 묻는 것에는 세 가지 접근법이 있습니다. drawRect:
에 모든 것을 그릴 수 있으며 여러 레이어를 관리하거나 이미지를 그릴 수 있습니다. 각각에는 장점이 있지만 우선 성능에 대한 문제를 일으키지 않도록 문제에 대해 올바르게 생각해야합니다.
그림이 끊임없이 발생합니다. 모든 것이 바뀔 때마다,해야 할 그림이 꽤 많이있을 수 있습니다. 일반적으로 전체 화면은 아니지만 여전히 많은 그림이 있습니다. drawRect:
과 drawInContext:
은 여러 번 호출 할 수 있기 때문에 효율적이어야합니다. 즉, 값 비싼 계산을 많이하고 싶지 않고 쓸모없는 그림을 많이 쓰고 싶지는 않습니다. "쓸데없는"이란 "화면 밖이거나 다른 그림에서 가려져 있기 때문에 실제로 표시되지 않습니다."라는 의미입니다.
일반적인 경우에는 실제 도면 코드를 drawRect:
에 넣지 만 일반적으로 데이터가 변경되면 다른 곳에서 모든 계산을 수행합니다. 예를 들어 데이터를 변경할 때마다 파일을 읽고 좌표를 계산하고 CG 경로를 만드는 등의 작업을 수행합니다. 모든 결과를 ivars로 저장 한 다음 drawRect:
에서 최종 결과를 그립니다. 따라서 루프 예제에서는 뷰 객체에 NSArray 이미지가 있고 drawRect:
에는 모두 순서대로 그릴 것입니다.
또 다른 방법은 각 이미지에 대해 별도의 레이어를 만들고 이미지를 콘텐츠로 설정 한 다음 레이어를보기에 첨부하는 것입니다. 그 시점에서 끝났습니다. 작성해야 할 도면 코드가 더 이상 없습니다. Quartz는 레이어를 매우 효율적으로 처리하므로 다양한 문제에 대한 매우 훌륭한 솔루션이 될 수 있습니다.
마지막으로 모든 것을 이미지로 합성 한 다음 해당 이미지를 이미지보기에 고정하거나 뷰에 직접 그려 넣거나 이미지를 레이어에 첨부 할 수 있습니다. 매우 복잡한 드로잉 (특히 CGPath 사용)이 있으면이 방법이 좋습니다. 새로운 이미지 컨텍스트를 만들고 새로운 컨텍스트에 이전 이미지를 그린 다음 그 위에 이미지를 그려 넣고 컨텍스트에서 새 이미지를 만들어야하기 때문에 끊임없이 변화하는 경우 비용이 많이 듭니다. 하지만 자주 변경되지 않는 복잡한 그림을 그리는 것이 좋습니다.
맞지만 CGContext는 캔버스와 다릅니다. 그릴 때마다 다시 그려야합니다. 직접 할 수도 있고 UIImageView와 같은 다른 뷰 객체를 사용하여 직접 할 수도 있습니다. 그러나 그것은 일방적으로 행해져 야합니다.
저는 CGContext에 대한 아이디어를 얻지 못했고, 왜 애플이 캔버스를 대신 구현하지 않았는지, 따라하기가 훨씬 쉽다고 생각합니다. 제 경우는 CGContext를 사용하여 애니메이션을 몇 개 만들 것입니다. 여러 레이어가 저에게 적합하다고 생각합니까? – Tattat
다양한 이미지를 합성하는 위치를 설명하는 경우 여러 레이어가 좋은 접근 방법 일 수 있습니다. 애니메이션은 레이어와 함께 매우 효율적입니다. –
+1 다른 기술에 대한 좋은 요약 – manifest