Лучшая практика анимации iPhone UIView - PullRequest
142 голосов
/ 10 марта 2009

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

Например, пример проекта ViewTransitions от apple использует код вроде:

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

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

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

Ответы [ 9 ]

118 голосов
/ 09 августа 2010

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

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

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

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
69 голосов
/ 04 мая 2009

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

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

52 голосов
/ 10 марта 2009

Разница, по-видимому, заключается в количестве контроля над анимацией.

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

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

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

26 голосов
/ 20 января 2012

Мы можем анимировать изображения в 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!");
    }];
8 голосов
/ 11 октября 2011

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

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
6 голосов
/ 08 марта 2012

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

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

-(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!");
                 }];
}

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

4 голосов
/ 05 октября 2012

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

UIView-анимация-учебник

2 голосов
/ 15 марта 2017

давайте попробуем оформить заказ на Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
2 голосов
/ 03 июля 2013

Вот код для плавной анимации, может быть полезным для многих разработчиков.
Я нашел этот фрагмент кода из этого урока.

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.
...