Mam następujące przejście CATransition dla wywoływanego UIView finalScoreView
, co powoduje, że wchodzi na ekran od góry:
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"];
Jak sprawić, by odbijał się raz po opadnięciu, a potem pozostał nieruchomo? Powinien nadal wchodzić na ekran od góry, ale potem odbijać się, gdy spadnie.
Każda pomoc byłaby mile widziana, dzięki!
Odpowiedzi:
Dzięki iOS7 i UIKit Dynamics nie ma już potrzeby używania
CAKeyframeAnimations
aniUIView
animacji!Spójrz na aplikację Apple UIKit Dynamics Catalog . Alternatywnie, Teehanlax ma jasny, zwięzły samouczek z pełnym projektem w github . Jeśli chcesz uzyskać bardziej szczegółowy samouczek o szczegółach dynamiki, samouczek Ray Winderlich jest świetny. Jak zawsze dokumentacja Apple to świetny pierwszy przystanek, więc zapoznaj się z odniesieniem do klasy UIDynamicAnimator w dokumentacji.
Oto fragment kodu z samouczka 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];
A oto wyniki
UIKit Dynamics to naprawdę potężny i łatwy w użyciu dodatek do iOS7, z którego można uzyskać świetnie wyglądający interfejs użytkownika.
Inne przykłady:
Kroki wdrażania dynamiki UIKit są zawsze takie same:
UIDynamicAnimator
i przechowuj go w silnej nieruchomościUIDynamicBehaviors
. Każde zachowanie powinno mieć jeden lub więcej elementów, zazwyczaj widok do animacji.UIDynamicBehaviors
jest prawidłowym stanemUIDynamicAnimator
.źródło
UIDynamicItemBehavior
(co w rzeczywistości jest właściwościami, a nie zachowaniem). Nie możesz po prostu używać różnych właściwości fizycznych w różnych zachowaniach. Innym przypadkiem jest implementacja gumowych obwiedni podobnych do UIScrollView - jest to bardzo skomplikowane. Mogę napisać jeszcze więcej, ale komentarz jest za krótki.UIDynamicAnimator
i obiekty z nim powiązane, ale nie odpowiada, jak ich używaćProstszą alternatywą dla
UIDynamicAnimator
iOS 7 jest Spring Animation (nowa i potężna animacja bloku UIView), która może dać ładny efekt odbijania z tłumieniem i prędkością: Cel C[UIView animateWithDuration:duration delay:delay usingSpringWithDamping:damping initialSpringVelocity:velocity options:options animations:^{ //Animations } completion:^(BOOL finished) { //Completion Block }];
Szybki
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 == bardzo sprężysty. 1.0 sprawia, że płynnie zwalnia bez przeregulowania.initialSpringVelocity
to z grubsza „pożądana odległość podzielona przez pożądane sekundy”. 1.0 odpowiada całkowitej odległości animacji pokonanej w ciągu jednej sekundy. Na przykład, całkowita odległość animacji wynosi 200 punktów i chcesz, aby początek animacji odpowiadał prędkości oglądania 100 pkt / s, użyj wartości 0,5.Bardziej szczegółowy samouczek i przykładową aplikację można znaleźć w tym samouczku . Mam nadzieję, że komuś się to przyda.
źródło
Oto projekt demonstracyjny, który stworzyłem, aby pomóc Ci uzyskać odpowiednią animację. Cieszyć się!
SpringDampingDemo
źródło
- (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) { }]; } }
źródło