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

4uqofj5v  于 2023-03-19  发布在  iOS
关注(0)|答案(4)|浏览(319)

在iPhone X iOS 12上从屏幕底部边缘执行滑动时,我的游戏将进入后台模式。
根据Apple documentation,覆盖preferredScreenEdgesDeferringSystemGestures并调用setNeedsUpdateOfScreenEdgesDeferringSystemGestures应阻止应用程序进入后台,但这在iOS 12上不起作用。
我使用的是Unity3D,编辑器有Defer system gestures on edges option,它是按照苹果文档实现的,但也不起作用。
我正在Xcode 10中编译该项目。
其他人有这个问题吗?你有解决办法吗?
PS:我正在一个空的单视图iOS项目中测试这个,唯一添加的代码如下:

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

    [self setNeedsUpdateOfHomeIndicatorAutoHidden];
    [self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}

更新:事实证明,如果我使用Swift实现,它就能工作。可惜我不能为Unity3D 2017生成的项目这样做。

class ViewController: UIViewController {

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

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

新更新:在Unity 2019中,它的工作原理是取消选中项目设置\分辨率和演示中的“状态栏隐藏”,并确保您选中项目设置\其他设置\在边缘上延迟系统手势中的至少一个边缘

kyvafyod

kyvafyod1#

移除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。

tzdcorbm

tzdcorbm2#

根据苹果的文档,preferredScreenEdgesDeferringSystemGestures并没有阻止应用程序进入后台,它只是让你的手势优先于系统手势,但是,如果你第二次尝试连续这样做,系统手势还是会起作用,你可以很容易地通过与其他应用程序比较来验证这一点。
默认情况下,底部用于帮助向上滑动的线条为黑色,如果您不覆盖此方法,向上滑动手势将立即生效。但在您的应用中,该线条最初将显示为灰色。如果您向上滑动,它将再次变为黑色,如果您第二次向上滑动,系统手势将生效。
我把这个作为一个答案,因为有限的字符评论。

pcww981p

pcww981p3#

对于Swift,答案是在UIViewController中覆盖示例属性。

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

例如。

xpszyzbs

xpszyzbs4#

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

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

相关问题