UISwipeGestureRecognizer不执行方法

时间:2016-07-14 15:44:36

标签: ios objective-c uiviewcontroller uitapgesturerecognizer uiswipegesturerecognizer

我很难获得Swipe Gesture Recognizer来处理我的应用。这是所有的层次结构。

应用程序的根视图是UINavigationController,其中ViewController类对于第一个可见的视图是可见的。我有一个UIButton,它会触发一个循环播放的电影,直到我点击它两次,导航控制器将我制作的一个名为PUPPETS1的新ViewController推送到屏幕上。这个VC有自己的xib。 xib有一个UIImageView。我想要发生的是当我在屏幕上向上滑动时开始播放电影,但这种情况从未发生过,控制台永远不会从第二个VC的方法中显示我的NSLog。

- (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;

}

在第二个VC中,PUPPETS1一个:

- (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;

}

1 个答案:

答案 0 :(得分:0)

您要附加gr的视图框架取决于其父视图的边界,而这些框架尚未在viewDidLoad中初始化。 在布局完成后将设置移动到(并在第一次布局更改时将其调整为仅运行一次),即

- (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);
    }
}

编辑上面的代码正确附加了手势识别视图,在第二个视图控制器中提供了修复。事实证明,另一个问题是之前的视图控制器未正确删除(已弃用)MPMoviePlayer,导致触摸功能无法在推送的vc上运行。整个重新设计的ViewController.m可以在下面链接的聊天中找到,但触摸问题的解决方法就在这里......

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

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