0

Ich habe Schwierigkeiten, einen Swipe Gesture Recognizer zu erhalten, der an meiner App funktioniert. Hier ist die Hierarchie von allem.UISwipeGestureRecognizer führt keine Methode aus

App-Stammansicht ist eine UINavigationController, die Klasse ViewController als für die erste Ansicht sichtbar hat. Ich habe eine UIButton, die einen Film abfeuert, der wiederholt, bis ich es zweimal tippe, die der Navigationssteuerpult einen neuen ViewController, den ich gemacht habe, genannt PUPPETS1 auf den Schirm schiebe. Dieser VC hat seine eigene XIB. Die Xib hat eine UIImageView. Was ich möchte, ist, einen Film zu starten, sobald ich auf dem Bildschirm wische, aber das passiert nie, und die Konsole zeigt nie mein NSLog von der Methode der zweiten VC.

- (void)loopVideo { 

    NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"warpspeed" withExtension:@"mov"]; 
    UIView *patternView = [[UIView alloc] initWithFrame:self.view.bounds]; 
    patternView.backgroundColor = [UIColor blackColor]; 
    [self.moviePlayer2.backgroundView addSubview:patternView]; 
    self.moviePlayer2 = [[MPMoviePlayerController alloc] initWithContentURL:videoURL]; 
    [self.moviePlayer2 setControlStyle:MPMovieControlStyleDefault]; 

    self.moviePlayer2.controlStyle = MPMovieControlStyleNone; 
    self.moviePlayer2.scalingMode = MPMovieScalingModeAspectFill; 
    self.moviePlayer2.movieSourceType = MPMovieSourceTypeFile; 
    [self.moviePlayer2 setAllowsAirPlay:YES]; 
    self.moviePlayer2.view.frame = self.view.frame; 


    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(puppetOne)]; 
    tapGesture.numberOfTapsRequired = 2; 
    tapGesture.numberOfTouchesRequired = 1; 

    UIView *aView = [[UIView alloc] initWithFrame:self.moviePlayer2.backgroundView.bounds]; 
    [aView addGestureRecognizer:tapGesture]; 

    [self.view.window addSubview:aView]; 
    [self.view addSubview:self.moviePlayer2.view]; 
    self.moviePlayer2.repeatMode = MPMovieRepeatModeOne; 
    [self.moviePlayer2 play]; 

} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 

    return YES; 

} 

Im 2. VC, die PUPPETS1 ein:

- (void)viewDidLoad { 
    [super viewWillAppear:YES]; 
    UISwipeGestureRecognizer * swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(playPuppets)]; 

    swipeRec.direction = UISwipeGestureRecognizerDirectionUp; 


    UIView *aView2 = [[UIView alloc] initWithFrame:self.view.bounds]; 
    [aView2 addGestureRecognizer:swipeRec]; 
    [self.view addSubview:aView2]; 
    // Do any additional setup after loading the view from its nib. 
} 




-(void)playPuppets { 
    NSLog(@"PLAYING"); 
    NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"SundayPuppets" withExtension:@"m4v"]; 

    //filePath may be from the Bundle or from the Saved file Directory, it is just the path for the video 
    AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 
    AVPlayerViewController *playerViewController = [AVPlayerViewController new]; 
    playerViewController.player = player; 
    //[playerViewController.player play];//Used to Play On start 
    [self presentViewController:playerViewController animated:YES completion:nil]; 
} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 

    return YES; 

} 
+0

Warum haben Sie Super viewWillAppear: ja in viewDidLoad? Sind Sie sicher, dass die ViewDidLoad-Methode für Ihre zweite VC aufgerufen wird? [super viewWillAppear: JA]; shud sein [super viewDidLoad]; –

+0

@TejaNandamuri Das war ein Tippfehler von früher, als ich viewWillAppear versuchte. Ich habe gerade ein NSLog in die ViewDidLoad hinzugefügt und es wird in der Konsole angezeigt. – user717452

+0

versuchen, Gestenerkenner zu self.view anstelle von aView2 hinzuzufügen. Ich denke, aView ist nicht richtig eingerahmt in viewDidLoad –

Antwort

0

Der Rahmen der Ansicht, auf die Sie die gr sind Befestigung davon abhängt ist Grenzen des übergeordneten Ansicht, und die sind noch nicht initialisiert in viewDidLoad. Bewegen Sie den Setup nach Layout abgeschlossen ist (und zwicken sie nur einmal, auf der ersten Layoutänderung ausführen), dh

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 

    UIView *swipeView = [self.view viewWithTag:999]; 
    // only do this if we haven't done it already 
    if (!swipeView) { 
     // now that self.view.bounds is initialized... 
     swipeView = [[UIView alloc] initWithFrame:self.view.bounds]; 
     swipeView.tag = 999; 

     // the rest of your OP setup code is fine, and goes here 
     UISwipeGestureRecognizer * swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(playPuppets)]; 
     swipeRec.direction = UISwipeGestureRecognizerDirectionUp; 
     [swipeView addGestureRecognizer:swipeRec]; 

     [self.view addSubview:swipeView]; 
     NSLog(@"%@", swipeView); 
    } 
} 

EDIT Den Code über die Geste angebracht Ansicht erkennt richtig, ein Update bietet in der zweite View-Controller. Es stellt sich heraus, dass das andere Problem der vorherige View-Controller war nicht ordnungsgemäß entfernen die (nicht mehr weiter) MPMoviePlayer, was zu Berührungen nicht funktioniert auf der Push-VC. Das gesamte überarbeitete ViewController.m kann im Chat unter unten stehenden Link gefunden werden, aber die Lösung für das Problem berührt war hier ...

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    [self.moviePlayer stop]; 
    [self.moviePlayer.view removeFromSuperview]; 
    self.moviePlayer = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
+0

Ok, ich habe das versucht, mit einem kleinen Edit (aView2 wurde noch nicht in Ihrer Antwort deklariert, also habe ich es hinzugefügt), und NSLogs hinzugefügt. Die NSLogs feuern jeweils 3 mal, aber sie erkennen den Wischvorgang immer noch nicht. – user717452

+0

:-) Ich habe die Bearbeitung abgelehnt, weil 'aView2' nicht notwendig ist. Mein Code 'swipeView' dient dem gleichen Zweck, nur besser benannt (ich dachte). Versuchen Sie meine Lösung genau wie vorgeschlagen und entfernen Sie den analogen Code aus viewDidLoad. – danh

+0

Also die letzte Zeile ändert sich einfach von addSubview: aView2 zu swipeView? – user717452