2009-08-15 4 views
3

나는 다음과 같은 코드를 사용하여 코어 애니메이션 레이어에서있는 UIImage를 만들 수 있어요 :CAShaperLayer -renderInContext가 작동하지 않습니까?

- (UIImage*)contentsImage; 
{ 
    UIGraphicsBeginImageContext([self bounds].size); 
    [self renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

이 코드는 내의 CALayer 파생 클래스입니다. 내가 겪고있는 문제는 두 레이어의 자식 계층 인 두 개의 CAShapeLayers가 결과 이미지에 렌더링되지 않는다는 것입니다. 표준 CALayers를 자식으로 추가하면 잘 렌더링됩니다. Apple docs는 다음과 같이 말합니다 :

수신자와 하위 레이어 을 지정된 컨텍스트로 렌더링합니다.

또한 iPhone OS 2.0부터 사용할 수 있다고합니다. 내가 누락 된 것이 있는지 또는 레이더를 신고해야하는지 궁금합니다.

어린이 CAShapeLayers가 이미지에 그려지지 않도록 할 수있는 아이디어가 있으십니까?

감사합니다. 연계하여있는 UIView의 drawRect 기능을 사용할 때 나는 비슷한 문제로 실행,

**Important**: The Mac OS X v10.5 implementation of this method does not 
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally, 
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers 
and properties.

을 어쨌든 : 당신의 관련된 경우

답변

4

CALayer 기계는 renderInContext를 호출하여 비트 맵 콘텐츠 속성을 만듭니다.

전체 모양 레이어의 내용과 그 첫번째 계층 사이 합성된다 그러나 CAShapeLayer에 경로 속성은 실제로 헤더에이 메모에서 볼 수 있듯이 그 내용에 렌더링되지 않습니다.

renderInContext가 실제로 당신의 컨텍스트에 CAShapeLayer 경로를 렌더링하지 않을 수도 있습니다. 그러나 나는 실제로 이것을 나 자신을 위해 시험하지 않았다.

+0

흥미 롭습니다. Apple이 내가 제출 한 레이더에서 돌아올 것 인 지 궁금합니다. 나는 그것이 내용과 첫 번째 하위 계층 사이에서 합성된다는 것을 의미하는지조차 모르겠습니다. 방법? 나는 그것이 그것을 설명 할 것 인 것을 추측한다. 내가 그 권리를 읽고 있다면 그 내용의 일부가 아닌 것처럼 보입니다. –

+0

어떤 언어로 업데이트 :? – gwdp

0

는 모르지만 메모는 말한다 renderInContext의의 CALayer 설명서에있다 이미지 컨텍스트에서 그리기. drawView를 호출하면 전반적인 UIView의 subview가 그려지지 않을 것입니다. drawRect를 호출하면 문서에서 슈퍼와 서브 뷰 구현에 관계없이 전체 영역을 채울 책임이 있습니다. 난 내 모든 subviews에 drawRect라는 자신의 프레임을 전달하여 내 문제를 해결.

그래서 renderInContext를 바꾸고 CALayer의 drawInContext를 사용하는 것이 좋습니다. 기본적으로 아무 것도하지 않기 때문에 메서드를 재정의해야합니다. 서브 클래스는 컨텍스트를 해당 프레임으로 이동해야합니다. 또한 안전을 위해 추가하는 코드가이 레이어의 정상 렌더링에 영향을 미치지 않는지 확인하고 싶을 수도 있습니다.

+0

해당 알림에 지정된 필드를 사용하지 않아서 이상하게 보입니다. 문제는 레이어를 이미지로 렌더링 한 다음 레이어 트리에 레이어를 추가하는 것만 큼 이미지 사용에 비해 성능이 현저하게 저하되므로 이미지를 다시 사용하고 싶습니다. 더 효율적으로 만들 필요가 있으므로 테이블 셀에서 사용하고 있습니다.하지만 그래픽 아티스트가 새 스킨이 필요할 때마다 새 이미지를 만들면 이미지를 즉석에서 그려야합니다. CA가 할 수있는 다른 방법이 있다고 가정합니다. 의견을 보내 주셔서 감사합니다. –

0

나는 이것에 레이더를 제출했다. 문서에서 작동하지 않아야하는 이유가 없습니다. Apple이 레이더에 응답 할 때 응답합니다.

+0

모양 자체 이외에 실제로 렌더링하는 것이 없음을 발견했습니다. 나는 그것이 그것이 설계된 방법이라고 생각하지만, 문서는 약하다. 참고로이 흥미로운 것을 발견 할 수 있습니다. http://tumbljack.com/post/179975074/complex-interpolation-with-cashapelayer-free –

+0

Apple로부터 응답을 얻었습니까? – haroldcampbell