Symptôme rapporté par Sylvain 2026-05-18 : sur toutes les pages, quand on scroll vers le bas et qu'on arrive en fin de page, la bottom tab bar (#bottom-tabs en position: fixed) "remonte" visuellement avec le rebond élastique iOS. Cause : WKWebView UIScrollView a `bounces = true` par défaut. Pendant le rebond élastique en fin de scroll, le viewport iOS bouge et les éléments position:fixed suivent visuellement le rebond pour quelques millisecondes — donnant l'impression que la nav bar n'est pas vraiment fixe. Fix natif Swift (doc Apple-recommandée pour ce cas) : - webView.scrollView.bounces = false - webView.scrollView.alwaysBounceVertical = false - webView.scrollView.alwaysBounceHorizontal = false Plus fiable que le hack JS preventDefault touchmove existant dans _layout.html (qui restera comme fallback web pur). Bump build requis côté Mac avant rebuild TestFlight.
54 lines
2.6 KiB
Swift
54 lines
2.6 KiB
Swift
// MainViewController.swift
|
|
// Sous-classe de CAPBridgeViewController pour enregistrer manuellement les
|
|
// plugins Capacitor in-app (i.e. plugins définis directement dans le target
|
|
// App, pas en npm package). Capacitor 8 n'auto-découvre pas ces plugins,
|
|
// faut les registrer ici dans capacitorDidLoad().
|
|
|
|
import UIKit
|
|
import Capacitor
|
|
|
|
class MainViewController: CAPBridgeViewController {
|
|
override func capacitorDidLoad() {
|
|
// Plugin natif WorkoutKit — pousse des workouts intervalles vers
|
|
// l'Apple Watch (cf. CoachWorkoutKit.swift).
|
|
bridge?.registerPluginInstance(CoachWorkoutKitPlugin())
|
|
// Plugin natif route GPS HealthKit — récupère la trace des workouts
|
|
// Apple Watch (HKWorkoutRouteQuery, cf. CoachHealthRoute.swift).
|
|
bridge?.registerPluginInstance(CoachHealthRoutePlugin())
|
|
// Plugin natif observer HealthKit — détecte fin de séance Watch et
|
|
// push notif locale "🎉 Séance terminée" (cf. CoachWorkoutObserver.swift).
|
|
bridge?.registerPluginInstance(CoachWorkoutObserverPlugin())
|
|
}
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
// Force le background noir sur tous les niveaux pour éliminer la
|
|
// bande blanche du bounce iOS WKWebView (cause : scrollView.backgroundColor
|
|
// par défaut blanc, exposé lors de l'overscroll). Aucun CSS web ne peut
|
|
// modifier ça — il FAUT le faire côté natif.
|
|
view.backgroundColor = .black
|
|
webView?.isOpaque = false
|
|
webView?.backgroundColor = .black
|
|
webView?.scrollView.backgroundColor = .black
|
|
|
|
// Permet l'inspection de la WKWebView depuis Safari Web Inspector
|
|
// (Mac : menu Développement → iPhone → coach.hypnotruck.ch) y compris
|
|
// pour les builds TestFlight. iOS 16.4+ requis. Sans ça, l'app
|
|
// n'apparaît pas dans la liste des cibles inspectables.
|
|
if #available(iOS 16.4, *) {
|
|
webView?.isInspectable = true
|
|
}
|
|
|
|
// Désactive le rebond élastique iOS du WKWebView (en haut + en bas).
|
|
// Sans ça, quand l'user arrive en bas/haut de page et continue à
|
|
// swiper, le contenu rebondit visuellement → les éléments
|
|
// `position: fixed` (notre bottom tab bar #bottom-tabs) suivent
|
|
// le rebond et semblent "remonter" hors de l'écran momentanément.
|
|
// Solution Apple-recommandée pour app Capacitor : désactiver bounces
|
|
// au niveau UIScrollView native (plus fiable que preventDefault JS).
|
|
webView?.scrollView.bounces = false
|
|
webView?.scrollView.alwaysBounceVertical = false
|
|
webView?.scrollView.alwaysBounceHorizontal = false
|
|
}
|
|
}
|