2012-07-02 3 views
0

나는 그 답을 찾기 위해 멀리서보고있다. 나는 여전히 iOS 개발자의 속도를 높이기 위해 올라오고 있으므로, 내가 여기서 어색함을 느낄 수는있다. 그러나 거기에 대한 답변이 완전하고 완전히 부족하여 실제로 대답이 있는지 궁금합니다. 나는 상당히 기본적인 벡터 다각형 생성하는 CGLayer를 사용하고 있습니다 : 여기 iOS : CGLayer를 어떻게 회전시킬 수 있습니까?

는 거래의

- (CGLayerRef)getASegment 
{ 
    CGSize layerSize = s_viewRects[kASegment].size; 

    CGLayerRef theLayer = CGLayerCreateWithContext (UIGraphicsGetCurrentContext(), 
     layerSize, nil); 

    CGContextRef context = CGLayerGetContext (theLayer); 

    CGContextAddLines (context, s_shapePoints, 7); 

    return theLayer; 
} 

s_viewRects이 전체 이미지에 배치로, 컨테이너의 구형을 보유하고 정적 배열을하고, s_shapePoints가 포함되어 있습니다 왜곡 된 육각형을 매핑하는 CGPoint 구조체의 배열.

이제이 모양을 다시 사용하고 싶습니다. 모든 용도에 맞게 뒤집어서 회전해야합니다 (레코드의 경우 "LED"디스플레이의 "세그먼트"입니다).

모양이 좋아요. 문제 없어.

문제는 재사용을 위해 회전시키는 데 있습니다. 실제로 CGLayer를 회전시킬 방법이없는 것 같습니다. CALayers를 회전시키는 방법은 많지만 CGLayers는 회전시키지 않습니다. CALayer가 모두 래스터 그래픽에 중점을 둔 것처럼 보이고 벡터 그래픽이 필요하다는 점을 제외하고는 CALayer를 사용해도 행복합니다.

확실한 해결 방법이 있어야합니다. 내가 지금까지 본 유일한 방법은 전체 대상 그래픽 컨텍스트를 회전하고, 모양을 그린 다음 컨텍스트를 회전 해제하는 것입니다. 전구를 돌려서 집을 돌리는 것과 같습니다.

내가 작동하도록 할 수있는 유일한 방법은 각 세그먼트를 별도로 그리기 전에 포인트를 실제로 변환하는 것인데, 이는 다시 사용할 수 없음을 의미합니다. 셰이프를 만드는 동안 CGContextRotateCTM을 수행해도 실제로 회전 된 요소가 표시되지 않습니다.

실마리가 있습니까?

+0

한숨 ... "cloo"는 농담이었습니다. –

+0

수학적으로 말하기 : 집안을 돌리는 것이 전구를 돌리는 것과 다르지 않습니다 :) - 경로를 추가하거나 그릴 때마다 CGPath 객체를 사용하고 CGAffinetransform을 추가 할 수 있으며 CGLayer는 래스터 그래픽에도 중점을 둡니다. –

답변

1

지금까지 보았던 유일한 방법은 전체 대상 그래픽 컨텍스트를 회전하고, 모양을 그린 다음 컨텍스트를 회전 해제하는 것입니다. 전구를 돌려서 집을 돌리는 것과 같습니다.

나는 당신의 해결책임을 확신합니다. 그것은 CGContextRef으로 그림을 그리는 방법입니다.

나는 CALayer가 모두 래스터 그래픽에 중점을 둔 것처럼 보이고 벡터 그래픽이 필요하다는 것을 제외하고는 기꺼이 CALayer를 사용합니다.

CAShapeLayer을 사용해 보셨습니까?

+0

와우. 나는 그들이 존재한다는 걸 잊어 버렸다. Lemme보세요. https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAShapeLayer_class/Reference/Reference.html –

+0

시도해 볼 기회를 얻은 다음 내일, 답변으로 CAShapeLayer 덧글을 확인해 보겠습니다. 그것을 구현. –

+0

CAShapeLayer가 해냈습니다. 나중에 코드를 완성 할 때 코드를 게시 할 것입니다. 감사! –

0

약속대로, 여기에 코드가 있습니다.

먼저, I는 CAShapeLayer 사용하고, 상기와 동일하게하여 작성 :

: 다음

- (CALayer *)getSegment 
{ 
    CGRect layerFrame = CGRectMake (0, 0, s_viewRects[kASegment].size.width, s_viewRects[kASegment].size.height); 

    CAShapeLayer *ret = [CAShapeLayer layer]; 

    [ret setFrame:layerFrame]; 

    CGMutablePathRef thePath = CGPathCreateMutable(); 

    CGPathAddLines (thePath, nil, s_shapePoints, 7); 

    [ret setPath:thePath]; 

    return ret; 
} 

, I는 길을 따라 변형하고,과 같이, 메인 층으로 설정할

_top_left_element = [self getSegment]; 

frame = [self calculateRectForElement:_top_left_element]; 

CATransform3D transform = CATransform3DIdentity; 
transform = CATransform3DRotate(transform, M_PI_2, 0.0, 0.0, -1.0); 

[_top_left_element setTransform:transform]; 
[_top_left_element setFrame:frame]; 
[_main_element addSublayer:_top_left_element]; 

레이어의 변환 속성이 ​​3D이므로 CATransform3DRotate가 필요합니다. 모든 변환은 라디안으로 (M_PI_2는 "90 °"를 나타내는 편리한 매크로이므로) M_PI_2를 사용하고 -1은 회전을 반 시계 방향으로 진행합니다.

calculateRectForElement는 모든 것이 배치되는 위치를 파악하는 함수입니다. 요소를 배치하는 rect를 반환합니다.

_top_left_element는 CALayer * 클래스 속성입니다.

나는 이것을했고, 비요른 스트롱 린트 렘은 당신의 삼촌입니다.

UPDATE :나는 당신이 언로드/파괴에서 레이어의 경로를 CGPathRelease, 또는 누출을 얻을 것이다 있는지 확인하는 데 필요한 추가 싶었다.

관련 문제