2015-03-19 79 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