为什么UIWebView不能放在UIScrollView中?

问题

有没有人知道在iOS上滚动视图中避免Web视图的技术原因 (假设您愿意在Web视图中禁用滚动视图)?

如果您查看UIWebView的Apple文档 ,他们会说:

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

我的受过教育的猜测

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

但是,有一个非常有效的理由想要将UIWebView放在滚动视图中。 Web视图不仅仅是滚动视图。 UIWebView可以轻松显示各种Web内容。

如果不需要允许 UIWebView 内部滚动,并且您使用以下任一方式关闭滚动:

 webView.userInteractionEnabled = NO; 

要么

 webView.scrollView.scrollEnabled = NO; 

那么这个设计真的有问题吗?

我想知道这是否部分是原始UIWebView界面的工件,它没有给你直接(和记录)访问其嵌入式UIScrollView (以便能够轻松地禁用其滚动)。 也许Apple文档中的这句话是遗产吗?

项目背景

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

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

唯一的原因是Apple不建议将UIWebViews放在UIScrollViews如果你解释的那个:因为滚动会冒两个滚动视图混淆的风险。

我猜他们写这个是因为UIWebViewinheritance了UIView而不是UIScrollView ,因此它不是一个scrollview本身(但嵌入了一个),对于未经validation的用户来说,这可能并不明显,Web内容可以滚动,具体取决于HTML,如果有的话会搞乱容器scrollview。 所以这可能只是这个案例的提醒。

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

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

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

UIWebViews在滚动时似乎不会运行任何JavaScript。 我的JavaScript动画内容在Web视图滚动时被冻结,并在滚动结束后继续停止。

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

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