IOS 8 - измените ориентацию назад на портрет при отключении полного экрана AVPlayerViewController
мое приложение - это приложение только для портрета, но у меня есть один контроллер представлений, который отображает прямой эфир, используя AVPlayerViewController.
Чтобы разрешить пейзаж для полного экрана этого проигрывателя, я написал этот метод в AppDelegate.swift:
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
var orientation = UIInterfaceOrientationMask.Portrait
if let presentedController = window?.rootViewController?.presentedViewController? {
if presentedController.isKindOfClass( NSClassFromString("AVFullScreenViewController").self ) {
orientation = .AllButUpsideDown
} else if let navController = presentedController as? UINavigationController {
if navController.topViewController.isKindOfClass( NSClassFromString("AVFullScreenViewController").self ) {
orientation = .AllButUpsideDown
}
}
}
return Int(orientation.rawValue)
}
Вот как я вызываю инициализацию своего AVPlayer:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showLiveStream" {
SVProgressHUD.show()
var queue: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue, {
let streamURL = NSURL(string: liveStreamURL)
let playerItem = AVPlayerItem(URL: streamURL)
let player = AVPlayer(playerItem: playerItem)
dispatch_async(dispatch_get_main_queue(), {
SVProgressHUD.dismiss()
var playerViewController = segue.destinationViewController as AVPlayerViewController
playerViewController.player = player
})
})
}
}
Проблема: когда я открываю полноэкранный режим воспроизведения плеера, а затем меняем пейзаж и затем нажимаем "Готово", чтобы отключить полноэкранный режим, мое приложение остается в пейзаже. Но я хочу, чтобы он снова повернулся к портрету. Как я могу это сделать?
Ответы
Ответ 1
Вместо реализации application(_:supportedInterfaceOrientationsForWindow:)
попробуйте реализовать supportedInterfaceOrientations()
на каждом контроллере представления. Так, например:
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
Это гарантирует, что контроллер просмотра не может отображаться в альбомной ориентации, поэтому при отклонении видеопроигрывателя он вернется в окно портрета.
Обновить Objective-C:
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
Ответ 2
Что я сделал, чтобы исправить эту проблему, создать новый класс с функцией viewDidLayoutSubviews и переопределить его!
final class NewMoviePlayerViewController: AVPlayerViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if view.bounds == contentOverlayView?.bounds {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
}
}
Ответ 3
Добавьте эти строки в Appdelegate и требуемый контроллер просмотра
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
//LandScapeMode:- UIInterfaceOrientationMaskLandscape;
//PortraitMode:-
return UIInterfaceOrientationMaskPortrait
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
//LandScapeMode:- UIInterfaceOrientationLandscapeRight;
// ProtraitMode:-
return UIInterfaceOrientationPortrait
}