Область действия блока CATransaction - PullRequest
0 голосов
/ 10 декабря 2010

Я видел некоторый код, который удаляет данный слой из его суперслоя, выполняя следующее:

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.

Чего мне не хватает?

Заранее спасибо.

1 Ответ

2 голосов
/ 10 декабря 2010

Область действия транзакции CAT должна находиться между строками [CATransaction begin] и [CATransaction commit].

Кроме того, вам не нужно указывать [CATransaction flush] в этом коде. Apple обычно рекомендует не форсировать выполнение ожидающих транзакций по соображениям производительности, и настраиваемая там транзакция не должна влиять на любые ожидающие анимации.

Я предполагаю, что это странное поведение все еще связано с тем, что вы задали в своем предыдущем вопросе , где три анимации как-то мешают друг другу. Как я там прокомментировал, это ведет себя так, как будто к одному слою добавляются три анимации, а не три независимых. Я бы проверил и удостоверился, что такой возможности не было (перекрестные указатели и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...