Подтвердить что ты не робот

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
            })
        })
    }
}

Проблема: когда я открываю полноэкранный режим воспроизведения плеера, а затем меняем пейзаж и затем нажимаем "Готово", чтобы отключить полноэкранный режим, мое приложение остается в пейзаже. Но я хочу, чтобы он снова повернулся к портрету. Как я могу это сделать?

4b9b3361

Ответ 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
}