2010-09-06 25 views
14

Tôi đã đấu tranh với một vấn đề rất khó chịu cả ngày và tôi hy vọng tôi có thể tìm sự giúp đỡ trên bảng này.Ẩn Statusbar khỏi MPMoviePlayerController

Tôi đang sử dụng MPMoviePlayerController để phát phim toàn màn hình trên iPad và tôi không thể tìm cách xóa thanh trạng thái luôn hiển thị bất chấp mọi nỗ lực của tôi để biến nó thành địa ngục.

Đây là mã của phương pháp tôi sử dụng để hiển thị các bộ phim:

-(void)launchVideoFromButton:(id)sender{ 

     NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"movie01" ofType:@"m4v"]; 
     NSURL *videoPathURL = [NSURL fileURLWithPath:videoPath]; 
     moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoPathURL]; 

     [self.view addSubview:moviePlayer.view]; 

     moviePlayer.shouldAutoplay = YES; 
     moviePlayer.movieSourceType = MPMovieSourceTypeFile; 


     [moviePlayer setFullscreen:YES animated:YES]; 
     moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

     NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
     [notificationCenter addObserver:self selector:@selector(moviePlayerEvent:) name:MPMoviePlayerLoadStateDidChangeNotification object:moviePlayer]; 

    } 



    -(void)moviePlayerEvent:(NSNotification*)aNotification{ 

     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO]; 
     NSLog(@"%i", [UIApplication sharedApplication].statusBarHidden); 

    } 

Trong giao diện điều khiển, tôi có thể thấy rằng moviePlayerEvent được kích hoạt khi bộ phim xuất hiện nhưng statusbar vẫn còn đó: [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: NO] dường như không hoạt động. Tôi đã cố gắng sử dụng các thông báo MPMoviePlayerController khác mà không có may mắn.

Có ai có thể giúp tôi về điều đó không?

Xin cảm ơn trước.

Trả lời

9

Không thêm chế độ xem của trình phát phim vào chế độ xem chính; thay vào đó, hãy trình bày trình phát phim theo cách thông thường như sau (một số bước bị bỏ qua cho ngắn gọn/rõ ràng):

moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; 

// Register for the playback finished notification. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(myMovieFinishedCallback:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayerViewController.moviePlayer]; 


//Present 
    [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController]; 

    // Play the movie! 
    self.moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile; 
    [self.moviePlayerViewController.moviePlayer play]; 



// When the movie is done, release the controller. 
-(void)myMovieFinishedCallback:(NSNotification*)aNotification 
{ 

    //NSLog(@"playback terminated"); 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMoviePlayerPlaybackDidFinishNotification 
                object:moviePlayerViewController.moviePlayer]; 


    [moviePlayerViewController release], moviePlayerViewController = nil; 


} 
0

đây không phải là câu trả lời, tôi gặp vấn đề tương tự. Có một phần tôi có thể cập nhật tuy nhiên ..

Thanh trạng thái chỉ hiển thị khi các điều khiển hiển thị.

Nhấp vào phim, ẩn các biểu tượng & thanh trạng thái, nhấp lại, hiển thị các điều khiển và thanh trạng thái cũng sẽ trở lại.

Tôi cũng ẩn thanh trạng thái theo chương trình ngay trước khi tôi khởi chạy phim.

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

và đây là cách tôi đang bổ sung thêm các bộ phim:

[[[UIApplication sharedApplication] keyWindow] addSubview: movieView];

1

Thanh trạng thái đã hided, nhưng hiển thị một lần nữa với sự kiểm soát chơi.

-(void)viewDidLoad:{ 
     [super viewDidLoad]; 
     MPMoviePlayerViewController *moviePlayerViewController = 
       [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL]; 

     [[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(playbackStateChange:) 
       name:MPMoviePlayerLoadStateDidChangeNotification 
       object:moviePlayerViewController.moviePlayer]; 
    } 
    -(void)playbackStateChange:(NSNotification*)notification{ 
     if([[UIApplication sharedApplication]respondsToSelector:@selector(setStatusBarHidden: withAnimation:)]) 
     [[UIApplication sharedApplication] setStatusBarHidden:YES 
         withAnimation:UIStatusBarAnimationNone]; 
     else 
      [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
} 
22

Thật không may, sau khi gặp phải vấn đề này, thông qua nghiên cứu và thử nghiệm, tôi đã không thể giữ thanh trạng thái iOS ẩn ở chế độ toàn màn hình. Không có vấn đề gì bạn làm, khi điều khiển trình phát màn hình đầy đủ được hiển thị, do đó, sẽ thanh trạng thái (nó sẽ không tôn trọng setStatusBarHidden:YES). Đây không phải là trường hợp với các điều khiển trình phát được nhúng, nhưng người dùng có thể dễ dàng chuyển đổi giữa chế độ nhúng và chế độ toàn màn hình, vì vậy bạn không thể sử dụng điều này để duy trì thanh trạng thái khi các điều khiển được hiển thị.

Tất nhiên, ít nhất là trên thanh trạng thái sẽ biến mất khi các điều khiển mờ dần ...

+0

+1 để có câu trả lời đúng. Vui lòng gửi báo cáo lỗi về vấn đề này. – Till

+0

Thật ngu ngốc, tôi có một thanh trạng thái trống và tôi không thể loại bỏ nó. – EladG

0

Đối với những người đã được chạy vào vấn đề này, tôi đã tìm thấy một giải pháp của riêng tôi có thể giúp. Nó chỉ áp dụng mặc dù nếu phần còn lại của ứng dụng của bạn không hiển thị thanh trạng thái và nếu bạn đang cố gắng ẩn nó một lần nữa khi bộ phim được thực hiện và trở về giao diện của bạn, thay vì trong khi phát lại.

Nếu MPMoviePlayerController của bạn đang được thêm dưới dạng chế độ xem phụ vào UIView đang được đẩy lên ngăn xếp của trình điều khiển điều hướng, bạn có thể sử dụng phương thức viewWillDisappear của chế độ xem của trình điều khiển gốc để trợ giúp bạn.

Trong phương pháp đó, bạn có thể thay đổi kiểu điều khiển thành không, điều này sẽ xóa bất kỳ và tất cả điều khiển trình phát phim trước khi chế độ xem biến mất và xóa thanh trạng thái ra nếu bạn đã đặt chế độ này thành ẩn. Điều này sẽ hoàn toàn không phụ thuộc vào người dùng khi chế độ xem đang di chuyển khỏi màn hình và họ không còn tương tác với màn hình nữa.

0

Tôi có cùng sự cố nhưng tôi đã thêm vào info.plist hàng Status bar is initially hidden - Boolean - YES và hoạt động của mình!
BTW Tôi đang sử dụng iOS 5.1, Xcode 4.3.2.

+0

Điều này sẽ hoạt động trừ khi bạn muốn thanh trạng thái cho ứng dụng của mình, không phải cho phim. – Cthutu

+1

Tôi có 'Thanh trạng thái ban đầu được ẩn 'được đặt thành' CÓ' (ứng dụng OpenGL ES), nhưng thanh trạng thái xuất hiện khi tôi trình bày một phương thức 'MPMoviePlayerController'. –

+0

Tôi có thanh Trạng thái ẩn được đặt thành CÓ là tốt và tôi vẫn nhận được thanh trạng thái. Câu trả lời bằng rcw3 là chính xác, nếu bạn đang sử dụng các điều khiển toàn màn hình, bạn không thể ẩn thanh trạng thái. –

1

Sử dụng MPMovieControlModeVolumeHidden không làm việc cho tôi, là người duy nhất mà làm việc là MPMovieControlModeVolumeOnly với video trong toàn màn hình:

myMoviePlayer.controlStyle = MPMovieControlModeVolumeOnly; 
[myMoviePlayer setFullscreen:YES]; 

Và cũng có thể, tôi thêm xem phim như là một subview vào xem cha mẹ:

[parentView addSubview:myMoviePlayer.view]; 

ứng dụng của tôi có nghĩa vụ phải không có thanh trạng thái và tính tương thích ngược tôi sử dụng đoạn mã sau vào các đại biểu ứng dụng:

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)]) 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
else 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
2

Nó làm việc cho tôi để sử dụng MPMoviePlayerViewController, lập

sau
[moviePlayerController.moviePlayer setFullscreen:YES animated:NO]; 
moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

trước khi điều này:

[self presentViewController:moviePlayerController animated:NO completion:^{ }]; 

và sau đây ngay sau:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone; 

chỉ trong trường hợp, tôi cũng đã làm điều này:

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

... 


- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification { 


    if ([[moviePlayerController moviePlayer] loadState] == MPMovieLoadStateStalled) { 

    } else if([[moviePlayerController moviePlayer] loadState] != MPMovieLoadStateUnknown) { 

     [moviePlayerController moviePlayer].controlStyle = MPMovieControlStyleNone; 

     ... 
    } 
} 

Vì vậy, không có thanh trạng thái, không có điều khiển ... không có gì ngoài chỉ là video thuần túy.)

(Đã thử nghiệm trên thiết bị iOS 5.1 và trình mô phỏng 6.0).

+0

Tin đáng buồn ... Tôi không nhận thấy trước, nhưng điều đó xuất hiện khi chúng tôi ẩn mọi thứ trên phim đang phát, thì thanh trạng thái không xuất hiện khi đóng phim. Đó rõ ràng là một số lỗi trong iOS, vì nó không phải biến mất, vì tôi không làm bất cứ điều gì liên quan trực tiếp đến nó ... và nó xuất hiện sau đó khi tôi mở một số bộ điều khiển phương thức, ví dụ, có thể, "làm mới" ứng dụng bối cảnh hay gì đó. Dù sao ... để làm cho thanh trạng thái vẫn xuất hiện, tôi chỉ bắt được khoảnh khắc cuối cùng khi phim kết thúc và làm moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen; – Agat

+0

Tôi cũng phải dừng video thủ công [moviePlayerController.moviePlayer stop]; sau khi loại bỏ các bộ điều khiển phim cũng bằng tay, nếu không tôi hoặc là có màn hình màu đen trái hoặc video âm thanh phát trong nền khi bộ điều khiển đã biến mất. Vì vậy, khá "vui" hành vi của iOS. Khoảnh khắc làm thế nào để tôi bắt được video "sẽ kết thúc" được mô tả ở đây: http://stackoverflow.com/a/13318267/691660. Chúc may mắn cho tất cả chúng ta!) – Agat

0

Tôi không biết giải pháp của mình có áp dụng cho vấn đề của bạn hay không, nhưng nó hoạt động cho thiết lập của tôi, tức là iPod thế hệ thứ 4 chạy iOS 5.1.

Ứng dụng của tôi hoàn toàn không hiển thị thanh trạng thái và trong tệp info.plist, mục nhập tương ứng "Thanh trạng thái ban đầu bị ẩn" được đặt thành CÓ.

Tôi cũng thêm trực tiếp chế độ xem MPMoviePlayerController vào chế độ xem chính. Dưới đây là mã để thiết lập trình phát phim:

moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:theurl]; 
[moviePlayer.view setFrame:frame]; // This is set to (0, 0, 320, 480) 
[moviePlayer prepareToPlay]; 
[moviePlayer setShouldAutoplay:YES]; 
moviePlayer.fullscreen = TRUE; 
moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 
[self.view addSubview:moviePlayer.view]; 

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

Bộ phimPlayer là một biến lớp.

Khi người chơi kết thúc chơi hoặc khi người xem nhấn vào nút "Done" của bộ điều khiển MoviePlayer, phương pháp playbackFinished: được gọi là:

- (void)playBackFinished:(NSNotification *)notif{ 
moviePlayer.controlStyle = MPMovieControlStyleNone; 
[moviePlayer stop]; 
[moviePlayer.view removeFromSuperview]; 

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
[moviePlayer release]; 
moviePlayer = nil; 
} 

Trong đó sự kiểm soát phong cách của MoviePlayer được thiết lập để MPMovieControlStyleNone để ngăn chặn bất kỳ điều khiển nào, nhưng về cơ bản thanh trạng thái hiển thị khi moviePlayer bị xóa khỏi chế độ xem chính.

Các vấn đề liên quan