簡體   English   中英

更新CALayer的旋轉

[英]Update the rotation of a CALayer

我正在嘗試更新CALayer的當前輪換(有時是位置)。

我想通過幾個簡單的步驟來嘗試:

  1. 將幾個CALayers存儲在一個數組中,這樣我就可以重用它們
  2. 將所有CALayers的錨點設置為0,0。
  3. 繪制CALayer對象,其中對象從圓上的位置開始
  4. 這些層旋轉的角度與該位置的圓相同
  5. 更新CALayer的位置和旋轉以匹配新值

這是我的一段代碼:

lineWidth是一條線的寬度
self.items是一個包含CALayer對象的數組

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,它開始看起來像這樣:

在此輸入圖像描述

我認為它與我的代碼有關,以更新CALayer的locationtransform屬性,但無論我做什么,它總是導致最后一張圖片。

通過Twitter回答:設置框架和轉換是互斥的。 樂意效勞。 查找我的SO登錄憑據更難。 :d

感謝@iosengineer在Twitter上找到答案。 在CALayer上設置position時,您不希望更新圖層的frame ,但是您想要更新bounds

平滑動畫FTW

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM