ビュー (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"];
}
ありがとう!