Лучшая практика анимации пользовательского интерфейса iPhone

StackOverflow https://stackoverflow.com/questions/630265

Вопрос

Что считается наилучшей практикой для анимации переходов между видами на 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];

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

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

Это было полезно?

Решение

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

  

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

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

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

Другие советы

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

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

Разница, кажется, в том, что вам нужно контролировать анимацию.

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

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

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

Мы можем анимировать изображения в 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!");
    }];

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

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

В любом случае, сейчас предпочтителен метод "Block".Я объясню простой блок ниже.

Рассмотрим приведенный ниже фрагмент.ошибка 2 и ошибка 3 - это просмотры изображений.Приведенная ниже анимация описывает анимацию продолжительностью в 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!");
                 }];
}

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

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

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

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

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top