2013-04-12 28 views
6

Trong View and Window Architecture được nêu, quote:CALayer & drawRect

Lần làm việc kết hợp với các lớp Core Animation để xử lý các rendering và sinh động nội dung của view. Mỗi khung nhìn trong UIKit được hỗ trợ bởi một đối tượng lớp (thường là một thể hiện của lớp CALayer), quản lý cửa hàng sao lưu cho khung nhìn và xử lý các hoạt ảnh liên quan đến khung nhìn.

Xa hơn trong phần "The View Vẽ Cycle" được nêu:

lớp Các UIView sử dụng một mô hình bản vẽ theo yêu cầu để trình bày nội dung. Khi một khung nhìn đầu tiên xuất hiện trên màn hình, hệ thống sẽ yêu cầu nó vẽ nội dung của nó. Hệ thống chụp ảnh chụp nhanh nội dung này và sử dụng ảnh chụp nhanh đó làm đại diện trực quan của chế độ xem.

Điều đó có nghĩa là nội dung được vẽ trong chế độ xem trong cuộc gọi phương thức drawRect của nó, được chụp trong ảnh chụp nhanh được lưu trong lớp hoạt ảnh lõi sao lưu của nó?

Nếu không, ảnh chụp nội dung này ở đâu "nằm"? Nếu không, điều đó có nghĩa là CALayer được sử dụng để hiển thị nội dung "tĩnh", nội dung không thay đổi thường xuyên và drawRect được sử dụng để hiển thị nội dung thay đổi thường xuyên, ví dụ như trong ứng dụng trò chơi?

p.s.

Các câu hỏi không liên quan đến bất kỳ triển khai mã cụ thể nào.

Tôi chỉ muốn hiểu kiến ​​trúc lớp xem ios.

Trả lời

10

Điều đó có nghĩa là nội dung được vẽ trong chế độ xem trong cuộc gọi phương thức drawRect của nó, được chụp trong ảnh chụp nhanh được lưu trong lớp hoạt ảnh lõi sao lưu của nó không?

Có. Tất cả mọi thứ sử dụng các lớp dưới mui xe. UIView's -drawRect sẽ ghi lại những gì bạn vẽ và (theo như tôi biết) đặt content trên lớp con của chế độ xem.Nó thậm chí có thể làm điều này trên đối tượng lớp chính. Đó là nơi lưu 'ảnh chụp nhanh'.

Nếu không, điều đó có nghĩa rằng CALayer được sử dụng để làm cho "tĩnh" nội dung, nội dung mà không làm thay đổi rất thường xuyên, và drawRect được sử dụng để render nội dung thay đổi thường xuyên, ví dụ như trong một trò chơi ứng dụng?

Tần suất thay đổi nội dung không thực sự ảnh hưởng đến lựa chọn. Không có nhiều khác biệt trong việc sử dụng drawRect so với việc tạo thủ công CALayer s. Nó phụ thuộc vào cách bạn muốn sắp xếp các phần tử con trong các khung nhìn của bạn, hoặc nếu bạn muốn tạo các đối tượng lớp tái sử dụng ở mức thấp mà không có các chi tiết của UIView (ví dụ: CATextLayer). Nếu bạn có nhiều phần tử con khác nhau để vẽ thì bạn có thể chia chúng thành các lớp khác nhau với mã vẽ tùy chỉnh của riêng chúng. Nếu bạn chỉ có một phần nội dung đơn giản để vẽ, bạn có thể làm tất cả trong một triển khai drawRect đơn lẻ. Khi đã nói điều này, bạn cần phải biết rằng mỗi lớp sẽ kết thúc là một "phần tử" GPU riêng biệt, vì vậy có thể có lợi ích hiệu suất để giảm số lượng lớp bạn có hoặc sử dụng các thuộc tính shouldRasterize + rasterizationScale của một lớp cha. Thao tác này sẽ chụp nhanh toàn bộ hệ thống phân cấp lớp và tạo một hình ảnh được rasterized duy nhất để hiển thị thay vì n riêng biệt.

1

Điều đó có nghĩa là nội dung được vẽ trong chế độ xem trong cuộc gọi phương thức drawRect của nó, được chụp trong ảnh chụp nhanh được lưu trong lớp hoạt ảnh lõi sao lưu của nó không?

Hai chữ: "chi tiết thực hiện"

Nếu không, điều đó có nghĩa rằng CALayer được sử dụng để làm cho "tĩnh" nội dung, nội dung không thay đổi rất thường xuyên, và drawRect được sử dụng để hiển thị nội dung thay đổi thường xuyên, ví dụ như trong ứng dụng trò chơi?

Không chính xác. Lớp rất tốt ở nội dung hoạt ảnh (được gợi ý bằng tên khung Core Animation). drawRect là tốt cho bản vẽ tiên tiến nhưng có thể được làm chậm để vẽ lại mỗi khung (rõ ràng là tùy thuộc vào những gì bạn đang vẽ).

Tôi không thấy bất kỳ đề cập nào về số the Core Animation Programming Guide trong câu hỏi của bạn. Đây là một nơi tốt để tìm hiểu thêm về phần lớp của chế độ xem.

+0

Các lớp hoạt động tốt ở cùng một nội dung được vẽ và drawRect vẽ lại nội dung mỗi khi được gọi? –

+1

Các lớp cũng tốt khi nội suy giữa các giá trị. Ví dụ: làm động màu nền, vị trí, biến đổi, chiều rộng đường viền, v.v. –

0

Mỗi UIView có một CALayer cơ bản (đó là những gì thực sự được hiển thị trên màn hình).

Một CALayer chỉ là một bitmap (giữ pixel). Khi bạn gọi setNeedsDisplay cho chế độ xem của mình, CALayer sẽ được đánh dấu để vẽ lại. Vào cuối vòng lặp chạy, sau khi các sự kiện được xử lý, một CGContextRef được tạo ra và ủy nhiệm drawRect được gọi. Sau đó, bạn vẽ mọi thứ vào ngữ cảnh đã tạo, sau đó được sao chép vào bitmap và cuối cùng được tổng hợp với các lớp khác sẽ được hiển thị trên màn hình.

Vì vậy, có "ảnh chụp nhanh" được lưu trữ trong CALayer. Đây chỉ là một tối ưu hóa để các lớp không phải vẽ lại chính chúng trừ khi chúng được gắn cờ để được vẽ lại (với setNeedsDisplay).