Як створити анімацію відмов UIView?


92

У мене є така CATransition для UIView під назвою finalScoreView, завдяки чому він виходить на екран зверху:

CATransition *animation = [CATransition animation];
animation.duration = 0.2;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

[gameOver.layer addAnimation:animation forKey:@"changeTextTransition"];
[finalScoreView.layer addAnimation:animation forKey:@"changeTextTransition"];

Як зробити так, щоб він відскакував один раз після того, як зійде, а потім залишається нерухомим? Він все одно повинен виходити на екран зверху, але потім підстрибувати, коли він опускається вниз.

Будь-яка допомога буде дуже вдячна, дякую!


3
Ви орієнтуєтесь на iOS7 і вище? Якщо так, ви можете скористатися UIKit Dynamics
WDUK

Відповіді:


144

З iOS7 та UIKit Dynamics більше не потрібно використовувати CAKeyframeAnimationsабо UIViewанімацію!

Погляньте на додаток UIKit Dynamics Catalog від Apple . Крім того, Teehanlax має чіткий, стислий підручник з повним проектом в github . Якщо ви хочете більш детальний підручник з приводу динаміки вкладень і виходів, підручник Рей Віндерліх чудово підійде . Як завжди, документи Apple - це чудова перша зупинка, тому перегляньте посилання на UIDynamicAnimator Class у документах.

Ось трохи коду з підручника Teenhanlax:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior* gravityBehavior = 
                [[UIGravityBehavior alloc] initWithItems:@[self.redSquare]];
[self.animator addBehavior:gravityBehavior];

UICollisionBehavior* collisionBehavior = 
                [[UICollisionBehavior alloc] initWithItems:@[self.redSquare]]; 
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *elasticityBehavior = 
                [[UIDynamicItemBehavior alloc] initWithItems:@[self.redSquare]];
elasticityBehavior.elasticity = 0.7f;
[self.animator addBehavior:elasticityBehavior];

І ось результати

Квадратний відмов

UIKit Dynamics - це дійсно потужне та просте у використанні додаток до iOS7, і ви можете отримати від нього чудовий інтерфейс користувача.

Інші приклади:

Кнопка відскакує Слайд відмов Весняна колекція Колекція спринтів WWDC

Етапи впровадження динаміки UIKit завжди однакові:

  1. Створіть UIDynamicAnimatorі зберігайте його у сильній власності
  2. Створіть одну або декілька UIDynamicBehaviors. Кожна поведінка повинна мати один або кілька предметів, як правило, для анімації.
  3. Переконайтесь, що початковий стан елементів, що використовуються в, UIDynamicBehaviorsє дійсним станом в рамках UIDynamicAnimatorмоделювання.

1
Привіт Майкл, дуже дякую за допомогу! Це однозначно виглядає надзвичайно просто! Я спробував це, і він спрацьовує, коли він потрапляє в нижню частину подання, але це не працює з іншим видом - stackoverflow.com/questions/21895674/… - я б хотів, щоб ви могли мені допомогти там! :) Дякую
користувач3127576

2
НАВЧАЛЬНИЙ підручник, Але ви просто використовуєте один рядок коду, використовуючиSpringWithDamping, для відмов!
Fattie

2
Чи можете ви поділитися зразком коду для анімації відмов Uitableview, як зазначено вище. Я намагаюся з UITableview, але не впевнений, з чого почати.
Дінеш

1
UIKit Dynamics чудово підходить для розгляду прикладних випадків. Але коли мова йде про реальні завдання, ви бачите, наскільки це сире та обмежене. Однією з великих проблем є переосмислення UIDynamicItemBehavior(це власне властивості, а не поведінка). Ви не можете просто використовувати різні фізичні властивості в різній поведінці. Інший випадок - реалізація гумових меж, подібних до UIScrollView - це дуже складно. Я можу написати ще більше, але коментар занадто короткий.
келін

2
додайте повний код, будь ласка. Ваш код описує, як створити UIDynamicAnimatorта пов’язані з ним об’єкти, але не відповідає, як ними користуватися
В’ячаслав Герчичов,

261

Більш простою альтернативою UIDynamicAnimatorв iOS 7 є Spring Animation (нова і потужна блокова анімація UIView), яка може забезпечити приємний підстрибуючий ефект із затуханням та швидкістю: Завдання C

[UIView animateWithDuration:duration
  delay:delay
  usingSpringWithDamping:damping
  initialSpringVelocity:velocity
  options:options animations:^{
    //Animations
    }
  completion:^(BOOL finished) {
    //Completion Block
}];

Швидкий

UIView.animateWithDuration(duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

Swift 4.0

UIView.animate(withDuration:duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

usingSpringWithDamping 0,0 == дуже прискіпливий. 1,0 робить це плавно уповільненим без зайвого усунення.

initialSpringVelocity, приблизно, "бажана відстань, поділене на бажані секунди". 1,0 відповідає загальній відстані анімації, пройденій за одну секунду. Наприклад, загальна відстань анімації становить 200 балів, і ви хочете, щоб початок анімації відповідав швидкості перегляду 100 пт / с, використовуйте значення 0,5.

Більш детальний підручник та зразок програми можна знайти в цьому підручнику . Сподіваюся, це комусь корисно.


2
Ось демонстраційний проект, який я створив, щоб допомогти вам отримати анімацію як раз. Насолоджуйтесь! github.com/jstnheo/SpringDampingDemo
jstn

Привіт за цей демо-проект, друже. Дійсно допомагає з'ясувати ці значення, оскільки вони досить тупі. Я б хотів, щоб Apple зробила їх зрозумілішими
kakubei

32

Ось демонстраційний проект, який я створив, щоб допомогти вам отримати анімацію як раз. Насолоджуйтесь!

SpringDampingDemo

введіть тут опис зображення


Привіт за цей демо-проект, друже. Дійсно допомагає з'ясувати ці значення, оскільки вони досить тупі. Я б хотів, щоб Apple зробила їх зрозумілішими
kakubei

-1
- (IBAction)searchViewAction:(UIButton*)sender
{
  if(sender.tag == 0)
  {
    sender.tag = 1;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = -320;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;
    self.searhTopView.frame = optionsFrame;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 0;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];        
}
else
{
    sender.tag = 0;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = 0;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 320;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];
}
}

1
У коді немає пояснень та коментарів. Це не корисно
Лоренцо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.