Основная проблема с анимацией на iPhone - PullRequest
2 голосов
/ 15 марта 2010

Я новичок в разработке для iPhone и немного экспериментирую с Core Animation. Я столкнулся с небольшой проблемой, касающейся продолжительности анимации, которую я пытаюсь выполнить.

По сути, у меня есть представление с двумя подпредставлениями, и я пытаюсь анимировать их непрозрачность, чтобы одно исчезло, а другое исчезло. Проблема заключается в том, что вместо постепенного постепенного появления / исчезновения подпредставления просто мгновенно переключаются на / с полной / нулевой непрозрачности. Я попытался настроить продолжительность анимации с помощью CATransaction без заметного эффекта. Это также не относится к непрозрачности анимации - анимация положения показывает ту же проблему.

Код, который я использую (внутри метода superview), выглядит следующим образом:

CALayer* oldLayer = ((UIView*) [[self subviews] objectAtIndex:0]).layer;
CALayer* newLayer = ((UIView*) [[self subviews] objectAtIndex:1]).layer;

[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
oldLayer.opacity = 0.0;
newLayer.opacity = 1.0;
[CATransaction commit];

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 3 ]

18 голосов
/ 15 марта 2010

Решение Ноя - самый чистый способ сделать то, что вы хотите, но причина, по которой вы не видите анимацию, заключается в том, что неявные анимации отключены для CALayers, которые поддерживают UIViews.Поскольку ничто не анимирует, CATransaction не может установить продолжительность для чего-либо.

Если вы действительно хотите выполнить эту анимацию на слое, вам нужно настроить CABasicAnimation вручную, чтобы сделать это:

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.removedOnCompletion = NO;
opacityAnimation.fillMode = kCAFillModeForwards;

[oldLayer addAnimation:opacityAnimation forKey:@"opacity"];
[newLayer addAnimation:opacityAnimation forKey:@"opacity"];

[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
oldLayer.opacity = 0.0;
newLayer.opacity = 1.0;
[CATransaction commit];

(Обратите внимание, что я не уверен, что вы можете повторно использовать анимацию непрозрачности здесь. Возможно, вам придется создавать отдельные экземпляры для каждого слоя.)

4 голосов
/ 15 марта 2010

Есть ли причина, по которой вы используете Core Animation вместо обычной UIView оболочки анимации? Довольно просто сделать что-то подобное с

UIView *oldView = [[self subviews] objectAtIndex:0];
UIView *newView = [[self subviews] objectAtIndex:1];

[UIView beginAnimations:@"swapViews" context:nil];
[UIView setAnimationDuration:1];
    oldView.alpha = 0;
    newView.alpha = 1;
[UIView commitAnimations];
2 голосов
/ 15 марта 2010

Вам нужно использовать явную CATransaction здесь?

Документы здесь означают, что вы этого не делаете.

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