0

ビュー (UIView) のレイヤーのサブレイヤーである CAShapeLayers がいくつかあります。問題なくパスをアニメーション化できます。ただし、後でシェイプ レイヤーをいくつか追加し、すべてのシェイプ レイヤーのすべてのパスをアニメーション化する必要があります。新しいサブレイヤーを挿入しようとすると、アニメーションが発生しなくなりました。ビューは、すべてのシェイプ レイヤーが最終状態でレンダリングされます。

これが私が扱っているコードのブロックです。コメントアウトすると、既存のレイヤーのパスがうまくアニメーション化されます。誰かが私に何が起こっているのか教えてもらえますか?

for (int i = oldPoints.count; i < newPoints.count; i++)
    [self.layer insertSublayer: [CAShapeLayer layer] atIndex: ++layerIndex];

また、 -addSublayer: を呼び出してみましたが、同じ結果が得られました。

スーパービューのアニメーション コードは次のようになります。

[UIView animationWithDuration: 0.2
                   animations: ^{

                       for (ComponentView *view in _componentViews)
                           [view reloadDataWithAnimation: YES];

                       [self layoutComponentViews];
                   }
                   completion: ^(BOOL finished) {

                   }];

ComponentView の -reloadDataWithAnimation: 内に、次のコードがあります。

- (void) reloadDataWithAnimation: (BOOL) animate {

    for (int rowIndex = 0; rowIndex < oldData.count; rowIndex++) {

        NSArray     *oldPoints  = [oldData objectAtIndex: rowIndex];
        NSArray     *newPoints  = nil;

        if (rowIndex < newData.count)
            newPoints = [newData objectAtIndex: rowIndex];


        if (newPoints.count > oldPoints.count) {

            layerIndex += oldPoints.count;

            for (int i = oldPoints.count; i < newPoints.count; i++)
                [self.layer insertSublayer: [CAShapeLayer layer] atIndex: ++layerIndex];

        }
        else if (newPoints.count < oldPoints.count) {

            layerIndex += newPoints.count;

            for (int i = newPoints.count; i < oldPoints.count; i++)
                [disposableLayers addObject: [self.layer.sublayers objectAtIndex: ++layerIndex]];

        }
        else {

            if (newPoints.count > 0)
                layerIndex += newPoints.count;

        }
    }

    if (newData.count > oldData.count) {

        for (int rowIndex = oldData.count; rowIndex < newData.count; rowIndex++) {

            NSArray *newPoints = [newData objectAtIndex: rowIndex];

            for (int i = 1; i < newPoints.count; i++)
                [self.layer insertSublayer: [CAShapeLayer layer] atIndex: ++layerIndex];

        }
    }

    /*  code that iterates through old and new data structures  */

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"path"];
        [animation setFromValue: (__bridge id) oldPath];
        [animation setToValue: (__bridge id) newPath];
        [animation setFillMode: kCAFillModeForwards];
        [animation setDuration: _defaultAnimationDuration];

        CAShapeLayer *shapeLayer = (CAShapeLayer *) [self.layer.sublayers objectAtIndex: layerIndex];
        [shapeLayer setPath: newPath];
        [shapeLayer setStrokeColor: [self strokeColorForItemAtIndexPath: indexPath].CGColor];
        [shapeLayer setLineWidth: self.lineWidth];
        [shapeLayer addAnimation: animation forKey: @"path"];

}

ありがとう!

4

0 に答える 0