42 votes

Correction de la disparition de l'en-tête lors du défilement vers le bas dans la vue web dans iOS 11

J'ai une application iOS native avec une vue web pour afficher le contenu web. J'ai un en-tête fixe dans mon application avec les propriétés suivantes :

#header {
    height: 60px;
    background-color: @mainColor;
    color: #ffffff;
    padding: 10px;
    text-align: center;
    position: fixed;
    width: 100%;
    z-index: 1;
}

Avant la mise à niveau vers iOS 11, tout fonctionnait bien. Maintenant, lorsque je fais défiler la page vers le bas/vers le haut, l'en-tête disparaît pendant le défilement, et lorsque le défilement est terminé, l'en-tête réapparaît.

Ceci peut également être reproduit dans Xcode 8.

1 votes

Peut-être en définissant top: 0px; left: 0px; aide ?

0 votes

@abarax : J'ai peur de cela n'ont pas de solution si continuer à utiliser position: fixed . Recommander l'utilisation position : absolue

0 votes

@Bergerova vérifiez ma réponse éditée ce que la doc officielle d'Apple dit nous devrions utiliser WKWebView au lieu de UIWebView o WebView

16voto

iPatel Points 15121

Je suis juste en train d'écrire du code, essayez avec un par un

Extrait de la note officielle d'Apple :

Important :

À partir de iOS 8.0 et OS X 10.10, utilisez WKWebView pour ajouter du contenu web à votre application. N'utilisez pas UIWebView ou WebView.

Vous devriez donc essayer une fois avec WKWebView .

14voto

Paolo Forgia Points 4437

position: fixed a toujours a été a problème avec iOS. Il semble que dans chaque version d'iOS, le problème persiste. Maintenant, je n'ai rien trouvé concernant le changement de comportement de votre application de iOS 10 à 11, vous pourriez considérer signaler ce problème comme un bogue d'autre part, ayant vu les multitudes de personnes qui ont rencontré ce problème et le fait qu'il affecte plus ou moins les personnes qui en ont besoin. tous les dernières versions d'iOS, je vous conseille de ne pas utiliser position: fixed .

La solution de contournement la plus courante est transform: translateZ(0) cela ne fonctionne pas seulement sur iOS et empêche toute éventuelle scintillement En outre, il oblige le navigateur à utiliser l'accélération matérielle pour accéder au GPU. faire voler les pixels . Il devrait également fonctionner sans le préfixe -webkit- à partir d'iOS 9.

1 votes

J'ai essayé d'utiliser transform : translateZ(0), mais cela ne résout pas le problème.

2 votes

Ne fonctionne pas non plus dans mon cas :( et cet élément est position : relative ;

4 votes

Apparemment cette solution a fonctionné jusqu'à iOS 11, lorsque j'aurai trouvé une solution je mettrai à jour cette réponse. Merci pour les commentaires

6voto

calle Points 733

J'ai eu ce problème très similaire avec un projet Cordova construit pour iOS, qui utilise une webview. Cordova utilise UIWebView par défaut comme moteur de webview et j'ai essayé toutes les solutions possibles mentionnées dans ce fil de discussion et bien d'autres. Finalement, notre seule solution a été de changer le moteur de webview de UIWebView à WKWebView ( https://developer.apple.com/documentation/webkit/wkwebview ). Avec Cordova, l'introduction du WKWebView est assez simple avec un plugin https://github.com/apache/cordova-plugin-wkwebview-engine

Après avoir introduit WKWebView et traité certains des problèmes qu'il cause, nous ne rencontrons plus le scintillement ou la disparition des éléments positionnés de manière fixe lors du défilement dans iOS 11.

0 votes

Cela a réglé le problème pour moi aussi. Mais ça casse d'autres trucs, comme le téléchargement et l'accès aux fichiers. Comment cela n'est-il pas un problème plus important ? Cordova est pratiquement inutilisable pour la dernière version d'iOS ?

0 votes

Cela n'a pas fonctionné pour moi, mon angulaire ne s'est pas chargé, j'ai juste un écran vide.

0 votes

Cette réponse fonctionne en fait pour moi. Je ne suis pas sûr qu'il soit approprié de récompenser le bounty pour elle cependant, car elle ne résout pas le problème avec le UIWebView standard. Cependant, si nous respectons la date limite, cette réponse pourrait être celle qui sera récompensée.

6voto

Dilip Points 44

Nous avons eu le même problème et il a été résolu avec les 2 plugins suivants

https://github.com/apache/cordova-plugin-wkwebview-engine https://github.com/TheMattRay/cordova-plugin-wkwebviewxhrfix

Le premier plugin changera le WebView par défaut en WKWebView et le deuxième plugin fournira une correction pour le problème CORS que nous voyons en utilisant WKWebView.

0 votes

Ça a parfaitement fonctionné pour moi ! En fait, l'événement a amélioré la convivialité de mon application avec ce moteur wkwebview... Merci beaucoup ! !!

0 votes

Cela a parfaitement fonctionné. Je dois encore tester l'application complètement avec WKWebView. Important : Note importante : à partir de iOS 8.0 et OS X 10.10, utilisez WKWebView pour ajouter du contenu web à votre application. N'utilisez pas UIWebView ou WebView.

0 votes

Dilip, j'utilise phonegap build et le plugin du moteur est sur npm donc il s'installe. Mais comment j'installe le wkwebviewxhrfix ? Dois-je inclure le dossier src/ios dans mon projet ? Merci.

4voto

Dedering Points 373

L'astuce consiste à forcer l'accélération du GPU. Pour ce faire, ajoutez translate3d à la #header élément.

transform: translate3d(0,0,0);

Si des éléments imbriqués à l'intérieur du #header élément continuent de disparaître ajouter translate3d à eux aussi.

0 votes

J'ai essayé d'utiliser transform : translate3d(0,0,0), mais cela ne résout pas le problème.

0 votes

Que se passe-t-il si vous faites une demande translate3d(0,0,0) a #header * { et cibler également les éléments imbriqués ?

0 votes

Cela ne résout pas le problème pour moi non plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X