Ответ 1
Я исправил его с помощью этого кода:
@interface YourAVPlayerViewController : AVPlayerViewController
@end
@implementation YourAVPlayerViewController
- (BOOL)prefersStatusBarHidden {
return YES;
}
@end
Я кодирую приложение, где использование может просматривать широкий спектр видео. Я открываю видео в полноэкранном режиме при нажатии кнопки, и пользователь может использовать элементы управления воспроизведением для изменения размера окна. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь делится своим Интернетом через точку доступа, в верхней части приложения есть синий бар. При изменении размера окна в этот момент произойдет сбой в структуре AVKit (я считаю). Использование Swift 2.3, Xcode 7.3.1. Мой телефон, iPhone 6s, использует iOS 10, и я также пробовал его на iOS 9 iPhone 6 Plus, той же самой проблеме.
Авария:
Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<AVFullScreenPlaybackControlsViewController: 0x102933000> should have parent view controller:<AVPlayerViewController: 0x10212d800> but actual parent is:<AVFullScreenViewController: 0x10884d900>'
Мой код:
private let playerController = AVPlayerViewController()
private var player: AVPlayer!
private func playVideo(media: Media) {
player = AVPlayer(URL: NSURL(string: media.url)!)
playerController.player = player
presentViewController(playerController, animated: true, completion: {
self.playerController.player?.play()
self.playerController.delegate = self
})
}
Если я не использую свой интернет на своем телефоне (таким образом, нет синей полосы), тогда он работает нормально, никаких проблем вообще. Кому-то удалось скрыть эту синюю панель или возникли аналогичные проблемы?
Я исправил его с помощью этого кода:
@interface YourAVPlayerViewController : AVPlayerViewController
@end
@implementation YourAVPlayerViewController
- (BOOL)prefersStatusBarHidden {
return YES;
}
@end
В качестве обходного пути вы можете нажать на стеке navigationControlelr или при использовании модально использовать это:
@interface AVPlayerViewController ()
- (void)fullScreenButtonTapped:(id)arg1;
@end
@interface RCKPlayerViewController ()
@end
@implementation RCKPlayerViewController
- (void)fullScreenButtonTapped:(id)arg1 {
if ([[UIApplication sharedApplication] statusBarFrame].size.height >= 40) {
// Show alert that cannot enter full screen when in-call
} else {
[super fullScreenButtonTapped:arg1];
}
}
@end
-
Затем просто используйте RCKPlayerViewController
AVPlayerViewController *playerViewController = [[RCKPlayerViewController alloc] init];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:videoStringURL]];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
playerViewController.player = player;
[self presentViewController:playerViewController animated:YES completion:^{
[player play];
}];
Я написал небольшое расширение для AVPlayerViewController
, которое исправляет проблему в обложке:
// AVPlayerViewController.swift
import AVKit
extension AVPlayerViewController {
// fixes app crash while using personal hotspot + watching a full screen video
override open var prefersStatusBarHidden: Bool {
return true
}
}