2009-03-10 12 views
139

Что считается лучшей практикой для анимации переходов на iPhone?iPhone UIView Animation Лучшая практика

Например, ViewTransitions пример проекта из яблока использует подобный код:

CATransition *applicationLoadViewIn = [CATransition animation]; 
[applicationLoadViewIn setDuration:1]; 
[applicationLoadViewIn setType:kCATransitionReveal]; 
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal]; 

но есть также фрагменты кода, плавающие вокруг сети, которые выглядят так:

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.75]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; 
[myview removeFromSuperview]; 
[UIView commitAnimations]; 

Что является лучшим подход? Если бы вы могли предоставить фрагмент, то это было бы высоко оценено.

ПРИМЕЧАНИЕ: Мне не удалось заставить второй подход работать правильно.

ответ

117

Из разделе UIView reference «s о методе beginAnimations:context::

Использование этого метода не приветствуется в iPhone OS 4.0 и выше. Вместо этого вы должны использовать методы анимации на основе блоков.

Например, из блоков на основе анимации на основе Тома комментарий

[UIView transitionWithView:mysuperview 
        duration:0.75 
        options:UIViewAnimationTransitionFlipFromRight 
       animations:^{ 
        [myview removeFromSuperview]; 
       } 
       completion:nil]; 
+1

спасибо за обновление этого rafael. –

+4

Итак, чтобы быть понятным, значит, использовать первый подход (CATransition), а не второй? –

+2

Да, это первый подход (CATransition). – NebulaFox

52

Разница, похоже, зависит от количества элементов управления, которые вам нужны над анимацией.

Подход CATransition дает вам больше контроля и, следовательно, больше вещей для настройки, например. функция синхронизации. Будучи объектом, вы можете сохранить его для последующего использования, реорганизовать, чтобы указать все ваши анимации на это, чтобы уменьшить дублирование кода и т.д.

В UIView методы класса являются удобные методы для общих анимации, но более ограничены, чем CATransition. Например, существует только четыре возможных типа перехода (переверните влево, поверните направо, свернитесь вверх, сверните вниз). Если вы хотите сделать это, вам придется либо выкачать до CATransition's переход на постепенный переход, либо настроить явную анимацию вашей альфа-версии UIView.

Обратите внимание, что CATransition на Mac OS X позволит вам указать произвольный CoreImage фильтр для использования в качестве перехода, но, как она стоит сейчас, вы не можете сделать это на iPhone, который испытывает недостаток CoreImage.

+7

Обратите внимание, что это IOS советы 2,0 эпохи. См. Ответ Рафаэля Веги по блочным методам, если вы используете iOS 4.0 или выше. –

+0

Также обратите внимание, что CoreImage теперь доступен как iOS 5, но только некоторые из его функций. Я считаю, что вы можете использовать переход CoreImage в анимацию, но вы не можете создавать пользовательские фильтры CoreImage в iOS (5). –

69

Я использую последний для многих приятных легких анимаций. Вы можете использовать его, перечеркнув два вида, или вытереть один за другим, или исчезнуть. Вы можете снимать вид над другим, как баннер, вы можете сделать вид растягиваться или сжиматься ... Я получаю много пробега из beginAnimation/commitAnimations.

Не думайте, что все, что вы можете сделать, это:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; 

Вот пример:

[UIView beginAnimations:nil context:NULL]; { 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationDelegate:self]; 
    if (movingViewIn) { 
// after the animation is over, call afterAnimationProceedWithGame 
// to start the game 
     [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)]; 

//  [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation 
//  [UIView setAnimationDelay:0.50]; 
//  [UIView setAnimationRepeatAutoreverses:YES]; 

     gameView.alpha = 1.0; 
     topGameView.alpha = 1.0; 
     viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height); 
     viewrect2.origin.y = -20; 

     topGameView.alpha = 1.0; 
    } 
    else { 
    // call putBackStatusBar after animation to restore the state after this animation 
     [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)]; 
     gameView.alpha = 0.0; 
     topGameView.alpha = 0.0; 
    } 
    [gameView setFrame:viewrect1]; 
    [topGameView setFrame:viewrect2]; 

} [UIView commitAnimations]; 

Как вы можете видеть, вы можете играть с альфа, кадров и даже размеров зрения. Играйте вокруг. Вы можете быть удивлены его возможностями.

8

В UIView документы, имеют прочитанный об этой функции для ios4 +

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion 
26

Мы можем анимировать изображения в ios 5, используя этот простой код.

CGRect imageFrame = imageView.frame; 
imageFrame.origin.y = self.view.bounds.size.height; 

[UIView animateWithDuration:0.5 
    delay:1.0 
    options: UIViewAnimationCurveEaseOut 
    animations:^{ 
     imageView.frame = imageFrame; 
    } 
    completion:^(BOOL finished){ 
     NSLog(@"Done!"); 
    }]; 
+5

это также доступно в iOS 4 и называется анимацией на основе блоков. Он не ограничен iOS 5 и более поздними версиями. – johnbakers

6

В любом случае метод «Блок» используется сегодня. Я объясню простой блок ниже.

Рассмотрите отрезанные внизу. bug2 и ошибка 3 - imageViews. В приведенной ниже анимации описывается анимация с продолжительностью 1 секунда после задержки 1 секунды. Баг3 перемещается из центра в центр bug2. Как только анимация будет завершена, она будет занесена в журнал «Центр анимации Сделано!».

-(void)centerAnimation:(id)sender 
{ 
NSLog(@"Center animation triggered!"); 
CGPoint bug2Center = bug2.center; 

[UIView animateWithDuration:1 
         delay:1.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        bug3.center = bug2Center; 
       } 
       completion:^(BOOL finished){ 
        NSLog(@"Center Animation Done!"); 
       }]; 
} 

Надеюсь, что это чистая !!!

+1

вы назначили CGPoint bug3.center в bug3Center, и сразу после этого вы назначаете CGPoint bug2.center той же переменной bug3Center? Зачем ты это делаешь ? – pnizzle

+0

думаю, что вам нужно проверить свой код :-) – SomaMan

+0

oopss !! это официанты. Обновлено сейчас. – Deepukjayan

4

Я нашел хороший учебник по этой ссылке. Надеюсь, это будет полезно для кого-то.

uiview-animation-tutorial

2

Вот код для плавной анимации, может быть полезным для многих разработчиков.
I found this snippet of code from this tutorial.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[animation setAutoreverses:YES]; 
[animation setFromValue:[NSNumber numberWithFloat:1.3f]]; 
[animation setToValue:[NSNumber numberWithFloat:1.f]]; 
[animation setDuration:2.f]; 
[animation setRemovedOnCompletion:NO]; 

[animation setFillMode:kCAFillModeForwards]; 
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation. 
1

давайте пробуем и фотографии для Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: { 
    myview.removeFromSuperview() 
}, completion: nil)