在 iPhone X iOS 12 上从底部边缘向上滑动时停止应用进入后台

问题描述 投票:0回答:4

在 iPhone X iOS 12 上从屏幕底部边缘滑动时,我的游戏进入后台模式。

根据Apple文档覆盖

preferredScreenEdgesDeferringSystemGestures
并调用
setNeedsUpdateOfScreenEdgesDeferringSystemGestures
应该阻止应用程序进入后台,但这在iOS 12上不起作用。

我正在使用 Unity3D,并且编辑器具有 Defer system gestures on edges 选项 ,这是根据苹果文档实现的,但也不起作用。

我正在 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 中,它通过在 Project Stttings\Resolution and presentation 中取消选中“Status Bar Hidden”并确保在 Poject Settings\Other Settings\Defer system gestures on edges 中至少选中一个边缘来工作

objective-c xcode unity3d ios12
4个回答
7
投票

删除

prefersHomeIndicatorAutoHidden
使其也可以在 Objective C 中工作。

这是工作示例实现,适用于遇到相同问题的任何人:

- (void)viewDidLoad {
    [super viewDidLoad];

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

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

对于像我一样使用 Unity3d 的人,只需删除生成的 Xcode 项目中的 UnityViewControllerBase+iOS.mm 中的以下方法:

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}

如果您不使用 Unity,请确保

prefersHomeIndicatorAutoHidden
为 NO/false。


2
投票

根据苹果文档,

preferredScreenEdgesDeferringSystemGestures
不会阻止应用程序进入后台,它只是让您的手势优先于系统手势。 但是,如果您尝试连续第二次执行此操作,系统手势就会起作用。您可以通过与其他应用程序进行比较来轻松验证这一点。

默认情况下,底部有助于向上滑动的线条是黑色的,如果您不覆盖此方法,向上滑动手势将立即生效。但在您的应用程序中,该行最初看起来是灰色的。如果你向上滑动,它会再次变黑,如果你再次向上滑动,系统手势就会起作用。

由于评论字符有限,我将其作为答案。


0
投票

对于 Swift,答案是像这样在 UIViewController 中覆盖实例属性。

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge { 
    get { .all } 
}

例如。


0
投票

与接受的答案相同,但现在更 Swifty

class ViewController: UIViewController {

    // must be false so that first swipe up is ignored
    override var prefersHomeIndicatorAutoHidden: Bool {
        return false
    }

    override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
        return [.bottom]
    }
    
    // MARK: - Either true or false works
    
    override var prefersStatusBarHidden: Bool { return true }
}
© www.soinside.com 2019 - 2024. All rights reserved.