2010-10-18 8 views
20

आईओएस 3.2 या बाद में मान लें। शुरू में छिपे हुए नियंत्रणों के साथ एक कदम चलाने के लिए आदेश का उचित अनुक्रम क्या है। जब फिल्म चल रही है, तो उपयोगकर्ता के पास स्क्रीन पर टैग करने और नियंत्रण दिखाने का विकल्प होता है।MPMoviePlayerController मूवी से पहले नियंत्रण कैसे छिपाना है?

धन्यवाद!

मेरे (नियंत्रण छिपी नहीं) कोड:

- (void)playMovie 
{ 
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Test" ofType:@"m4v"]]; 
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieDone:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieState:) 
               name:MPMoviePlayerNowPlayingMovieDidChangeNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieReady:) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 


    if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) { 
     moviePlayer.controlStyle = MPMovieControlStyleDefault; // MPMovieControlStyleNone MPMovieControlStyleEmbedded MPMovieControlStyleFullscreen MPMovieControlStyleDefault 
     moviePlayer.scalingMode = MPMovieScalingModeAspectFill; // MPMovieScalingModeAspectFit MPMovieScalingModeAspectFill 
    } 
} 

- (void) movieReady:(NSNotification*)notification 
{ 
    MPMoviePlayerController *moviePlayer = [notification object]; 

    if ([moviePlayer loadState] != MPMovieLoadStateUnknown) { 
     // Remove observer 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
                 name:MPMoviePlayerLoadStateDidChangeNotification 
                 object:nil]; 

     // When tapping movie, status bar will appear, it shows up 
     // in portrait mode by default. Set orientation to landscape 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 

     // Add movie player as subview 
     [[self view] addSubview:[moviePlayer view]]; 

     // Play the movie 
     [moviePlayer play]; 
     [moviePlayer setFullscreen:YES animated:YES];  
    } 
} 

उत्तर

35

[अपडेट] @ReinYem, द्वारा प्रस्तावित के रूप में एक बेहतर समाधान एक MPMoviePlayerLoadStateDidChangeNotification के बजाय एक टाइमर पर भरोसा करने के लिए है। शुरू में

controlStyle प्रॉपर्टी सेट MPMovieControlStyleNone, और फिर MPMovieControlStyleFullscreen एक सेकंड बाद में एक [performSelector:withObject:afterDelay:1] का उपयोग करने के लिए सेट:

वास्तव में, निम्नलिखित समाधान अब और विचार नहीं किया जाना चाहिए। यह अच्छी तरह से काम करता है, जब तक उपयोगकर्ता वीडियो पर टैप नहीं करता तब तक नियंत्रण प्रकट नहीं होता है।

+1

अच्छी नोक। मैंने यह भी पाया कि अगर मैं नियंत्रण शैली को 'एमपीएमवी कंट्रोल स्टाइलफुलस्क्रीन' पर खेलने के तुरंत बाद सेट करता हूं, तो यह वही परिणाम प्राप्त करता है। तो शायद मनमानी 1 सेकंड देरी निर्दिष्ट करने का कोई कारण नहीं है? – curthipster

+0

एक दूसरी देरी मेरे लिए भी काम करती है। मैंने आधे सेकेंड की कोशिश की, लेकिन वह बहुत तेज था। –

+0

हां, मुझे अभी भी देरी की आवश्यकता है कि मुझे इस तरह की देरी शुरू करने की आवश्यकता क्यों है। –

34

उपयोग एक टाइमर के बजाय एक कॉलबैक:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hidecontrol) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:playerView.moviePlayer]; 

कॉल बैक समारोह के साथ:

- (void) hidecontrol { 
[[NSNotificationCenter defaultCenter] removeObserver:self  name:MPMoviePlayerNowPlayingMovieDidChangeNotification object:playerView.moviePlayer]; 
[playerView.moviePlayer setControlStyle:MPMovieControlStyleFullscreen]; 

} 
+0

मुझे वास्तव में यह समाधान पसंद है, क्योंकि यह वांछित व्यवहार को टाइमर की तुलना में कहीं अधिक सटीक रूप से कवर करता है, पूरी तरह से play-but-then-pause-or-hide रेस स्थिति को हटा देता है (माना जाता है कि आप इन मामलों में भी इस पर्यवेक्षक को साफ़ करते हैं)। –

+0

न केवल यह "बेहतर" समाधान है, यह सही समाधान है। दूसरा बस अप्रत्याशित दौड़ की स्थिति के चेहरे में विफल रहता है। – kevlar

+3

यह सुनिश्चित नहीं है कि यह अभी भी आईओएस 6 पर काम कर रहा है। ऐसा लगता है कि लोडस्टेट बहुत जल्दी बदलता है या नहीं। MPMoviePlayerPlaybackStateDidChangeNotification को प्लेबैक में बदलाव के लिए देखकर MPMoviePlaybackStatePlaying पर सेट अधिक मजबूत लगता है। –

10
player.moviePlayer.controlStyle = MPMovieControlStyleNone; 

यह करने के लिए नवीनतम और रास्ता नहीं है। :)

+0

एक आकर्षण की तरह काम करता है – Hammer

संबंधित मुद्दे