Я видел некоторый код, который удаляет данный слой из его суперслоя, выполняя следующее:
void RemoveImmediately(CALayer *layer) {
[CATransaction flush];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[layer removeFromSuperlayer];
[CATransaction commit];
}
Я написал метод, который изменяет положение данного слоя анимированным способом, используя CAKeyframeAnimation,который выглядит следующим образом:
- (void)animateMovingObject:(NXUIObject*)obj
fromPosition:(CGPoint)startPosition
toPosition:(CGPoint)endPosition
duration:(NSTimeInterval)duration {
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.duration = duration;
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y);
CGPathAddCurveToPoint(curvedPath, NULL,
startPosition.x, endPosition.y,
startPosition.x, endPosition.y,
endPosition.x, endPosition.y);
pathAnimation.path = curvedPath;
[obj addAnimation:pathAnimation forKey:@"pathAnimation"];
CGPathRelease(curvedPath);
}
На всякий случай, все в порядке.Теперь предположим, что в моем приложении есть «мастер-слой», который имеет 3 подслоя.Я хочу, чтобы первые два подслоя были перемещены в другую позицию, а последний был удален.Поэтому я сделал следующее:
CALayer obj1 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj1];
[self animateMovingObject:obj1
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(100.0, 100.0)
duration:2.0];
CALayer obj2 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj2];
[self animateMovingObject:obj2
fromPosition:CGPointMake(0.0, 0.0)
toPosition:CGPointMake(150.0, 100.0)
duration:2.0];
CALayer obj3 = ... // set up layer and add as sublayer
[self.masterLayer addSublayer:obj3];
// ...
RemoveImmediately(obj3); // This removes the two previous animations too
//[obj3 removeFromSuperlayer]; // This just removes obj3, the previous animations works
Обратите внимание, что если я вызову RemoveImmediately()
, даже передав в качестве аргумента obj3
, я не смогу увидеть первые два слоя анимированными.Однако, если я удаляю obj3
просто вызывая removeFromSuperlayer
, первые два слоя анимируются нормально.Похоже, блок CATransaction отменяет все выполняемые анимации, даже те, которые были созданы с помощью CAKeyframeAnimation.
Чего мне не хватает?
Заранее спасибо.