2016-05-27 16 views
1

Ich habe ein paar interaktive UIViewController-Präsentationsanimationen mit einem UIPanGestureRecognizer implementiert, wie zum Beispiel das Schwenken, um einen View-Controller zu präsentieren.Wie aktiviert man einen UIGestureRecognizer mit Berührungen bereits auf dem Bildschirm?

Ich versuche jetzt, dieses Verhalten durch eine der View-Controller-Animationen fortzusetzen. Wenn ich also langsam nach oben schwenke, was einen View-Controller darstellt, möchte ich, dass der Gestenerkenner, der zu dem neu vorgestellten View-Controller gehört, nahtlos die UITouches aufnimmt, die zu der zuvor dargestellten Ansicht gehörten.

Die Idee ist, dass, wenn Sie auf VC1 starten und dann langsam schwenken, würde es einen View-Controller präsentieren. Wenn Sie weiter schwenken, wird ein anderer View-Controller angezeigt.

Vorzugsweise würde dies von einem UIPanGestureRecognizer getan, der zu jedem ViewController im Stack gehört.

Hat jemand so etwas getan? Ich versuche derzeit, den vorherigen Gestenerkenner abzubrechen, nachdem ein VC angezeigt wird, aber ich sehe nicht, dass der Gestenerkenner des nächsten VCs aktiv wird ...

Vielen Dank im Voraus für jede Einsicht, die jemand liefern könnte!

Antwort

0

Ein Gestenerkenner gehört zu einer Ansicht, nicht zu einem ViewController. Die Ansicht auf oberster Ebene in Ihrer Anwendung ist die UIWindow-Instanz. Sie können den Schwenkgestenerkenner dem Fenster hinzufügen.

Im Storyboard habe ich einen UINavigationController als ersten Viewcontroller eingestellt.

Storyboard

Der einzige Code, den ich geschrieben habe meine Idee zu testen, war dies

#import "AppDelegate.h" 

@interface AppDelegate() { 
    CGFloat pos; 
    int cnt; 

} 

@end 

@implementation AppDelegate 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    [self.window addGestureRecognizer:panRecognizer]; 

    return YES; 
} 

-(void) handlePan:(UIPanGestureRecognizer*)recognizer { 

    switch (recognizer.state) { 
     case UIGestureRecognizerStateBegan: { 
      pos = [recognizer locationInView:self.window].y; 
      break; 
     } 
     case UIGestureRecognizerStateChanged: { 
      CGFloat newPos = [recognizer locationInView:self.window].y; 
      if (pos - newPos > 50) { 
       UIViewController* nextVC = [[UIViewController alloc] init]; 

       nextVC.view.backgroundColor = (cnt++)%2 ? [UIColor redColor] : [UIColor blueColor]; 
       UINavigationController* navCtrl = (UINavigationController*)self.window.rootViewController; 
       [navCtrl pushViewController:nextVC animated:YES]; 
       pos = newPos; 
      } 
      break; 
     } 
     default: 
      break; 
    } 
} 

@end