Files
coach-ios/ios/App/App/MainViewController.swift
Sylvain Bettinelli 8134b843f7 fix(ui): désactive bounce iOS WKWebView (bottom tab bar semblait remonter)
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.
2026-05-18 14:42:57 +00:00

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
}
}