Are there any workaround to avoid SFSafariViewController from hiding fixed position headers?

人走茶凉 提交于 2019-12-05 03:19:12
Mojtaba Hosseini

- The Issue

Testing in different environments shows that the issue only appears in SFSafariView and the original safari app is not infected. And it's only appear in iPhone's with notch in portrait mode when user riches the end of the page and scroll again; So the page should go up and navigation bar automatically appears again and conflict will happen.

iPhone 8 - Bottom of the page - Portrait (OK)

iPhone XR - Bottom of the page - Portrait (NOT OK)

iPhone XR - Bottom of the page - Portrait (OK)

iPad Pro 9.7 - Bottom of the page - Landscape (OK)

In some cases this may not be SFSafaryViewController's bug.

  • So if you have access to front-end developers of the site that you want to embed in the SFSafaryViewController, introduce the following to them:

- Safe Area Inset

Therefore to resolve this Apple implemented new safe-area-inset, pre-defined set of 4 constants and a new CSS function called constant(). The safe area pre-defined constants are as follows: safe-area-inset-top, safe-area-inset-right, safe-area-inset-bottom and save-area-inset-left. When you combine all four of those constants, you can reference the current size of safe area inset on each side. The constant() works everywhere a var() does.

There are a bunch of sites that show you how to adopt a web page to iPhone X. Here's one of them.

Maybe they could try placing the div outside of the scrollable part, and have the position fixed. So if you have a code where it scrolls:

<div id="scroll-container">
  <div id="scrollable">
  </div>
<div>

Such where any element in the div scroll-container, it will scroll.

If they place it outside of the scrollable part:

<div id="scroll-container">
<div>
<div id="not-scrollable">
</div>

and put position:fixed; or position:absolute; or position: sticky or device-fixed; or etc. in the css for #not-scrollable, It shouldn't scroll.

  • So if you don't have access to front-end developers of the site that you want to embed in the SFSafaryViewController try the following (Not recommended):

    • Try turning barCollapsing safaryViewController.configuration.barCollapsingEnabled = false
    • or Try embedding it in a navigationController and get rid of the SFView's header
    • or Use Implement a full screen WKWebView with controller instead of SFSafaryViewController.

Note (For those who mess with the toolbar)

  • You can use the delegate methods to determine the loading and loaded state of the web page and enable/disable it to get round the page layout initialization bug. (You can use manual delay too)
  • You can use private APIs to hide or show the bottom toolbar. But it's not preferred and it will reject from apple appstore.

What if you override the prefersStatusBarHidden as below ?

override func prefersStatusBarHidden() -> Bool {
    return true
}

And you may want to add a reload button manually :-(

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