为什么UIWebView不能放在UIScrollView中?

时间:2012-10-13 00:59:24

标签: ios uiwebview uiscrollview uikit

问题

有没有人知道在iOS上滚动视图中避免网页浏览的技术原因(假设您愿意在网页视图中自动停止滚动)?

如果你看at the Apple docs for UIWebView,他们会说:

  

重要提示:您不应该嵌入UIWebView或UITableView对象   UIScrollView对象。如果这样做,可能会导致意外行为   因为两个对象的触摸事件可能混淆错误   处理。

我的受过教育的猜测

看起来他们可能会警告你不要在另一个滚动视图中放置滚动视图,因为内部和外部滚动视图之间的触摸可能会混淆。

但是,有一个非常合理的理由想要在滚动视图中放置UIWebView。 Web视图不是只是滚动视图。 UIWebView可以轻松展示各种网络内容。

如果不需要允许在UIWebView本身内滚动,则可以使用以下任一方式滚动滚动:

webView.userInteractionEnabled = NO;

webView.scrollView.scrollEnabled = NO;
那么这个设计真的有问题吗?

我想知道这是否部分是原始UIWebView界面的工件,它没有将direct (and documented) access提供给其嵌入式UIScrollView(以便能够禁用其滚动容易)。也许Apple文档中的这个陈述是遗产吗?

项目背景

我问,因为我正在维护一个应用程序(由其他人编写),它在滚动视图中使用少量Web视图,允许在它们之间水平滚动。 Web内容必须被视为已修复(不可更改),并且每个HTML页面仅显示一页内容。用户需要能够在页面之间滚动,因此选择了UIWebViews内的多个UIScrollView。到目前为止,似乎可能正常工作。

然而,页面显示全屏图像,滚动性能是一个问题。但是,我正在尝试确定滚动视图中的Web视图的基本嵌套(Apple警告说)是否真的是问题的一部分。

2 个答案:

答案 0 :(得分:19)

如果对于您解释的那个,Apple不建议将UIWebViews置于UIScrollViews内,这是唯一的原因:因为滚动可能会在两个滚动视图之间混淆。

我猜他们写这个是因为UIWebView继承了UIView而不是UIScrollView,因此不是滚动视图本身(但是嵌入了一个),这可能不是对于未经实验的用户来说显而易见的是,Web内容可以根据HTML进行滚动,如果有的话,这会弄乱容器滚动视图。所以这可能只是提醒这个案例。

但是如果你禁用滚动,我看不出有什么理由会出错。

请注意,在滚动视图上禁用用户交互与禁用滚动不同。如果您的HTML内容包含链接或其他可点击/可点击的内容,则禁用用户交互也会禁用它们。要仅停用滚动但仅保持用户互动(如简单点按),请使用webview.scrollView.scrollEnabled = NO代替webview.scrollView.userInteractionEnabled = NO

答案 1 :(得分:1)

我至少遇到过另一个原因:

UIWebViews出现而非以在滚动时运行任何JavaScript。我的JavaScript动画内容在Web视图滚动时被冻结,并在滚动结束后继续停止。

据推测,这是一次性能优化。现在,当我们滚动包含Web视图的滚动视图时,Web视图不知道它们正在移动,因此不会暂停它们的JavaScript。

当然,问题在于它是否会以显着的方式影响性能,以及iPad型号。