2014-12-18 3 views
2

CALayer의 현재 회전 (때로는 위치)을 업데이트하려고합니다.CALayer의 회전 업데이트

나는 간단한 단계의 몇에 노력하고 무엇 :

  1. 스토어 배열 CALayers의 몇 가지, 그래서 나는
  2. 0,0 모든 CALayers의 앵커 포인트를 설정을 다시 사용할 수 있습니다 . 객체가 층을 그 위치
  3. 업데이트 새로운 값
  4. 맞게의 CALayer의 위치와 회전의 원으로 동일한 각도만큼 회전
  5. 원의 위치에서 시작하는 위치
  6. CALayer 오브젝트 그리기

    lineWidth는 라인
    self.items의 폭이를 포함하는 어레이이다 : 여기

내가 가진 코드 조각객체

func updateLines() { 

    var space = 2 * M_PI * Double(circleRadius); 
    var spaceAvailable = space/(lineWidth) 

    var visibleItems = [Int](); 

    var startIndex = items.count - Int(spaceAvailable); 
    if (startIndex < 0) { 
     startIndex = 0; 
    } 

    for (var i = startIndex; i < self.items.count; i++) { 
     visibleItems.append(self.items[i]); 
    } 

    var circleCenter = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 

    /* Each line should move up and rotate accordin to this value */ 
    var anglePerLine: CGFloat = (360/CGFloat(visibleItems.count)).toRadians() 

    /* Starting position, 270 degrees is on top */ 
    var startAngle: CGFloat = CGFloat(270).toRadians(); 

    /* Lines default rotation, we rotate it to get the right side up */ 
    var lineAngle: CGFloat = CGFloat(180).toRadians(); 

    for (var itemIndex = 0; itemIndex < visibleItems.count; itemIndex++) { 
     var itemLayer = self.itemLayers[itemIndex]; 
     itemLayer.opacity = 1 - ((0.9/visibleItems.count) * itemIndex); 

     /* Calculate start position of layer */ 
     var x = CGFloat(circleRadius) * cos(startAngle) + CGFloat(circleCenter.x); 
     var y = CGFloat(circleRadius) * sin(startAngle) + CGFloat(circleCenter.y); 
     var height = CGFloat((arc4random() % 80) + 10); 

     /* Set position and frame of layer */ 
     itemLayer.frame = CGRectMake(CGFloat(x), CGFloat(y), CGFloat(lineWidth), height); 
     itemLayer.position = CGPointMake(CGFloat(x), CGFloat(y)); 

     var currentRotation = CGFloat((itemLayer.valueForKeyPath("transform.rotation.z") as NSNumber).floatValue); 
     var newRotation = lineAngle - currentRotation; 

     var rotationTransform = CATransform3DRotate(itemLayer.transform, CGFloat(newRotation), 0, 0, 1); 
     itemLayer.transform = rotationTransform; 

     lineAngle += anglePerLine; 
     startAngle += anglePerLine; 
    } 
} 

첫 번째 실행의 결과는 내가 원하는대로 정확히 :

enter image description here

이 코드를 통해 두 번째 실행은 제대로 CALayers를 업데이트하지 않습니다 그것은 시작 이처럼 보이도록 :

enter image description here

을 나는 t을 업데이트하려면 코드와 함께 할 것 같아요 그는 locationtransform CALayer의 속성이지만, 내가하는 일은 항상 마지막 그림이됩니다.

+0

Ahhh !! 좋은 일들이 당신에 의해 완료되었습니다. 어리석은 제안 - 이미지를 사용하여 이미지를 움직여 회전하는 것처럼 보이게 할 수 있습니다. – Kampai

+0

사실 길이가 무작위 인 그래프입니다. 그리고 이미 애니메이션을 적용 할 수 있도록 이미 가지고있는 CALayers를 재사용하고 싶습니다. –

답변

2

트위터로 답변 됨 : 설정 프레임 및 변환은 상호 배타적입니다. 도와 줄 수있어서 기뻐. SO에 대한 로그인 자격 증명을 찾는 것이 어렵습니다. : D

0

트위터에 @iosengineer님께 답변을 주셨습니다. CALayer에서 position을 설정할 때 frame을 업데이트하지 않고 bounds을 업데이트하려고합니다.

Smooth animation FTW

+0

LOL. 내가 쥐고 싶지 않은 뾰족한 것 같아. – iosengineer