CALayer의 현재 회전 (때로는 위치)을 업데이트하려고합니다.CALayer의 회전 업데이트
나는 간단한 단계의 몇에 노력하고 무엇 :
- 스토어 배열
CALayers
의 몇 가지, 그래서 나는 - 0,0 모든 CALayers의 앵커 포인트를 설정을 다시 사용할 수 있습니다 . 객체가 층을 그 위치
- 업데이트 새로운 값 맞게의 CALayer의 위치와 회전의 원으로 동일한 각도만큼 회전
- 원의 위치에서 시작하는 위치
- 은
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;
}
}
첫 번째 실행의 결과는 내가 원하는대로 정확히 :
이 코드를 통해 두 번째 실행은 제대로 CALayers를 업데이트하지 않습니다 그것은 시작 이처럼 보이도록 :
을 나는 t을 업데이트하려면 코드와 함께 할 것 같아요 그는 location
과 transform
CALayer의 속성이지만, 내가하는 일은 항상 마지막 그림이됩니다.
Ahhh !! 좋은 일들이 당신에 의해 완료되었습니다. 어리석은 제안 - 이미지를 사용하여 이미지를 움직여 회전하는 것처럼 보이게 할 수 있습니다. – Kampai
사실 길이가 무작위 인 그래프입니다. 그리고 이미 애니메이션을 적용 할 수 있도록 이미 가지고있는 CALayers를 재사용하고 싶습니다. –