5

Jestem zaskoczony przez bardzo proste zadanie, chcę UIView animacji do łatwości/łatwości, ale zawsze jest liniowy, mimo że za pomocą poprawnej animationOption.Krzywa animacji UIView nie działa bezczynnie

Oto kod, który według wszystkich kont powinien działać, jest ustawiony w klasie UIViewControllerAnimatedTransitioning, ale mam ten sam problem w poprzedniej niestandardowej klasie klasy;

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) { 

     self.dimView.alpha = 1.0; 
     self.imageView.frame = self.destinationRect; 

    } completion:^(BOOL finished) { 

     [self.imageView removeFromSuperview]; 
     [self.dimView removeFromSuperview]; 

     [transitionContext completeTransition:YES]; 

    }]; 

Jednak animacja wiosenna z następującym kodem działa, chociaż wolałbym tego nie robić.

[UIView animateWithDuration:0.8f delay:0 usingSpringWithDamping:0.7f initialSpringVelocity:2.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) { 

     self.dimView.alpha = 1.0; 
     self.imageView.frame = self.destinationRect; 

    } completion:^(BOOL finished){ 

     [self.imageView removeFromSuperview]; 
     [self.dimView removeFromSuperview]; 

     [transitionContext completeTransition:YES]; 

    }]; 

Otrzymuję to samo zachowanie na symulatorze i urządzeniu testowym iPad2. Czy robię coś nie tak? Czy występują problemy z animacją wartości klatek lub alfa?

Odpowiedz

3

Można spróbować to instead.-

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.4f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop)]; 

self.dimView.alpha = 1.0; 
self.imageView.frame = self.destinationRect; 

[UIView commitAnimations]; 

- (void) animationDidStop { 
    [self.imageView removeFromSuperview]; 
    [self.dimView removeFromSuperview]; 
    [transitionContext completeTransition:YES]; 
} 

Nadzieję, że to pomaga.

+0

Dzięki ssantos. Na początku myślałem, że to wystarczy, ale moje oczy mnie oszukały. Nadal zdecydowanie liniowy. Bardzo dziwne i denerwujące. –

+0

Mmh naprawdę dziwne, czy odległość może być zbyt mała, aby zauważyć różnicę? Chciałbym wypróbować "dużą" animację z różnymi "animationCurves" na wszelki wypadek. – ssantos

1

można wykorzystywać następujące:

[samo przejście: lewy]; // Wywołanie wymagane

enum animationFrom { 
    top, 
    bottom, 
    left, 
    right 
}; 

- (void)transition:(NSUInteger)index { 
    CATransition *tr=[CATransition animation]; 
    tr.duration=0.45; 
    tr.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    tr.type=kCATransitionPush; 
    tr.delegate=self; 
    switch (index) { 
     case top: 
      tr.subtype=kCATransitionFromBottom; 
      break; 
     case bottom: 
      tr.subtype=kCATransitionFromTop; 
      break; 
     case left: 
      tr.subtype=kCATransitionFromRight; 
      break; 
     case right: 
      tr.subtype=kCATransitionFromLeft; 
      break; 
     default: 
      break; 
    } 
    [self.view.layer addAnimation:tr forKey:nil]; 
} 
1

Domyślna opcja krzywa animacji UIViewAnimationOptionCurveEaseInOut, więc nie ma potrzeby, aby określić ten jeden. To jest UIViewAnimationOptionCurveLinear, o której musisz jasno powiedzieć.

Czy na pewno twoja krzywa animacji jest liniowa? Spróbuj animować dwa widoki obok siebie, a czas trwania animacji ustaw na kilka sekund.

Powiązane problemy