2009-08-01 2 views
3

두 UI를 동일한 UIView에서 올바르게 사용할 수 있습니까?CALayer drawInContext 대 addSublayer

I 하나 맞춤 난 내용으로 오버레이 PNG 이미지를 설정하는 다른을 drawInContext 제가

내의 패턴을 그릴 수있는 서브 클래스의 CALayer을했다.

나는 세 번째 배경을 가지고 있습니다.

어떻게이 3 가지 항목을 모두 오버레이합니까?

[self.layer addSublayer:bottomLayer]; // this line is the problem 

[squaresLayer drawInContext:viewContext]; 
[self.layer addSublayer:imgLayer]; 

내가 그 순서대로하면 다른 2 명이 올바르게 그려집니다. bottomLayer를 어디에 놓고 상관없이 항상 squaresLayer가 그릴 수 없습니다. 3 레이어가 필요한 이유는 배경 및 사용자 지정 레이어의 색상을 애니메이션으로 만들려고하기 때문입니다. 상단 레이어는 단지 그래픽 오버레이입니다.

+0

몇 가지 질문 : 레이어가 그려지지 않았습니까? 아니면 그려져 있지만 당신에게 당신이 찾고있는 결과를주지 않을 수 있습니까? 레이어는 어떻게 겹 칩니 까? 이 레이어가 모두 동일한보기에 있어야하거나 다른보기로 그 중 하나를 분할 할 수 있습니까? – Amagrammer

+0

안녕하세요, 글쎄, 그들은 동일한 UIView에있을 수 있어야합니다, 내가 subviews를 사용할 수있을 것 같아요, 레이어를 합성하기 위해 별도의 뷰를 사용하는 것 같습니다. 그러나 나는 2 개의 커스텀 레이어를 만들어서 해결책을 찾았다. "addSublayer"를 통해 self.layer에 추가 된 내용은 "drawInContext"를 통해 그려지는 모든 내용 위에 그려 지는데 이는보기의 .layer. 좋아, 그걸 알아 내서 그 컨텍스트에 2 개의 레이어를 렌더링하고 맨 위에 imgLayer를 추가했습니다. 잘 작동합니다. NSTimer를 사용하여 애니메이션을 감았을 때 drawInContext를 실행하는 뷰가 새로 고쳐집니다. – Michael

답변

1

뿐만 아니라 경우에 누군가가 자신의 내부 무승부를 쌓아 CALayers 애니메이션을하려고에 코드를 붙여 넣을 수 있음은

- (void)drawRect:(CGRect)rect { 

    [imgLayer removeFromSuperlayer]; 

    CGFloat w = [self.blockViewDelegate w]; 
    CGFloat h = [self.blockViewDelegate h]; 

    CGFloat wb = w/4; 
    CGFloat hb = h/4; 

    CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

    // Layers 

    [bottomLayer sizes:wb :hb :1]; 
    bottomLayer.frame = CGRectMake(0, 0, w, h); 
    bottomLayer.opaque = NO; 

    [topLayer sizes:wb :hb :0]; 
    topLayer.frame = CGRectMake(0, 0, w, h); 
    topLayer.opaque = NO; 

    // Overlay 

    imgLayer.frame = CGRectMake(0, 0, w, h); 
    imgLayer.opaque = NO; 
    imgLayer.opacity = 1.0f; 

    UIImage *overlay = [self.blockViewDelegate image]; 
    CGImageRef img = overlay.CGImage; 
    imgLayer.contents = (id)img; 

    // Add layers 

    [bottomLayer drawInContext:viewContext]; 
    [topLayer drawInContext:viewContext]; 
    [self.layer addSublayer:imgLayer]; 

} 

blockViewDelegate 내가 너비, 높이 및 이미지 정보를 저장하고 어디에서, 그것은이다 루틴 이 UIView 컨트롤러.

topLayer 및 bottomLayer는 다양한 색상 정보로보기에 모양을 그리는 사용자 정의 UIView 하위 클래스입니다. 나중에 내 애니메이션에서 타이머로 반복적으로 "setNeedsDisplay"를 실행하고이 루틴을 반복하고 업데이트 된 매개 변수를 사용하여 레이어를 다시 그립니다.