2015-03-19 82 views
0

我想为我的主应用程序创建一种屏幕保护程序视频,如果用户在应用程序中某段时间处于非活动状态,我会触发屏幕保护程序视频。MPMoviePlayerController忽略输入

为此,我使用MPMoviePlayerController播放全屏视频(本地磁盘)。这是一个循环(重复)视频,屏幕上没有控件(MPMovieControlStyleNone)。

- (IBAction)playMovie:(id)sender { 
    NSURL *url; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"]; 
    if (moviePath) 
    { 
     url = [NSURL fileURLWithPath:moviePath]; 
    } 

    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:_moviePlayer]; 

    _moviePlayer.controlStyle = MPMovieControlStyleNone; 
    _moviePlayer.repeatMode = MPMovieRepeatModeOne; 
    _moviePlayer.shouldAutoplay = YES; 
    _moviePlayer.scalingMode = MPMovieScalingModeFill; 
    [self.view addSubview:_moviePlayer.view]; 
    [_moviePlayer setFullscreen:NO animated:YES]; 
} 

- (void) moviePlayBackDidFinish:(NSNotification*)notification { 
    MPMoviePlayerController *player = [notification object]; 
    [[NSNotificationCenter defaultCenter] 
    removeObserver:self 
    name:MPMoviePlayerPlaybackDidFinishNotification 
    object:player]; 

    if ([player 
     respondsToSelector:@selector(setFullscreen:animated:)]) 
    { 
     [player.view removeFromSuperview]; 
    } 
} 

这个效果很好。

但我需要解决以下问题

  • 输入取消视频播放(取消输入)
  • 当我加倍视频水龙头,它会放大,这必须停止。

任何建设性的反馈是高度appriciated。

在此先感谢。

回答

0

听起来像是你只需要点击手势识别器添加到MPMoviePlayerController观点,这应该解决您的两个问题:

UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self 
                     action:@selector(handleTap:)]; 

[_moviePlayer.view addGestureRecognizer:tgr]; 

随后的方法来处理水龙头:

- (void)handleTap:(UITapGestureRecognizer *)sender { 

     //Move your moviePlayBackDidFinish: code to a new method 
     //that this method and moviePlayBackDidFinish: will call 
} 
+0

嗨ChrisH,感谢您的回复。我想我可以完成你的建议。但我想添加淡入/淡出屏幕保护程序(我没有提到这个问题,我的坏)。所以我选择了下面的答案(如果这对其他人有帮助,我会发布这些答案)。不过谢谢。 – hdsenevi 2015-03-20 17:03:48

0

答疑我自己的问题可能对别人有帮助。

我在下面发布我最后做的事情。因为我想要淡入/淡出屏幕保护程序的动画,所以我最终没有与[_moviePlayer setFullscreen:NO animated:YES];一起去(我没有在上面的问题中提到过)。

对不起,长脚本。但所有人想要做的就是把一个按钮动作连接到- (IBAction)playMovie:(id)sender

@interface ScreenSaverVC() 
typedef enum 
{ 
    FADE_IN, 
    FADE_OUT, 
}FadeType; 

@end 

@implementation ScreenSaverVC 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self initScreenSaver]; 
} 

#pragma mark - Interface builder 
- (IBAction)playMovie:(id)sender 
{ 
    [self.view addSubview:_moviePlayer.view]; 
    [self startScreenSaver]; 
} 

#pragma marl - MPMoviePlayerController notifications 
- (void) moviePlayBackDidFinish:(NSNotification*)notification 
{ 
    MPMoviePlayerController *player = [notification object]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMoviePlayerPlaybackDidFinishNotification 
                object:player]; 

    if ([player respondsToSelector:@selector(setFullscreen:animated:)]) 
    { 
     [player.view removeFromSuperview]; 
    } 
} 

#pragma mark - Holition plugin methods 
- (void) startScreenSaver 
{ 
    [_moviePlayer play]; 
    [self startFade:FADE_IN withCompletion:^{ 

    }]; 
} 

- (void) stopScreenSaver 
{ 
    [self startFade:FADE_OUT withCompletion:^{ 
     [self moviePlayBackDidFinish:[[NSNotification alloc] 
             initWithName:@"MPMoviePlayerPlaybackDidFinishNotification" 
             object:_moviePlayer userInfo:nil]]; 

    }]; 
} 

- (void) initScreenSaver 
{ 
    NSURL *url; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *moviePath = [bundle pathForResource:@"ScreenSaver" ofType:@"m4v"]; 
    if (moviePath) 
    { 
     url = [NSURL fileURLWithPath:moviePath]; 
    } 

    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:_moviePlayer]; 

    _moviePlayer.controlStyle = MPMovieControlStyleNone; 
    _moviePlayer.repeatMode = MPMovieRepeatModeOne; 
    _moviePlayer.shouldAutoplay = YES; 
    _moviePlayer.scalingMode = MPMovieScalingModeFill; 
    [_moviePlayer.view setFrame:self.view.bounds]; 
} 

#pragma mark - Util methods 
- (void) startFade :(FadeType)type withCompletion:(void (^) (void))compHandler{ 

    float startAlpha = 0.0f, endAlpha = 0.0f; 

    switch (type) { 
     case FADE_IN: 
      startAlpha = 0.0f; 
      endAlpha = 1.0f; 
      break; 
     default: 
      // FADE_OUT 
      startAlpha = 1.0f; 
      endAlpha = 0.0f; 
      break; 
    } 

    [_moviePlayer.view setAlpha:startAlpha]; 

    //FadeIn or FadeOut 
    [UIView animateWithDuration:1.0f animations:^{ 

     [_moviePlayer.view setAlpha:endAlpha]; 

    } completion:^(BOOL finished) { 
     if (compHandler) { 
      compHandler(); 
     } 
    }]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSInteger count = [[event allTouches] count]; 
    if(count > 0) 
     [self stopScreenSaver]; 
} 
@end