fil*_*ilo 3 xcode objective-c unity-game-engine ios12
在 iPhone X iOS 12 上从屏幕底部边缘滑动时,我的游戏会进入后台模式。
根据Apple 文档,覆盖preferredScreenEdgesDeferringSystemGestures和调用setNeedsUpdateOfScreenEdgesDeferringSystemGestures应该会阻止应用程序进入后台,但这在 iOS 12 上不起作用。
我正在使用 Unity3D,编辑器具有“延迟系统手势边缘”选项,该选项是按照苹果文档实现的,但也不起作用。
我正在 Xcode 10 中编译该项目。
其他人有这个问题吗?你有解决办法吗?
PS:我正在一个空的单视图iOS项目中对此进行测试,唯一添加的代码如下:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear: animated];
[self setNeedsUpdateOfHomeIndicatorAutoHidden];
[self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
return UIRectEdgeAll;
}
- (BOOL)prefersHomeIndicatorAutoHidden
{
return YES;
}
Run Code Online (Sandbox Code Playgroud)
更新:事实证明,如果我使用快速实现,它就可以工作。太糟糕了,我无法对 Unity3D 2017 生成的项目执行此操作。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 11.0, *){
setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
}
}
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge{
return [.all];
}
}
Run Code Online (Sandbox Code Playgroud)
新更新:在 Unity 2019 中,它的工作原理是在项目设置\分辨率和演示中取消选中“隐藏状态栏”,并确保在项目设置\其他设置\延迟边缘上的系统手势中至少检查一个边缘
删除后prefersHomeIndicatorAutoHidden它也可以在 Objective C 中工作。
这是工作示例实现,适用于遇到相同问题的任何人:
- (void)viewDidLoad {
[super viewDidLoad];
if (@available(iOS 11.0, *)) {
[self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}
}
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
return UIRectEdgeAll;
}
Run Code Online (Sandbox Code Playgroud)
对于那些像我一样使用 Unity3d 的人来说,只需从生成的 Xcode 项目中的 UnityViewControllerBase+iOS.mm 中删除以下方法即可:
- (BOOL)prefersHomeIndicatorAutoHidden
{
return YES;
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用 Unity,请确保该选项prefersHomeIndicatorAutoHidden为“否”/“错误”。