Сбой AVPlayerViewController при нажатии кнопки выбора мультимедиа в альбомной ориентации на устройстве iPhone Plus

Название почти все описывает, но здесь подробно ... Для воспроизведения видео в моем приложении я использую AVPlayerViewController, который я представляю модально.

let player = AVPlayer.init(url: url)
let playerViewController = AVPlayerViewController.init()
playerViewController.player = player
parentViewController.present(playerViewController, animated: true, completion: {...})

Все работает нормально, видео воспроизводится в полноэкранном режиме, и я могу повернуть устройство в альбомную ориентацию и снова в портретную ориентацию ... все же все работает плавно.

Когда я касаюсь речевого пузыря в правом нижнем углу, чтобы изменить настройку звука или субтитров, этот тип UIAlertController отображается в портретном режиме (iPhone 7 плюс портрет):  настройки звука и субтитров в портретной ориентации

При нажатии той же кнопки в альбомном режиме это выглядит так (в основном то же самое, но будет отображаться в портретной ориентации, iPhone 7 в альбомной ориентации): настройки звука и субтитров запускаются в альбомной ориентации, но отображаются в портретной ориентации

То же самое на iPad Air 2 в горизонтальной ориентации выглядит так:  настройки звука и субтитров в альбомной ориентации на iPad

Теперь актуальная проблема: при воспроизведении фильма на устройстве 6 / 6s / 7 PLUS в альбомной ориентации и нажатии на облачко с текстом приложение вылетает! Вот что отображается в выводе отладчика и трассировке стека:

10.08.2017, 12:08: 18.683184 + 0200 MyApp [27739: 6396143] [Assert] transitionViewForCurrentTransition не задано! (‹_UIFullscreenPresentationController: 0x7ffe3e586000>)  Трассировка стека

Для меня это похоже на ошибку Apple, потому что я здесь не делаю ничего особенного (по крайней мере, я так думаю) и потому, что сбой проявляется только при использовании плюсового устройства, которое является единственным, имеющим комбинацию класса компактного и обычного размера. .

Кто-нибудь знает, что здесь происходит?


person Kai    schedule 10.08.2017    source источник
comment
та же проблема, с которой я столкнулся, вы нашли решение?   -  person karthikeyan    schedule 10.10.2017
comment
@karthikeyan посмотри мой ответ   -  person Kai    schedule 10.10.2017


Ответы (4)


У меня такая же проблема, я исправил ее следующим кодом в AppDelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    for (UIView *transitionView in window.subviews) {
        if ([transitionView isKindOfClass:NSClassFromString(@"UITransitionView")]) {
            for (UIView *subView in transitionView.subviews) {
                id nextResponder = [subView nextResponder];
                if ([nextResponder isKindOfClass:NSClassFromString(@"AVFullScreenViewController")]) {
                    return UIInterfaceOrientationMaskAll;
                }
            }
        }
    }
    return   (1 << UIInterfaceOrientationLandscapeRight) | (1 << UIInterfaceOrientationLandscapeLeft);
}
person qinghe.zhang    schedule 16.10.2017
comment
У меня все еще вылетает. - person ScottyBlades; 26.03.2021

Вот версия Swift:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    if let window = window, let transitionViewClass = NSClassFromString("UITransitionView") {
        for transitionSubview in window.subviews where transitionSubview.isKind(of: transitionViewClass) {
            for subview in transitionSubview.subviews {
                if
                    let avPlayerClass = NSClassFromString("AVFullScreenViewController"),
                    let nextResponder = subview.next,
                    nextResponder.isKind(of: avPlayerClass) {
                    return .all
                }
            }
        }
    }

    return .portrait
}

Это сработало для меня !!

person David Beleza    schedule 22.06.2018
comment
У меня все еще вылетает. - person ScottyBlades; 26.03.2021

Я попробовал решение @ qinghe.zhang. Но вылет полностью не исправлен. Когда я выхожу AVMediaSelectionViewController, AVFullScreenViewController вернусь в портретный режим. Удерживайте устройство в альбомной ориентации и сохраните видео в портретном режиме, затем снова нажмите кнопку мультимедиа, произошел тот же сбой. Поэтому я немного изменил решение @ qinghe.zhang. Возвращает текущую ориентацию вместо UIInterfaceOrientationMaskAll, когда nextResponder равно AVFullScreenViewController. И AVMediaSelectionViewController будет отображаться в портретном режиме, чтобы избежать этого сбоя.

 for (UIView *transitionView in window.subviews) {
        if ([transitionView isKindOfClass:NSClassFromString(@"UITransitionView")]) {
            for (UIView *subView in transitionView.subviews) {
                id nextResponder = [subView nextResponder];
                if ([nextResponder isKindOfClass:NSClassFromString(@"AVFullScreenViewController")]) {
                    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
                    return 1 << orientation;
                }
            }
        }
    }
    return UIInterfaceOrientationMaskPortrait;
person WPLog    schedule 23.07.2019
comment
Я испытал этот сбой на iPhone 8+ / iOS 12.1.3. Я обнаружил, что эта модификация @ qinghe.zhang не нужна. Однако я вижу, что вы опубликовали это совсем недавно - в 2019 году - и хотели бы знать, на каком устройстве / iOS вы были? - person Airsource Ltd; 14.05.2020

Это, должно быть, ошибка iOS 10, потому что я больше не могу воспроизвести эту проблему с iOS 11.

person Kai    schedule 10.10.2017
comment
Я получаю только устройство iOS 11, а не iOS 10 - person karthikeyan; 11.10.2017
comment
Есть опыт работы на iOS 12. - person Airsource Ltd; 14.05.2020