2010-03-14 2 views
2

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

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

код я использую (внутри это метод надтаблицы) следующим образом:

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]; 

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

ответ

4

Есть ли причина, по которой вы используете 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]; 
+1

Действительно хороший вопрос! У меня есть чувство, что есть причина, но если бы я был, я больше не мог бы это вспомнить. Вероятно, это было связано с тем, что я возглавлял всю идею. Я дам тебе дорогу и посмотрю, что произойдет. Благодаря! – Mac

+1

Это сделало трюк! Я пока сохраню это до сих пор, но если я когда-нибудь пойму, почему я делаю это по-другому и решаю переключиться обратно, я, вероятно, вернусь еще раз, чтобы забрать мозги. :-) Благодаря! – Mac

2

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

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

+0

Мой первый прототип использовал неявную анимацию, но когда я впервые увидел проблему, я понял, что, возможно, стоит попробовать явную анимацию в случае, если это поможет. Думаю, теперь, когда я знаю, что это не помогает, я могу это вынести, но я просто подумал, что лучше всего разместить именно то, что у меня есть на данный момент на всякий случай. Спасибо хоть. – Mac

18

Решение Noah - это самый чистый способ сделать то, что вы хотите, но причина, по которой вы не видите анимацию, заключается в том, что неявные анимации отключены для 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]; 

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

+0

Жаль, что я не смог бы удвоить это. Это действительно полезно знать. Благодарю. –

+0

Я согласен с Ноем - спасибо за это! Это объясняет многое, и может быть именно то, что мне нужно дальше по трассе. @Noah - Я дам Брэду преимущество от вашего имени ... – Mac

Смежные вопросы