2014-02-19 3 views
75

У меня есть следующие CATransition для UIView называется finalScoreView, что делает его войти в экран сверху:Как создать анимацию подбора UIView?

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

ответ

132

С iOS7 и UIKit Dynamics больше не нужно использовать CAKeyframeAnimations или UIView анимаций!

Посмотрите на Apple's UIKit Dynamics Catalog app. Альтернативно, Teehanlax has a clear, concise tutorial с full project in github. Если вы хотите получить более подробное руководство по динамике, то Ray Winderlich tutorial отлично подходит. Как всегда, документы Apple являются отличной первой остановкой, поэтому ознакомьтесь с UIDynamicAnimator Class reference в документах.

Вот немного кода из 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]; 

А вот результаты

Square bounce

UIKit Динамика действительно мощный и простой в использовании дополнение к iOS7 и вы можете получить от него отличный внешний интерфейс.

Другие примеры:

Button bounce Slide bounce Springy collection WWDC sprint collection

шаги по реализации динамики UIKit всегда одинакова:

  1. Создать UIDynamicAnimator и хранить его в сильной собственности
  2. Cre съели один или несколько UIDynamicBehaviors. Каждое поведение должно иметь один или несколько элементов, как правило, для анимации.
  3. Убедитесь, что начальное состояние элементов, используемых в UIDynamicBehaviors, является допустимым состоянием в моделировании UIDynamicAnimator.
+1

Привет, Майкл, большое спасибо за вашу помощь! Это определенно выглядит очень легко! Я попробовал, и он работает, когда он попадает в нижнюю часть представления, но он не работает с другим видом - http://stackoverflow.com/questions/21895674/uidynamicanimator-wont-work-with-uiview-but-will -Свидетельство - я бы с удовольствием, если бы вы могли помочь мне там! :) Спасибо – user3127576

+0

Замечательно! Спасибо друг! – Resty

+2

Учебник MAGNIFICENT, но вы просто используете одну строку кода, используяSpringWithDamping, для отскока! – Fattie

216

Более простой альтернативой UIDynamicAnimator в прошивкой 7 является Spring Animation (новый и мощный UIView блок анимации), который может дать вам хороший прыгающий эффект с затуханием и скорость: Objective C

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

Swift

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 
     }) 

usingSpringWithDamping 0,0 == очень Надувной. 1.0 обеспечивает плавное замедление без перерегулирования.

initialSpringVelocity, примерно, "желаемое расстояние, деленное на желаемые секунды". 1.0 соответствует общему расстоянию анимации, пройденному за одну секунду. Например, общее расстояние анимации составляет 200 точек, и вы хотите, чтобы начало анимации соответствовало скорости просмотра 100 пт/с, используйте значение 0,5.

Более подробное руководство и пример приложения можно найти в этом tutorial. Надеюсь, это полезно для кого-то.

+2

Вот демонстрационный проект, который я создал, чтобы помочь вам получить анимацию в самый раз. Наслаждайтесь! https://github.com/jstnheo/SpringDampingDemo – jstn

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) { 
    }]; 
} 
} 
+2

Пожалуйста, добавьте информацию, разъясняющую код – Sirens

+0

В коде нет пояснений и комментариев. Это не полезно – Lorenzo

23

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

SpringDampingDemo

enter image description here

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