具有多个缩放级别的 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 捕捉缩放?

如何在我的应用重新启动时动态恢复 UIScrollView 的缩放级别和位置?

在 UIScrollView 中同时缩放多个对象

如何在 UIScrollView 中捏缩放多个 UIImageView

UIScrollView的缩放原理