SFSafariViewController a ce bogue qui n'est pas reproductible dans Safari.
Régulièrement, il occultera le haut d'un panneau fixe derrière le nom du site/done chrome.
Cela se produit car, en interne, la synchronisation entre la hauteur réelle de la page et la taille de l'en-tête de rétrécissement chromé n'est plus synchronisée.
Ce problème a été signalé ailleurs sur: https://meta.stackexchange.com/questions/279792/new-ios-chat-headers-occasionally-hide-hide-hide-safari-navigation-controls-when-vi et est un problème dans iOS 9 et versions ultérieures (toujours un problème dans 12.0.1)
Pour reproduire une application factice avec SFViewController et accéder à un site avec un en-tête fixe tel que bbs.boingboing.net, cliquez sur et parcourez quelques rubriques.
Comme ce bogue a maintenant quelques années, je me demande s’il existe une solution de contournement qui ne consiste pas à ajouter un remplissage général en haut de l’en-tête?
Faire une page avec ce HTML
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
height: 2000px;
background-color: green;
}
header {
width: 100%;
height: 50px;
background-color: red;
color: white;
position: fixed;
top: 0;
}
</style>
</head>
<body>
<header>Hello</header>
</body>
</html>
Ouvrez SafariViewController (hébergez-le en ligne, puis envoyez un lien par e-mail, l'application gmail sous iOS utilise également Safari View Controller, ainsi que l'application Discourse).
Faites défiler rapidement vers le bas
La moitié de l'en-tête se cache.
Les incrustations ne font aucune différence, l'encart pour top est égal à 0, la propriété de la fenêtre de couverture ne fait pas de différence.
Les tests effectués dans différents environnements montrent que le problème n'apparaît que dans SFSafariView et que l'application safari d'origine n'est pas infectée. Et il apparaît uniquement sur l'iPhone avec l'encoche en mode portrait lorsque l'utilisateur enrichit la fin de la page et fait défiler à nouveau. Donc, la page doit monter et la barre de navigation réapparaît automatiquement et un conflit va se produire.
iPhone 8 - Bas de la page - Portrait (OK)
iPhone XR - Bas de la page - Portrait (NON OK)
iPhone XR - Bas de la page - Portrait (OK)
iPad Pro 9.7 - Bas de la page - Paysage (OK)
Dans certains cas, il peut ne pas s'agir du bogue de SFSafaryViewController
.
SFSafaryViewController
, introduisez-leur les éléments suivants:Par conséquent, pour résoudre ce problème, Apple a implémenté la nouvelle safe-area-inset, un ensemble prédéfini de 4 constantes et une nouvelle fonction CSS appelée constant()
. Les constantes prédéfinies pour la zone de sécurité sont les suivantes: safe-area-inset-top
, safe-area-inset-right
, safe-area-inset-bottom
et save-area-inset-left
. Lorsque vous combinez ces quatre constantes, vous pouvez référencer la taille actuelle de l'encart de la zone de sécurité de chaque côté. La constant()
fonctionne partout où une var()
fonctionne.
Il existe de nombreux sites qui vous expliquent comment adopter une page Web sur iPhone X. En voici un .
Peut-être pourraient-ils essayer de placer la div en dehors de la partie déroulante et régler la position. Donc, si vous avez un code où il défile:
<div id="scroll-container">
<div id="scrollable">
</div>
<div>
Tels que n'importe quel élément du conteneur div scroll, il défilera.
S'ils le placent en dehors de la partie déroulante:
<div id="scroll-container">
<div>
<div id="not-scrollable">
</div>
et mettez position:fixed
; ou position:absolute
; ou position: sticky
ou device-fixed
; ou etc. dans le fichier CSS pour #not-scrollable
, il ne devrait pas défiler.
Ainsi, si vous n'avez pas accès aux développeurs frontaux du site que vous souhaitez incorporer dans la SFSafaryViewController
, essayez ce qui suit (Non recommandé):
safaryViewController.configuration.barCollapsingEnabled = false
WKWebView
en plein écran avec le contrôleur au lieu de SFSafaryViewController.Note (Pour ceux qui jouent avec la barre d'outils)
Que faire si vous remplacez la prefersStatusBarHidden
comme ci-dessous?
override func prefersStatusBarHidden() -> Bool {
return true
}
Et vous voudrez peut-être ajouter un bouton de rechargement manuellement :-(