【发布时间】:2011-02-16 10:43:26
【问题描述】:
我有一个应用程序,可以在 UIWebView 中呈现本地 HTML 文件。但是,这些文件有时很大,并且使用默认滚动速度到达您想要的位置需要很长时间。有什么办法可以提高 UIWebView 的垂直滚动速度?
【问题讨论】:
标签: iphone cocoa-touch uiwebview scroll
我有一个应用程序,可以在 UIWebView 中呈现本地 HTML 文件。但是,这些文件有时很大,并且使用默认滚动速度到达您想要的位置需要很长时间。有什么办法可以提高 UIWebView 的垂直滚动速度?
【问题讨论】:
标签: iphone cocoa-touch uiwebview scroll
搜索 UIWebView 的 子视图,它响应 -setScrollDecelerationFactor:(它是 UIScroller - 一个私有类,它是 UIScrollView 的唯一子视图)。您会发现它采用了为公共 UIScrollView 类定义的相同减速因子:
- (void)webViewDidFinishLoad:(UIWebView *)aView {
id decelerator = [aView viewWithSelector:@selector(setScrollDecelerationFactor:)];
[decelerator setScrollDecelerationFactor:UIScrollViewDecelerationRateNormal];
}
注意我使用的方法viewWithSelector:是我在UIView的一个类别中定义的方法。想必以后如果 UIWebView 发生变化,我的搜索会返回 nil,这个方法就会变成 no-op。
【讨论】:
for (UIView* subView in self.currentScrollView.subviews) { if ([subView respondsToSelector:@selector(setScrollDecelerationFactor:)]) { [subView setScrollDecelerationFactor:UIScrollViewDecelerationRateNormal]; 但这种情况永远不会成立。有什么帮助吗?
是否考虑在您的 html 中的重要边界处添加 # 标签?
您实际上可以使用本机 UI 来实现书签或 ToC 以便于导航,或者直接在您的 html 中嵌入指向适当目标的链接。
如果您“加速滚动”,您的应用可能会因为不标准而被拒绝,因为这可能会使习惯于 web 视图滚动的用户与标准“感觉”混淆。
【讨论】:
找到 UIWebView 的一个子视图,它是一个 UIScrollView,然后将 decelerationRate 设置为 UIScrollViewDecelerationRateNormal。这使得 UIWebView 和普通 UIScrollView 一样快。
在 iOS 4/5 中,我们可以简单地使用 UIWebView 的最后一个子视图。
UIScrollView *scroll = [webView.subviews lastObject];
if ([scroll isKindOfClass:[UIScrollView class]]) {
scroll.decelerationRate = UIScrollViewDecelerationRateNormal;
}
UIWebView的UIScrollView默认decelerationRate是0.989324,而UIScrollViewDecelerationRateFast是0.99,UIScrollViewDecelerationRateNormal是0.998。
此方法不使用任何私有 API。
【讨论】:
在 iOS 5 中,我们可以访问 UIWebView 的 scrollView 属性。
如果你的目标是 iOS 5+,你可以简单地调用:
webView.scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;
【讨论】:
老问题,但即使在 2018 年,这些设置或技巧也确实帮助了我。
按照这些简单的编码技巧来提高 Android WebView 的性能:
WebView mWebView = new WebView(this);
WebSettings settings = mWebView.getSettings();
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(false);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setUseWideViewPort(true);
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView.setScrollbarFadingEnabled(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
【讨论】: