如何在Firemonkey iOS/Android应用中禁用TWebBrowser控件的滚动功能?
FireMonkey iOS/Android 禁用TWebBrowser滚动及触摸操作方案
我刚好折腾过类似需求,给你分享几个可行的实现方式,分iOS和Android平台来处理——毕竟FireMonkey的跨平台控件底层逻辑不太一样:
iOS平台实现思路
iOS上TWebBrowser底层是UIWebView(或新版本的WKWebView),有两种方式可以实现完全静态的效果:
- 方案一:JavaScript注入(简单易上手)
等页面加载完成后,注入JS代码直接从网页层面禁用滚动和触摸响应:
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject); begin WebBrowser1.EvaluateJavaScript( 'document.body.style.overflow = "hidden"; ' + 'document.addEventListener("touchstart", function(e){e.preventDefault();}, {passive: false}); ' + 'document.addEventListener("touchmove", function(e){e.preventDefault();}, {passive: false});' ); end;
这种方式适合加载静态页面的场景,不需要操作原生控件,兼容性也不错。
- 方案二:直接操作原生控件(彻底禁用)
如果JS注入不够彻底,你可以直接获取iOS原生的WebView实例,禁用它的滚动和交互:
uses FMX.WebBrowser.iOS, iOSapi.UIKit, Macapi.ObjectiveC; procedure DisableWebBrowserScroll(WebBrowser: TWebBrowser); var LWebView: UIWebView; begin if WebBrowser.Handle <> nil then begin LWebView := TUIWebView.Wrap(TWebBrowseriOS(WebBrowser).GetWebView); LWebView.scrollView.setScrollEnabled(False); LWebView.scrollView.setUserInteractionEnabled(False); // 完全屏蔽所有触摸操作 end; end;
记得在WebBrowser1DidFinishLoad事件里调用这个方法,如果你的Delphi版本用的是WKWebView,只需要把UIWebView换成WKWebView,核心逻辑都是找到scrollView然后禁用相关属性。
Android平台实现思路
Android上TWebBrowser底层是android.webkit.WebView,同样有两种方案:
- 方案一:JavaScript注入(和iOS通用)
和iOS端逻辑一致,页面加载完成后注入相同的JS代码即可:
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject); begin WebBrowser1.EvaluateJavaScript( 'document.body.style.overflow = "hidden"; ' + 'document.addEventListener("touchstart", function(e){e.preventDefault();}, {passive: false}); ' + 'document.addEventListener("touchmove", function(e){e.preventDefault();}, {passive: false});' ); end;
- 方案二:操作原生WebView(彻底拦截触摸)
通过获取Android原生WebView实例,禁用滚动条并拦截所有触摸事件:
uses FMX.WebBrowser.Android, Androidapi.JNI.WebKit, Androidapi.JNI.GraphicsContentViewText; procedure DisableWebBrowserScroll(WebBrowser: TWebBrowser); var LWebView: JWebView; begin if WebBrowser.Handle <> nil then begin LWebView := TWebBrowserAndroid(WebBrowser).WebView; // 禁用垂直/水平滚动条 LWebView.setVerticalScrollBarEnabled(False); LWebView.setHorizontalScrollBarEnabled(False); // 拦截所有触摸事件,让WebView不响应任何触摸操作 LWebView.setOnTouchListener(TJOnTouchListener.Wrap( TAnonymousMethod.Create(function(v: JView; e: JMotionEvent): Boolean begin Result := True; end) )); end; end;
通用注意事项
- 所有操作都要在
WebBrowser1DidFinishLoad事件中执行,只有页面加载完成后,JS注入或原生控件操作才能生效。 - 如果加载的是本地HTML文件,你可以直接在HTML里提前写好禁用代码,这样更省心:
<style> body { overflow: hidden; } </style> <script> document.addEventListener("touchstart", e => e.preventDefault(), {passive: false}); document.addEventListener("touchmove", e => e.preventDefault(), {passive: false}); </script>
内容的提问来源于stack exchange,提问作者Mahmoud
相关产品推荐
相关产品推荐

