2012-08-12 2 views
6

저는 그리기 앱이 있으며 사용자가 그림의 일부로 입자 효과를 사용할 수 있기를 바랍니다. 기본적으로, 응용 프로그램의 요점은 사용자 정의 도면을 수행하고 카메라 롤 또는 공유 월드 와이드 웹에 저장하는 것입니다.superlayer의 -renderInContext :가 렌더링 될 때 렌더링되지 않습니다.

내가 최근에 CAEmitterLayer 클래스를 만났습니다. 입자 효과를 추가하는 간단하고 효과적인 방법이라고 생각합니다.

CAEmitterLayer 구현을 사용하여 앱에서 화면에 입자를 그릴 수있었습니다. 따라서 화면 상에 렌더링하는 것이 좋습니다.

나는 CAEmitterLayer는 "애니메이션"입자의 일정한 상태에

일어나고 내가 무슨 생각

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. 

사용하여 도면의 내용을 렌더링에 대한 이동합니다. 그래서 레이어 렌더링을 시도 할 때 (애니메이션을 layers.presentationLayer 및 modelLayer로 렌더링하려고 시도한 경우) 애니메이션이 커밋되지 않으므로 화면 이미지 렌더링에 입자가 포함되지 않습니다.

질문 누군가의 내용을 화면에 표시하지 않았습니까? 그렇다면 어떻게하셨습니까?

대체 질문 누구나 OpenGL을 사용하지 않고 Cocos2D가 아닌 입자 효과 시스템 라이브러리를 알고 있습니까?

+0

행운이 있나요? –

+0

아니요, 아래 Revis 대답을 참조하십시오. CAEmitterLayer가 renderInContext를 호출 할 수 없습니다. – micksabox

답변

4

-[CALayer renderInContext:]은 몇 가지 간단한 경우 유용하지만 더 복잡한 상황에서는 예상대로 작동하지 않습니다. 그림을 그리는 다른 방법을 찾아야합니다.

The documentation for -[CALayer renderInContext:]는 말한다 :이 방법의

맥 OS X v10.5의 구현하지 지원 전체 코어 애니메이션 구성 모델을 수행합니다. QCCompositionLayer, CAOpenGLLayer 및 QTMovieLayer 레이어가 렌더링되지 않았습니다. 또한 3D 변형을 사용하는 레이어는 렌더링되지 않으며 backgroundFilters, filters, compositingFilter 또는 마스크 값을 지정하는 레이어도 아닙니다. Mac OS X의 이후 버전에서는 에 이러한 레이어 및 속성 렌더링을 지원할 수 있습니다.

(이러한 제한 사항은 iOS에도 적용됩니다.)

헤더 CALayer.h는 말한다 :

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

멋지게 언급했습니다! 다른 사람들은 이것을 원한다. 픽셀을 잡는 데 문서화되지 않은 방법이 있지만 물론 제출 된 앱에서는 결코 사용할 수 없다. 어떻게 든 비트 맵 컨텍스트에 유사한 레이어를 추가 할 수 있는지 궁금합니다. 그것은 사용자가 본 것이 아니지만 비슷한 것을 얻을 수 있습니까? –

+0

문서화되지 않은 방법으로이 사실을 알고 있습니까? – Chris

0

내 CAEmitterLayer가 현재 컨텍스트 내에서

Swift 

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



Objective-C 

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

으로 현재 애니메이션 상태에서 올바르게 이미지로 렌더링 얻을 수 있었다

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

및 afterScreenUpdates를 true로 설정 | 예

행운을 빈다 : D

+1

우리는 이것을 사용할 수 있지만 CAEmitterLayer는 두 번째 스크린 샷에서 느려질 것입니다. – Uttam

관련 문제