2010-06-09 36 views
5

Tôi có một ứng dụng mà tôi đang làm một số bản vẽ tùy chỉnh, một loạt các dòng trên nền gradient, như vậy (bỏ qua văn bản, chúng chỉ là UILabels) :Vẽ đồ họa tùy chỉnh trên iPhone: CALayer vs. CGContext

http://prehensile.co.uk/outgoing/Screenshot2010-06-09at12.22.32.png

Tại thời điểm này, đó là tất cả được thực hiện bằng cách bắt đầu một CGContext mới, vẽ thứ vào nó với CGContextDrawLinearGradient và CGContextStrokePath, sau đó cuối cùng đã tiết kiệm hình ảnh kết quả với UIGraphicsGetImageFromCurrentImageContext. Thông tin định vị được tính toán trong khi tôi đang đặt ra các nhãn đó, vì vậy nó sẽ là một PITA (và nhân bản của nỗ lực) để tính toán nó trên một lần nữa khi UIView chứa được vẽ với drawRect, vì vậy tôi vẽ nó trước thời gian vào một UIImage. Tất cả các công trình tốt, cho đến nay rất tốt.

Tuy nhiên, tôi có một nghi ngờ lén lút rằng có thể hiệu quả hơn khi sử dụng CALayers để vẽ bản vẽ này. Sự hiểu biết của tôi về sự khác biệt giữa hai cách tiếp cận là một CALayer giống như một loạt các hướng dẫn để vẽ, và chiếm ít bộ nhớ hơn cho đến khi nó thực sự được vẽ trên màn hình, trong khi vẽ mọi thứ vào UIImage trước bạn đã có một bitmap lớn sodding đá xung quanh trong bộ nhớ tất cả các thời gian, cho dù nó được rút ra hay không.

Đó có phải là sự hiểu biết chính xác không? Điều gì thường được coi là cách tốt nhất để vẽ hình ảnh tùy chỉnh trên iPhone?

Trả lời

1

Câu trả lời khá muộn nhưng có thể sẽ hữu ích.

CA là lớp trừu tượng cao hơn CG, vì vậy bạn sẽ thực hiện được mọi thứ trong CA, nhưng có một vài ưu điểm khi xử lý sẽ diễn ra tại thời điểm hiển thị và tiết kiệm bộ nhớ của bạn .

Đối với đường dẫn bạn vẽ, bạn có thể sử dụng CAShapeLayer và đặt màu đường dẫn và nét vẽ khi bạn thực hiện bố cục. Mỗi CAShapeLayer có kiểu stroke riêng của nó, vì vậy, có vẻ như bạn đang sử dụng một số đường màu trắng và một số độ dày của màu đen, mỗi kiểu dòng khác nhau sẽ cần một CAShapeLayer riêng biệt.

Đối với độ dốc tuyến tính, bạn có thể tạo một hình ảnh 1x50 và để một độ dài CALayer đến độ rộng yêu cầu tại thời gian hiển thị. Đặt nội dung của CALayer thành CGImageRef và bất cứ chế độ nào để kéo nội dung.

CALayers sẽ là chiến thắng rõ ràng cho dấu chân bộ nhớ; thời gian xử lý không bao giờ rõ ràng; hình ảnh được hiển thị trước vẫn có thể giành chiến thắng ở đó.

0

Bạn có thể tạo lớp để vẽ hình ảnh, khi hình ảnh thay đổi hoặc bất cứ khi nào bạn muốn thay đổi bản vẽ hiện tại, sử dụng [setNeedsDisplay], điều này sẽ làm cho lớp vẽ lại nội dung.

bằng phương pháp trên, bạn có thể vẽ lại hình ảnh theo ý muốn, không vẽ lại lần nữa

Các vấn đề liên quan