2011-12-02 17 views
6

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

क्या आपने कभी ऐसा कुछ देखा है?

मैं आसानी से इस बग को फिर से बनाने में सक्षम हूं। मैंने एक नया सिंगल व्यू ऐप बनाया और बस एक बटन और नेविगेशन बार जोड़ा। यदि वीडियो चल रहा है, तो मैं ओरिएंटेशन घुमाता हूं, पूर्णस्क्रीन को सक्षम करने के लिए टैप करें और वीडियो स्टेटस बार अभी भी दिखाई दे रहा है, जब वीडियो खत्म हो जाता है, तो सब अच्छा है। लेकिन, अगर मैं वीडियो स्टेटस बार गायब होने के बाद घूमने का इंतजार करता हूं, जब मैं घुमाता हूं और वीडियो समाप्त होता है, तो नेविगेशनबार स्टेटस बार के नीचे होता है। छवि देखें:

iPhone Image

यहाँ सरल कोड मैं का उपयोग कर रहा है:

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

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

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES 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]; 
} 

वह स्थान है जहां मैं नीचे दिए गए सुझावों के साथ में वर्तमान में कर रहा हूँ। मेरे पास कुछ गलत होना चाहिए क्योंकि दुर्भाग्यवश मुझे अभी भी एक ही समस्या है।

यहाँ विधि onPlayerWillExitFullScreen

UIView *view = [[[UIApplication sharedApplication] delegate].window.subviews lastObject];  
if (view) { 
    [view removeFromSuperview]; 
    [[[UIApplication sharedApplication] delegate].window addSubview:view]; 
} 

MPMoviePlayerController *player = [aNotification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerWillExitFullscreenNotification 
               object: player];  

है और यहाँ मेरे वर्तमान playMovie विधि है:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

[[NSNotificationCenter defaultCenter]addObserver: self 
             selector: @selector(onPlayerWillExitFullScreen:) 
              name: MPMoviePlayerWillExitFullscreenNotification 
              object: self.moviePlayer]; 

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 
+0

आप एक स्क्रीनशॉट या दो शामिल करना चाह सकते हैं। सुझाव के लिए –

+0

धन्यवाद जेफ। –

+0

स्क्रीनशॉट के लिए आपका लिंक टूटा हुआ है। – JonasCz

उत्तर

5

ठीक है, तो मैं इस डर लग रहा ही बग मेरे सभी एप्लिकेशन पर पहली बार एक UIWebView में फिर एक MPMoviePlayerController में पाया, मैं अपने दृश्य नियंत्रक में इस रखने के लिए इस कोड को हल किया।

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 

ट्रिकी बग, मुश्किल फिक्स।

+0

अंत में !! बहुत बहुत धन्यवाद। मुझे थोड़ा सा खेलना पड़ा लेकिन उसे मिला काम करने के लिए। मैंने कोड को मेरे ((शून्य) फिल्म के अंदर रखा है परिभाषित: (एनएसएनोटिफिकेशन *) एनीोटिफिकेशन –

+0

धन्यवाद आदमी, अंत में !! –

+0

अच्छी चाल, यह मेरे लिए आईओएस 5.0 पर काम करता है – rakeshNS

5

यदि आप MPMoviePlayerWillExitFullscreenNotification अधिसूचना के लिए सुनो, आप ठीक ढंग से पुनः बनाने का इस प्रकार अपने मुख्य विचारों मजबूर कर सकते हैं । संदर्भित 'विंडो' आपके एप्लिकेशन की मुख्य UIWindow ऑब्जेक्ट है।

जब MPMoviePlayerController पूर्णस्क्रीन पर स्विच किया गया, तो यह वास्तव में वीडियो प्रस्तुत करने के लिए एक अलग UIWindow उदाहरण बनाता है। सूचना को वापस ले जाने के रूप में अधिसूचना को पकड़कर, यह कोड उन विचारों को सुनिश्चित करेगा जिन्हें आप सही तरीके से रीयललाइन करने के लिए वापस स्विच कर रहे हैं।

मान्य है, यह एक सुरुचिपूर्ण समाधान नहीं है, लेकिन यह हर बार काम करता है।

UIView *view = [window.subviews lastObject]; 
if (view) { 
    [view removeFromSuperview]; 
    [window addSubview:view]; 
} 

सुनने के लिए इस सूचना के लिए, आप कुछ इस तरह है, जहां self.playerController अपने MPMoviePlayerController वस्तु है करने की आवश्यकता होगी।

हालांकि जब आप खिलाड़ी को छोड़ देते हैं तो इस अधिसूचना को सुनना बंद करना याद रखें!

// Determine the default notification centre 
    NSNotificationCenter *centre = [NSNotificationCenter defaultCenter]; 
    // Listen for interesting movie player notifications 
    [centre addObserver: self 
       selector: @selector(onPlayerWillExitFullScreen:) 
        name: MPMoviePlayerWillExitFullscreenNotification 
       object: self.playerController]; 
+0

सहायता के लिए धन्यवाद। मैं प्रोग्रामिंग के लिए नया हूं इसलिए मुझे यकीन नहीं है कि उस अधिसूचना को कैसे कार्यान्वित किया जाए, लेकिन मैं इसे एक शॉट देने जा रहा हूं। मुझे पता है कि एक समाधान है, मुझे बहुत राहत मिली है। –

+0

ने आपके लिए इसे शामिल करने के लिए मेरा उत्तर अपडेट किया है। – reddersky

+0

मैं UIWindow ऑब्जेक्ट के रूप में उलझन में हूं। मेरा सरल परीक्षण आवेदन लें, मेरे पास केवल एक बटन और नेविगेशनबार वाला सिंगल व्यू ऐप है। मैंने "self.view" के साथ उप "विंडो" करने की कोशिश की लेकिन सही नहीं होना चाहिए। –

3
- (void) moviePlayerWillExitFullScreen:(id)sender { 

[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:NO]; 

} 

दोस्तों इसे आजमाएं ... यह मेरे लिए काम करता है।मैंने कई अन्य तरीकों की कोशिश की और केवल यह काम किया।