iPhone开发:在UIWebView中提高滚动速度?

时间:2010-05-06 15:03:21

标签: iphone cocoa-touch uiwebview scroll

我有一个应用程序,我在UIWebView中呈现本地HTML文件。但是,文件有时很大,并且使用默认滚动速度到达您想要的位置需要很长时间。有没有办法提高UIWebView的垂直滚动速度?

5 个答案:

答案 0 :(得分:23)

在iOS 5中,我们可以访问scrollView的{​​{1}}属性。

如果您的目标是iOS 5+,您只需致电:

UIWebView

答案 1 :(得分:7)

找到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。

答案 2 :(得分:2)

搜索响应 -setScrollDecelerationFactor:的UIWebView的子视图(它是UIScroller - 一个私有类,是UIScrollView的唯一子视图)。你会发现它需要为公共UIScrollView类定义相同的减速因子:

- (void)webViewDidFinishLoad:(UIWebView *)aView {
    id decelerator = [aView viewWithSelector:@selector(setScrollDecelerationFactor:)];
    [decelerator setScrollDecelerationFactor:UIScrollViewDecelerationRateNormal];
}

请注意,我正在使用 viewWithSelector:的方法是我在UIView类别中定义的方法。据推测,如果UIWebView将来发生变化,我的搜索将返回nil,这个方法将成为无操作。

答案 3 :(得分:0)

是否已考虑在重要边界的html中添加#标签?

您实际上可以使用原生用户界面来实现书签或ToC以便于导航,或者只是将链接嵌入到html中的相应目标。

如果你“加快滚动”,你的应用就有可能被拒绝为非标准,因为它可能会混淆那些习惯于使用标准“感觉”滚动网页浏览的用户。

答案 4 :(得分:0)

古老的问题,但即使在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);
}