Остановить переход приложения в фоновый режим при смахивании вверх от нижнего края на iPhone X iOS 12

Моя игра переходит в фоновый режим при выполнении свайпа от нижнего края экрана на iPhone X iOS 12.

Согласно документации Apple, переопределение preferredScreenEdgesDeferringSystemGestures и вызов setNeedsUpdateOfScreenEdgesDeferringSystemGestures должны остановить переход приложения в фоновый режим, но это не работает на iOS 12.

Я использую Unity3D, и в редакторе есть параметр Откладывать системные жесты на краях, который реализован в соответствии с документацией Apple, но тоже не работает.

Я компилирую проект в Xcode 10.

У кого-нибудь еще есть эта проблема, и у вас есть решение?

PS: я тестирую это в пустом проекте iOS с одним представлением, единственный добавленный код следующий:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear: animated];

    [self setNeedsUpdateOfHomeIndicatorAutoHidden];
    [self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}

Обновление: оказывается, если я использую быструю реализацию, она работает. Жаль, что я не могу сделать это для проекта, сгенерированного Unity3D 2017.

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    
    if #available(iOS 11.0, *){
        setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
    }
}

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
    return [.all];
}
}

Новое обновление: в Unity 2019 это работает, сняв флажок «Скрытая строка состояния» в «Настройки проекта» \ «Разрешение и презентация» и убедившись, что вы отметили хотя бы одно ребро в «Настройки проекта» \ «Другие настройки» \ «Отложить системные жесты на краях».


person filo    schedule 09.10.2018    source источник
comment
Вы пробовали это в iOS 11? Или проблема специфична для iOS 12?   -  person GoGreen    schedule 09.10.2018
comment
Я не могу, так как у меня нет iPhone X с iOS 11 и игра не запускается в симуляторе.   -  person filo    schedule 09.10.2018
comment
Я проверю это с iOS 12 и дам вам знать.   -  person GoGreen    schedule 10.10.2018
comment
Спасибо GoGreen. Но я тестирую на iOS 12, было бы полезно, если бы вы могли протестировать на iOS 11.   -  person filo    schedule 10.10.2018
comment
Кстати, вы должны рассматривать только UIRectEdgeBottom, так как там находится домашний индикатор.   -  person nayem    schedule 18.10.2018
comment
Я согласен, использовал All только для тестирования!   -  person filo    schedule 18.10.2018


Ответы (2)


Удаление prefersHomeIndicatorAutoHidden заставляет его работать и в Objective C.

Это рабочий пример реализации для всех, у кого есть такая же проблема:

- (void)viewDidLoad {
    [super viewDidLoad];

    if (@available(iOS 11.0, *)) { 
      [self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
    }
 }

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

А для тех, кто, как и я, использует Unity3d, просто удалите следующий метод из UnityViewControllerBase+iOS.mm в сгенерированном проекте Xcode:

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}
person filo    schedule 18.10.2018
comment
Возврат NO должен иметь тот же эффект. - person iFarbod; 29.01.2019
comment
И самое главное, если вы сделаете все вышеперечисленное, кроме того, что оставите код return UnityGetHideHomeButton(), это не сработает. Измените его, чтобы вернуть NO, и он будет. - person Jason Hughes; 04.02.2020
comment
Удаление PrefersHomeIndicatorAutoHidden делает свое дело. Спасибо, что указали на это! - person Bernhard Krenz; 21.06.2021

Согласно документации Apple, preferredScreenEdgesDeferringSystemGestures не останавливает переход приложения в фоновый режим, он просто дает вашему жесту приоритет над жестом системы. Однако, если вы попытаетесь сделать это последовательно во второй раз, системный жест сработает. Вы можете легко убедиться в этом, сравнив с другими приложениями.

По умолчанию линия внизу, которая помогает провести пальцем вверх, имеет черный цвет, и жест смахивания вверх будет работать мгновенно, если вы не переопределите этот метод. Но в вашем приложении строка изначально будет выделена серым цветом. Если вы проведете пальцем вверх, он снова станет черным, а если вы проведете второй раз, сработает системный жест.

Я ставлю это как ответ из-за ограниченного количества символов для комментариев.

person GoGreen    schedule 09.10.2018
comment
Спасибо за указание на это, это помогает прояснить мой вопрос. Поведение, которое я ищу, описано вами, когда системный жест работает во второй раз (фоны приложения на втором жесте). Поведение, которое я сейчас испытываю, заключается в том, что приложение переходит в фоновый режим с первого жеста. - person filo; 09.10.2018