草庐IT

ios - 三层嵌套的UIScrollView分页问题

coder 2024-01-10 原文

背景故事

我有一个iPad应用程序,该应用程序需要允许用户浏览图像组。每个组都布置在其自己的垂直UIScrollView(分页)中,因此用户可以上下滑动以查看每个图像。每个组UIScrollViews放置在单个水平UIScrollView(也分页)中(应用程序中只有一个)。效果很好。...我可以上下滑动以查看一个组中的图像,然后向左或向右滑动以转到下一个或上一个组。

问题

当我需要为每个图像添加缩放时,问题就开始了。我通过将每个图像放在其自己的UIScrollView中来完成此操作。缩放图像后,我可以在图像周围平移;当到达缩放图像的顶部或底部时,组的垂直UIScrollView页面将按预期移至下一个或上一个图像。不幸的是,当图像缩放并且我平移到最左边或最右边时,外部水平滚动 View 将不会转到下一组。

有没有比三层嵌套的UIScrollViews更好(更正确)的方法,或者我可以以某种方式将触摸转发到外部水平滚动 View 吗?

任何帮助或建议,将不胜感激。

最佳答案

希望我还不晚,但我想我有解决您问题的方法。

在这里,您可以找到一个Xcode项目,该项目演示了您拥有的scrollview设置,您的问题和建议的解决方案:https://bitbucket.org/reydan/threescrollviews

基本上,解决方案是向垂直滚动 View 的contentSize.width添加1个像素。平移到缩放图像的边缘时,这将强制垂直滚动 View 稍微滚动。它会滚动一点,然后继续到下一个垂直滚动 View 。

如果下载项目,您将看到我已经在viewDidLoad方法中创建了一些滚动 View 。在这里,我创建了一个包含3个垂直滚动 View 的水平滚动 View ,每个垂直滚动 View 包含5张图像。实际上,每个图像都被封装在滚动 View 中以启用每个图像的缩放。总共...三重嵌套的滚动 View 。

我还留下了一些彩色的边框,以便我可以轻松地看到每个scrollview的滚动方式。

  • 洋红色=水平滚动 View
  • 白色=垂直滚动 View
  • 蓝色=图像滚动 View (包含图像并允许缩放的滚动 View )
  • 红色= UIImageView

  • 您将看到我已经用值10标记了每个图像滚动 View 。这用于- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView委托(delegate)方法的实现中,除非事件来自图像滚动 View 之一,否则我将返回nil

    如果您对项目有任何疑问,请随时提出。

    最后,,我想说这种浏览方法对我来说有点古怪,因为有时我会沿不需要的方向滚动。通常,我认为我垂直滑动手指只是发现滚动 View 向左或向右移动,因为它解释了我进行的一些微小的水平移动。

    我发现同时启用水平和垂直移动的分页时发现的问题是,滚动 View 是方向锁定的,或者在我看来。

    编辑:

    今天,我对这个问题进行了更多调查。这些是我的结论:
  • 缩放不是问题,而是最里面的滚动 View 中的内容大于可见区域的问题(您可以通过缩放或简单地初始化大于边界的内容大小来尝试此操作)。这样可以在最内部的滚动 View 中平移,并完全更改触摸事件的行为。
  • 滚动 View 标志的跳动会影响到平移(拖动)手势到达内容边缘时的行为。如果为bounces=false,那么您的平移手势将停止在边缘,不将拖动事件向上传递到链中(因此不会滚动父滚动 View 以向您显示其他图像)。如果为bounces=true,那么当您到达边缘并继续拖动时,事件将被转发到父滚动 View ,并且该滚动 View 也将被拖动。但是,我发现弹跳时的拖动将拖动的距离减少了大约50%。 “照片”应用程序中也会发生这种情况。
  • 如果您在最里面的滚动 View 位于内容边缘时开始拖动,则该滚动 View 很聪明,并且会将所有事件转发到父滚动 View 。
  • 由于某种原因,三层嵌套的滚动 View 是有问题的,因为在平移到最内部的滚动 View 时,事件根本不会在最高和中间滚动 View 之间转发。我不知道为什么。

  • 我对内容大小使用+1像素的解决方案可以部分解决问题。

    编辑2013

    天哪,这些滚动 View 是这个世界之外的东西:(

    经过一年多的搜索(开个玩笑……实际上是2天),我认为我找到了一个很好的优雅解决方案,用于三层嵌套的滚动 View 。
    我在这里创建了一个测试项目:
    https://github.com/reydanro/TripleNestedScrollViews

    在应用程序内部,有一个开关,您可以使用该开关来测试是否有此修复程序。

    我在应用程序中使用的设置与此问题有所不同。我有1个垂直分页的scrollview。在它里面,我有多个水平的分页滚动 View 。
    在一些水平滚动 View 中,我还有另一个垂直页面滚动 View 。

    如果没有修复,一旦到达最内层滚动 View 的页面,由于垂直滚动手势不会转发到最外层滚动,您几乎就被卡在那里。

    修复是一个自定义UIGestureRecognizer,您需要将其添加到最内部的滚动 View 中。该识别器跟踪触摸事件,如果它检测到超出contentArea的拖动,则它将暂时禁用其余的滚动 View 的识别器。这是我发现的唯一使滚动 View 将事件向上推进链的方法

    手势识别器的代码非常粗糙,只有有限的自定义,但是应该可以完成工作。目前,我专注于开发的应用程序,但将继续更新存储库。

    PS:我还没有测试缩放会发生什么,但是我看不出为什么该方法不起作用(或适应于工作)的原因。

    关于ios - 三层嵌套的UIScrollView分页问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8229940/

    有关ios - 三层嵌套的UIScrollView分页问题的更多相关文章

    1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

      我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

    2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

      尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

    4. ruby - 将散列转换为嵌套散列 - 2

      这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

    5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

      我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

    6. ruby - Fast-stemmer 安装问题 - 2

      由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

    7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

      这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

    8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

      当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

    9. Ruby——嵌套类和子类是一回事吗? - 2

      下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

    10. ruby - 模块嵌套代码风格偏好 - 2

      我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

    随机推荐