2012-08-12 18 views
6

Tôi có ứng dụng vẽ và tôi muốn người dùng của mình có thể sử dụng hiệu ứng hạt như một phần của bản vẽ. Về cơ bản, điểm của ứng dụng là thực hiện vẽ tùy chỉnh và lưu vào Camera Roll hoặc chia sẻ trên World Wide Web.CAEmitterLayer không hiển thị khi -renderInContext: của siêu lớp được gọi là

Tôi đã truy cập vào lớp học CAEmitterLayer gần đây, mà tôi cho là một cách đơn giản và hiệu quả để thêm hiệu ứng hạt.

Tôi đã có thể vẽ các hạt trên màn hình trong ứng dụng bằng cách thực hiện CAEmitterLayer. Vì vậy, hiển thị trên màn hình hoạt động tốt.

Khi tôi đi về render các nội dung của bản vẽ sử dụng

CGContextRef context = UIGraphicsBeginImageContextWithSize(self.bounds.size); 

// The instance drawingView has a CAEmitterLayer instance in its layer/view hierarchy 
[drawingView.layer renderInContext:context]; 


//Note: I have also tried using the layer.presentationLayer and still nada 

.... 
//Get the image from the current image context here for saving to Camera Roll or sharing 


....the particles are never rendered in the image. 

Những gì tôi nghĩ đang xảy ra

Các CAEmitterLayer là trong trạng thái liên tục của "hiệu ứng động" các hạt. Đó là lý do tại sao khi tôi cố gắng hiển thị lớp (tôi cũng đã thử hiển thị layers.presentationLayer và modelLayer), hoạt ảnh không bao giờ được cam kết và do đó việc hiển thị hình ảnh màn hình tắt không chứa các hạt.

Câu hỏi Có ai đã hiển thị nội dung của màn hình ngoài CAEmitterLayer không? Nếu vậy, làm thế nào bạn làm điều đó?

Câu hỏi thay thế Có ai biết về bất kỳ thư viện hệ thống hiệu ứng hạt nào không sử dụng OpenGL và không phải là Cocos2D không?

+0

Có may mắn với điều này không? –

+0

Không, xem Revis trả lời dưới đây. CAEmitterLayer không thể gọi renderInContext: – micksabox

Trả lời

4

-[CALayer renderInContext:] hữu ích trong một vài trường hợp đơn giản, nhưng sẽ không hoạt động như mong đợi trong các tình huống phức tạp hơn. Bạn sẽ cần phải tìm một số cách khác để làm bản vẽ của bạn.

The documentation for -[CALayer renderInContext:] nói:

Các Mac OS X v10.5 thực hiện phương pháp này không hỗ trợ toàn bộ Core Animation mô hình thành phần. Các lớp QCCompositionLayer, CAOpenGLLayer và QTMovieLayer không được hiển thị là . Ngoài ra, các lớp sử dụng phép biến đổi 3D không được hiển thị là cũng như các lớp chỉ định backgroundFilters, bộ lọc, compositingFilter hoặc giá trị mặt nạ. Các phiên bản Mac OS X trong tương lai có thể thêm hỗ trợ để hiển thị các lớp và thuộc tính này.

(Những giới hạn này cũng áp dụng cho iOS.)

Tiêu đề CALayer.h cũng nói:

* WARNING: currently this method does not implement the full 
* CoreAnimation composition model, use with caution. */ 
+0

Được nói rõ ràng! Những người khác muốn làm điều này, có một số cách không có giấy tờ để lấy các điểm ảnh nhưng tất nhiên bạn không bao giờ có thể sử dụng nó trong một ứng dụng đã gửi. Tôi tự hỏi nếu bạn bằng cách nào đó có thể thêm một lớp tương tự như một bối cảnh bitmap, và sau đó lấy đó? Nó sẽ không phải là những gì người dùng nhìn thấy nhưng có lẽ bạn có thể nhận được một cái gì đó tương tự? –

+0

Bạn có biết cách nào để làm điều này không? – Chris

0

tôi đã có thể để có được CAEmitterLayer tôi trả lại như một hình ảnh một cách chính xác trong tình trạng hoạt hình hiện tại của mình với

Swift 

func drawViewHierarchyInRect(_ rect: CGRect, 
      afterScreenUpdates afterUpdates: Bool) -> Bool 



Objective-C 

- (BOOL)drawViewHierarchyInRect:(CGRect)rect 
      afterScreenUpdates:(BOOL)afterUpdates 

trong bối cảnh hiện nay

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

và đặt afterScreenCập nhật thành đúng | YES

Chúc bạn may mắn với điều đó: D

+1

Chúng ta có thể sử dụng nhưng CAEmitterLayer sẽ trở nên chậm chạp từ ảnh chụp màn hình thứ hai. – Uttam

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