Stop app going to background when swiping up from bottom edge on iPhone X iOS 12

北战南征 提交于 2019-12-08 04:55:31

问题


My game is going into background mode when performing a swipe from the bottom edge of the screen on iPhone X iOS 12.

As per Apple documentation overriding preferredScreenEdgesDeferringSystemGestures and calling setNeedsUpdateOfScreenEdgesDeferringSystemGestures should stop the app from going to background but this is's not working on iOS 12.

I am using Unity3D and the editor has the Defer system gestures on edges option , which is implemented as per apple documentation, but also does not work.

I am compiling the project in Xcode 10.

Does anyone else have this problem and do you have a fix?

PS: I am testing this in an empty single view iOS project, the only added code is the following:

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

    [self setNeedsUpdateOfHomeIndicatorAutoHidden];
    [self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}

Update: Turns out that if I use a swift implementation it works. Too bad I cannot do this for the Unity3D 2017 generated project.

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    if #available(iOS 11.0, *){
        setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
    }
}

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

回答1:


As per the apple documentation, preferredScreenEdgesDeferringSystemGestures doesn't stop the app from going to background, it just gives your gesture precedence over system gesture. However, if you try to do it successively a second time, the system gesture would work. You can easily verify this by comparing with other apps.

By default the line at the bottom which helps in swiping up is black in colour and the swipe up gesture would work instantly if you do not override this method. But in your app, the line will look gray'ed out initially. If you do a swipe up, it will become black again and if you swipe up a second time, the system gesture will work.

I am putting this as an answer because of limited characters for commenting.




回答2:


Removing prefersHomeIndicatorAutoHidden makes it work in Objective C also.

This is the working example implementation, for anyone having the same problem:

- (void)viewDidLoad {
    [super viewDidLoad];

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

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

And for those who, like me, are using Unity3d just delete the following method from UnityViewControllerBase+iOS.mm in the generated Xcode project:

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}


来源:https://stackoverflow.com/questions/52716873/stop-app-going-to-background-when-swiping-up-from-bottom-edge-on-iphone-x-ios-12

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!