Как создать анимацию UIView bounce?
у меня есть следующий 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"];
Как сделать так, чтобы он отскакивал один раз после того, как он падает, а затем остается неподвижным? Он все равно должен войти в экран сверху, но затем отскакивать, когда он опускается.
любая помощь была бы очень признательна, спасибо!
4 ответов:
С динамикой iOS7 и UIKit больше нет необходимости использовать
CAKeyframeAnimationsилиUIViewанимация!посмотри приложение UIKit Dynamics Catalog от Apple. Поочередно,Teehanlax имеет четкий, краткий учебник С полный проект в github. Если вам нужен более подробный учебник о входах и выходах динамики, то Ray Winderlich tutorial это здорово. Как всегда, Apple docs-отличная первая остановка, поэтому проверьте ссылка на класс UIDynamicAnimator в документации.
вот немного кода из учебника 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, и вы можете получить от него отличный пользовательский интерфейс.
другие примеры:
шаги для осуществления программирования с использованием UIKit динамика всегда одна и та же:
- создать
UIDynamicAnimatorи хранить его в сильном собственность- создать один или несколько
UIDynamicBehaviors. Каждое поведение должно иметь один или несколько элементов, как правило для анимации.- убедитесь, что начальное состояние элементов, используемых в
UIDynamicBehaviorsявляется допустимым состоянием в пределахUIDynamicAnimatorмоделирование.
более простая альтернатива
UIDynamicAnimatorв iOS 7 есть Весенняя анимация (новая и мощная анимация блока UIView), которая может дать вам хороший эффект отскока с демпфированием и скоростью: С[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 })
usingSpringWithDamping0.0 == очень оживленный. 1.0 делает его плавно замедляться без промаха.
initialSpringVelocityэто, грубо говоря, " желаемое расстояние, деленное на нужные секунды". 1.0 соответствует общему расстоянию анимации, пройденному за одну секунду. Например, общее расстояние анимации составляет 200 точек, и вы хотите, чтобы начало анимации соответствовало скорости просмотра 100 пт/с, используйте значение 0,5.более подробный урок и пример приложения можно найти в этой учебник. Я надеюсь, что это полезно для кого-то.
- (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) { }]; } }






Comments