为什么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
如果你解释的那个:因为滚动会冒两个滚动视图混淆的风险。
我猜他们写这个是因为UIWebView
inheritance了UIView
而不是UIScrollView
,因此它不是一个scrollview本身(但嵌入了一个),对于未经validation的用户来说,这可能并不明显,Web内容可以滚动,具体取决于HTML,如果有的话会搞乱容器scrollview。 所以这可能只是这个案例的提醒。
但是如果你禁用滚动,我看不出有什么理由会出错。
请注意,禁用滚动视图上的用户交互与禁用滚动不同。 如果您的HTML内容包含链接或其他可点击/可点击的内容,则禁用用户交互也会禁用它们。 要仅禁用滚动但保持用户交互,如简单的点击,请使用webview.scrollView.scrollEnabled = NO
而不是webview.scrollView.userInteractionEnabled = NO
。
我至少遇到过另一个原因:
UIWebViews在滚动时似乎不会运行任何JavaScript。 我的JavaScript动画内容在Web视图滚动时被冻结,并在滚动结束后继续停止。
据推测,这是性能优化。 现在,当我们滚动包含Web视图的滚动视图时,Web视图不会意识到它们正在移动,因此不会暂停其JavaScript。
当然,问题在于它是否会以显着的方式影响性能,以及iPad型号。