具有多个缩放级别的 UIScrollView?
Posted
技术标签:
【中文标题】具有多个缩放级别的 UIScrollView?【英文标题】:UIScrollView with multiple zoom levels? 【发布时间】:2012-01-10 23:57:45 【问题描述】:有没有一种方法可以控制 UIScrollView 的哪些子视图被缩放,哪些不被缩放?
例如,我有一张地图作为底层(不是 MapKit,只是一个平面图像),可以缩放和平移。根据用户的选择,在地图上放置标记以指示特定的建筑物/地点等。这些标记也是 UIImageView,使用地图图像的像素坐标(例如,建筑物 X 位于 (934, 842),放置标记这里)。缩小但这些标记有点难以看到,因为它们也会缩放/缩小到与地图相同的水平。
那么有没有一种方法可以告诉 UIScrollView 不要缩放标记图像,但仍然允许它在地图图像缩放时平移/重新定位它们?
【问题讨论】:
【参考方案1】:我认为您可能正在寻找的方法是UIScrollViewDelegate
's
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
这使您可以返回要应用缩放的视图,在您的情况下,这将是背景地图图像。
如果您不想同时缩放标记,则需要将标记直接添加为UIScrollView
的子视图,而不是将它们添加为背景地图UIImageView
的子视图。
正如您提到的,标记相对于地图背景UIImageView
放置,这意味着如果您将标记添加到UIScrollView
,一旦您更改它们将不会放置在地图上的相同位置卷轴。
要解决这个问题,您需要计算相对于UIScrollView
的等效坐标。
虽然这看起来相当令人生畏,但一旦您知道缩放系数,这实际上是非常简单的。
要获取缩放系数,请使用UIScrollViewDelegate
方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
然后你可以通过调用获得缩放因子:
scrollView.zoomScale
并通过将此zoomScale
应用于原始值来重新计算标记坐标,并相应地重新定位标记。
参考:
UIScrollView Class Reference
UIScrollViewDelegate Protocol Reference
希望这会有所帮助:)
【讨论】:
当你这样说时,我几乎有点生气,我自己并没有意识到这一点。谢谢大家,我会试一试,看看我是否能让它们正确定位。 PS:我会赞成你的回答,但我还没有代表这样做:P 别担心 :) 希望你能成功!如果你这样做,你可以接受答案而不是赞成它;) 对,我了解获得正确比例坐标的数学原理,但我将如何强制它们在地图移动时重新定位?某种 onZoom -> moveMarkers 功能。 是的,例如,在 scrollViewDidZoom 中调用 moveMarkers 方法,这将在滚动视图停止缩放时重新定位所有标记以上是关于具有多个缩放级别的 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章
如果您的 UIScrollView 已经处于该缩放级别,则 zoomToRect 啥也不做
如何在我的应用重新启动时动态恢复 UIScrollView 的缩放级别和位置?