2013-09-23 8 views
40

Jestem zainteresowany zwięzły przykład jak stworzyć NSObject podklasę, która implementuje protokół UIViewControllerInteractiveTransitioning zarządzania niestandardową interaktywne przejście między dwoma UIViewController s. Idealnie w odpowiedzi na gest machnięcia. Coś podobnego do domyślnego przeciągnięcia interaktywnego iOS7, które teraz jest dostarczane z UINavigationController, ale jest to przykład implementacji niestandardowej/ręcznej.Prawidłowe sposobem wdrożenia niestandardowe UIViewController interaktywną przejście używając UIViewControllerInteractiveTransitioning Delegat Protokół

Czytałem docs:

i spojrzał na kilka przykładów gdzie indziej:

  • one
  • two
  • three
  • four (ja to skonfigurować, ale jest to więcej o UIViewControllercontainment i ręczne wykonanie tych przejść zamiast UIViewControllerInteractiveTransitioning

Docs są dość oczywiste, ale nie referencyjny przykładowy kod. I przykłady pozostawiają trochę do życzenia (pytania bez odpowiedzi o tym, jak różne elementy są ze sobą powiązane).

Więc moje pytania to:

  1. Czy ktoś może pomóc wypełnić luki o tym, jak związać gest (np machnięcia) do obiektu, który implementuje protokół UIViewControllerInteractiveTransitioning?
  2. Jaki jest związek między obiektem implementującym protokół UIViewControllerInteractiveTransitioning a implementującym protokół UIViewControllerAnimatedTransitioning? Wygląda na to trzeba mieć zarówno wywołać interaktywne przejścia ...

Z góry dzięki ...

+0

Twój przykładowy kod jest zamknięty/nie można go znaleźć. –

+0

Dziękuję za uwagę, przykro mi z tego powodu, po prostu zdjąłem to kilka dni temu –

+0

Repo powraca, albo nigdy nie było, nie pamiętam co się stało, może zmieniłem nazwę repozy lub coś takiego. W każdym razie jest tam teraz. –

Odpowiedz

12

1) najprostszy sposób, aby związać gest do obiektu UIViewControllerInteractiveTransitioning, czyni go podklasę UIPercentDrivenInteractiveTransition. Więc gdzie można zaimplementować obsługi gestów, zadzwonić updateInteractiveTransition: tutaj przykład z kodem:

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch { 

    CGFloat scale = pinch.scale; 
    switch (pinch.state) { 
     case UIGestureRecognizerStateBegan: { 
      _startScale = scale; 
      self.interactive = YES; 
      [self.navigationController popViewControllerAnimated:YES]; 
      break; 
     } 
     case UIGestureRecognizerStateChanged: { 
      CGFloat percent = (1.0 - scale/_startScale); 
      [self updateInteractiveTransition:(percent < 0.0) ? 0.0 : percent]; 
      break; 
     } 
     case UIGestureRecognizerStateEnded: { 
      CGFloat percent = (1.0 - scale/_startScale); 
      BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3); 
      if (cancelled) [self cancelInteractiveTransition]; 
      else [self finishInteractiveTransition]; 
      break; 
     } 
     case UIGestureRecognizerStateCancelled: { 
      CGFloat percent = (1.0 - scale/_startScale); 
      BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3); 
      if (cancelled) [self cancelInteractiveTransition]; 
      else [self finishInteractiveTransition]; 
      break; 
     } 
    } 
} 

Ten kod jest od https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

2) Funkcją animateTransition z UIViewControllerAnimatedTransitioning służy do wykonywania interaktywnego przejścia. Jest on automatycznie dzielony na partycje w "klatkach kluczowych", dzięki wcześniejszemu połączeniu z numerem updateInteractiveTransition.Ale przypuszczam, że jeśli zaimplementujesz swoją metodę startInteractiveTransition: z UIViewControllerInteractiveTransitioning (więc bez korzystania z podklasy UIPercentDrivenInteractiveTransition), to jesteś odpowiedzialny za zarządzanie w pełni przejściem (nie jestem pewien o tym .. przepraszam, ale dokumentacja w mojej opinii nie jest naprawdę jasna).

+1

Jeśli zaimplementujesz metodę startInteractiveTransition: metoda animateTransition nigdy nie zostanie wywołana (debugowanie jej przez wiele godzin, dzięki za pomysł) –

Powiązane problemy