UIScrollView图像/照片查看器,启用了分页和缩放功能

Mik*_*ler 55 iphone uiscrollview ios

好吧,我认为现在是时候在互联网上找到这个问题的正式位置:如何UIScrollView使用分页和缩放制作一个photoviewer.欢迎UIScrollView黑客同行.

UIScrollView启用了分页功能,而且我显示UIImageViews的内置照片应用程序.(这听起来很熟悉吗?)

我在github上找到了以下项目:

http://wiki.github.com/andreyvit/ScrollingMadness

其中显示了启用分页时如何在滚动视图中实现缩放.如果其他人尝试这一点,我实际上必须删除UIScrollView子类并使用本机类,否则它不起作用.我认为这是因为3.0 SDK中的滚动视图截获触摸事件的变化.

因此,想法是在开始缩放时删除所有其他视图,并将当前视图移动到(0,0)scrollview,更新contentsize等等.然后当您缩放回1.0f时,它会添加其他视图并放置事情都恢复了顺序.

总之,该项目完全在模拟器,但在设备上还有所调整的观点,这看起来像它的事实引起我们正在改变的一些讨厌的运动contentsize/ offset等的观点被调整.您必须执行此视图移动,否则您可以向左平移其他视图留下的空白.

我在3.0 SDK发行说明的"已知问题"中找到了一个有趣的注释:

UIScrollView:缩放后,内容插入将被忽略,内容将保留在错误的位置.

这听起来就像这里发生的事情.放大后,视图将在屏幕外移动,因为您已更改了偏移等.

我已经花了好几个小时就已经花了好几个小时,我正在慢慢地意识到这不会起作用.

Three20的照片浏览器是不可能的:它太重了,并且有太多不必要的UI和其他行为.

内置的Photo应用程序似乎有些神奇.如果您放大图像并平移到远边,当前照片将独立于其旁边的照片移动,这不是您在使用标准时尝试使用的照片UIScrollView.

我见过有关嵌套的讨论,UIScrollView但我真的不想去那里.

有没有人用标准管理这个UIScrollView(并在2.2和3.0 SDK中工作)?我不喜欢滚动我自己的缩放+反弹+平移+分页代码.

Jon*_*nah 43

UPDATE

由于以下新闻,我删除了之前的答案...

那些没有听过的人的重大新闻.Apple已向iphone开发者计划的所有成员发布了2010 WWDC会话视频.讨论的主题之一是他们如何创建照片应用程序!他们逐步构建一个非常相似的应用程序,并使所有代码免费提供.

它也不使用私有api.这是示例代码下载的链接.您可能需要登录才能获得访问权限.

检查一下

并且,这是iTunes WWDC页面的链接:

检查一下

  • 对于那些不想搜索所有会话和示例代码的人,您正在寻找会话104,使用滚动视图设计应用程序. (20认同)
  • 我刚看完会话视频并查看示例代码,这真的很棒.我的一个抱怨:​​使用"CATiledLayer"获得出色性能和低内存使用的最终目标需要将图像预处理到图块中.充其量,这可能非常不方便. (3认同)
  • 我同意.显然,他们为照片应用找到了解决方法.它可以动态地对图像进行平铺,也可以采用其他方式处理大图像. (2认同)

Mic*_*all 32

我写了一个简单易用的照片浏览器,名为MWPhotoBrowser.我决定创建它,因为Three20太沉重/臃肿,因为我需要的只是一个照片查看器.

MWPhotoBrowser可以通过提供UIImage对象或URL到文件,Web图像或库资源来显示一个或多个图像.照片浏览器可以无缝地处理来自网络的照片下载和缓存.可以缩放和平移照片,并可以显示可选(可自定义)的标题.浏览器还可用于允许用户使用网格或主图像视图选择一个或多个照片.

MWPhotoBrowser截图

  • 我没有什么可说的,但感谢所有选择与大家分享你伟大工作的优秀开发人员.太感谢了! (2认同)

del*_*any 19

你说你已经看过嵌套UIScrollViews的讨论,但不想去那里 - 但这是要走的路!它工作轻松而且很好.

它本质上是Apple在其PhotoScroller示例中所做的事情(以及与Jonah的答案相关联的2010 WWDC演讲).仅在这些示例中,他们添加了一大堆复杂的平铺和其他内存管理.如果您不需要平铺等,并且如果您不想浏览这些示例并尝试删除与其相关的位,则嵌套UIScrollViews的基本原则实际上非常简单:

  • 创建一个外部UIScrollView并设置其pagingEnabled = true.将其添加到主视图中,并将其宽度和高度设置为主视图的宽度和高度.

  • 根据需要创建尽可能多的内部UIScrollViews.将它们的宽度和高度设置为主视图的宽度和高度.将它们作为子视图添加到外部UIScrollView,每个从左到右依次插入到另一个UIScrollView中.

  • 将外部UIScrollView的内容大小并排设置为所有内部UIScrollViews的宽度总和(等于[主视图的宽度]*[图像数]).

  • 将图像的UIImageViews添加到内部UIScrollViews,每个内部UIScrollView都有一个UIImageView.将每个UIScrollView的内容大小设置为每个UIImageView的大小.

  • 为每个内部UIScrollView设置最小和最大缩放比例,并将每个内部UIScrollView的委托设置为View Controller.在委托的viewForZoomingInScrollView中,为传递的UIScrollView返回相应的UIImageView.(为此,只需将每个UIImageViews保存在NSArray中,并将相应的UIScrollView的标记属性设置为相应UIImageView的索引.然后,您可以读取传递给viewForZoomingInScrollView的UIScrollView中的标记,并从NSArray返回相应的UIImageView) .

而已.像照片应用程序一样工作.

如果你有很多照片,为了节省内存你可以有两个内部UIScrollViews和两个UIImagesViews.然后,您可以在它们之间动态切换,在外部UIScrollView中移动它们的位置,并在用户滚动外部UIScrollView时更改它们的图像.它有点复杂,但原理相同.


slf*_*slf 6

我做了一些玩本机照片应用程序,我想我可以放心地说他们正在使用单个UIScrollView.赠品是这样的:放大图像,然后向左或向右拉.您将看到下一张或上一张照片.如果你足够努力,它甚至会以1.0f变焦页面翻到下一张照片.向后翻转,之前放大的照片也将恢复到1.0f变焦.

很明显我没有写过Photos.app,但我会猜测他们是如何做到的:

  • 单个UIScrollView和单个UIScrollViewDelegate
  • 使用UIImageView子项填充UIScrollView
  • 听着 scrollViewDidScroll:
  • 做一些数学计算,找出你目前在哪个页面
  • 听着 viewForZoomingInScrollView:
  • 根据页面索引返回不同的视图
  • scrollViewDidEndZooming:withView:atScale:根据内容监听并选择性地进行一些抗锯齿等操作

如果您决定尝试一下,请告诉我它是如何工作的.我很想知道你最终是如何让这个工作的.更好的是,发布到github.