2011-02-11 19 views
5

Tôi đã đọc những gì tôi tin là các phần liên quan của Hướng dẫn lập trình 2D 2D, nhưng không thể tìm thấy câu trả lời cho câu hỏi sau (có vẻ như chúng không nói được rất nhiều về iOS trong tài liệu):Cách tạo một CGLayer từ UIView để vẽ ngoài màn hình

Ứng dụng của tôi hiển thị bản vẽ trong UIView. Mỗi bây giờ và sau đó tôi phải cập nhật bản vẽ theo một cách nào đó, ví dụ: thay đổi màu tô của một trong các hình dạng (tôi giữ CGPathRefs thành các hình dạng quan trọng để có thể vẽ lại chúng bằng một màu tô khác sau). Như đã trình bày trong mục "Vẽ Với CGLayer" trên trang 169 của tài liệu nói trên, tôi đã nghĩ đến việc vẽ toàn bộ bản vẽ thành một CGContext rằng tôi sẽ có được từ một CGLayer, như vậy:

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

Sau đó, tôi có thể làm cập nhật của tôi tắt màn hình vào CGContext và vẽ CGLayer vào UIView của tôi trong drawRect các 's UIView: phương pháp, như vậy:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

vấn đề tôi đang gặp là, nơi nào tôi nhận được CGLayer tôi từ ? Sự hiểu biết của tôi là tôi phải làm cho nó bằng cách sử dụng CGLayerCreateWithContext và cung cấp một thông số CGContext mà từ đó nó kế thừa hầu hết các thuộc tính của nó. Rõ ràng, bối cảnh đúng sẽ là bối cảnh của UIView, rằng tôi nhận được với

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

nhưng nếu tôi không nhầm, tôi chỉ có thể nhận được rằng trong drawRect: Phương pháp và nó không phải là hợp lệ khi cho rằng bối cảnh tôi đưa ra sẽ có cùng một lần sau khi phương thức được gọi, tức là tôi chỉ có thể sử dụng phương thức đó CGContext cục bộ trong phương thức.

Vì vậy, làm thế nào tôi có thể nhận được một CGContext mà tôi có thể sử dụng để khởi của tôi CGLayer để tạo ra một offscreen CGContext để vẽ vào và sau đó vẽ toàn bộ lớp trở lại vào UIView tôi 's CGContext?

PS: Trong khi bạn đang ở đó; nếu bất cứ điều gì ở trên không có ý nghĩa hoặc không lành mạnh, xin vui lòng cho tôi biết. Tôi chỉ mới bắt đầu có được đầu xung quanh Quartz 2D.

Trả lời

1

Trước hết, nếu bạn đang làm điều đó từ trong môi trường iOS, tôi nghĩ bạn đúng. Các tài liệu nói rõ ràng rằng cách duy nhất để có được một CGContextRef là bởi

CGContextRef ctx = UIGraphicGetCurrentContext(); 

Sau đó, bạn sử dụng bối cảnh đó để tạo CGLayer với

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL); 

Và nếu bạn muốn vẽ trên layer đó, bạn có để vẽ nó với bối cảnh bạn nhận được từ lớp. (Nó hơi khác so với ngữ cảnh bạn đã truyền vào trước đó để tạo CGLayer). Tôi đoán việc CGLayerCreateWithContext lưu thông tin mà nó có thể nhận được từ ngữ cảnh được chuyển vào, nhưng không phải mọi thứ. (Một trong những ví dụ là thông tin ColorSpace, bạn phải xác định lại khi bạn điền vào một cái gì đó với bối cảnh từ CGLayer).

Bạn có thể lấy tham chiếu ngữ cảnh CGLayer từ hàm CGLayerGetContext() và sử dụng để vẽ.

CGContextRef layerCtx = CGLayerGetContext(layer); 
CGContextBeginPath(layerCtx); 
CGContextMoveToPoint(layerCtx, -10, 10); 
CGContextAddLineToPoint(layerCtx, 100, 10); 
CGContextAddLineToPoint(layerCtx, 100, 100); 
CGContextClosePath(layerCtx); 

Một điểm mà tôi phát hiện ra là khi bạn vẽ một thứ gì đó trên màn hình, nó sẽ tự động tắt nội dung ngoài màn hình. (có ý nghĩa, vì vậy nó không vẽ những thứ không được nhìn thấy) nhưng khi bạn di chuyển lớp (sử dụng phép biến đổi ma trận). Đường dẫn bị cắt không hiển thị (thiếu).

Một điều cuối cùng, nếu bạn lưu các tham chiếu đến một lớp vào một biến và sau này bạn muốn vẽ nó, bạn có thể sử dụng CGContextDrawLayerAtPoint() phương pháp như

CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

Nó sẽ sắp xếp của "stampt" hoặc " vẽ "lớp tại điểm mới đóX và tọa độ PointY mới.

Tôi hy vọng rằng câu trả lời cho câu hỏi của bạn, nếu nó không vui lòng cho tôi biết.

+0

Tôi cũng bị kẹt với vấn đề CGLayer, tôi không hiểu cách viết cho nó trong các chức năng được chạm vào của tôi, bạn có thể vui lòng xem bài đăng của tôi http://stackoverflow.com/questions/11341763/how-to- sử dụng-cglayer-cho-tối ưu-vẽ – Ranjit

+0

CGContextBeginPath() và CGContextClosePath() có một tham số của bối cảnh. – Ant

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