如何选择正确的视图来缩放视图中的多个 UIScrollView 对象(iPhoneSDK obj-C)?

Posted

技术标签:

【中文标题】如何选择正确的视图来缩放视图中的多个 UIScrollView 对象(iPhoneSDK obj-C)?【英文标题】:How do I choose the correct view for zooming with multiple UIScrollView objects in a view (iPhoneSDK obj-C)? 【发布时间】:2009-09-02 07:09:44 【问题描述】:

我添加了几个 UIScrollViews 作为单个 UIView 的子视图,并设置了框架,以便每个都清晰可见。我将 scrollEnabled 设置为 YES 并将 contentSize 设置为大于边界/框架。我在 for 循环中执行此操作,并且每次循环通过时,我都会释放 UIScrollView(尽管该对象仍被存储,因为它已被细分到 UIView 中)。这对于能够滚动存储在每个特定 UIScrollView 中的 imageView 非常有效,但我无法终生弄清楚如何让缩放工作。我在界面中包含了。以下是我尝试选择正确缩放视图的方法:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    return [[myView subviews] objectAtIndex:pageNum];

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    return [myView viewWithTag:pageNum];

似乎都不起作用。奇怪的是滚动效果很好。如果我进行 NSLog 调用,我什至根本无法调用 viewForZooming 方法。有任何想法吗?我想我已经因为对此感到沮丧而失去了所有的头发。

编辑:非常感谢 cduhn!我所需要的只是那个小颠簸,我忘记将scrollView委托设置为self ...我已经使用了几个月来利用UIScrollView的各种应用程序,并且一直在正确使用委托,而我最近没有使用不知道我的大脑去了哪里。

但是,您不需要覆盖 scrollViewDidEndZooming:withView:atScale:,无论缩放后如何,委托都会调用它。

此外,经过一番调整后,这也奏效了:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    return [[[myView viewWithTag:pageNum] subviews] objectAtIndex:0];

这只是调用 View 容器内的 scrollView,然后在其中获取 UIImage ......效果很好。

【问题讨论】:

【参考方案1】:

听起来您可能没有将 UIScrollViews 上的委托属性设置为指向实现 viewForZoomingInScrollView 的对象:

还要注意 UIScrollView 类参考中的这个 sn-p:

要使缩放和平移工作,代理必须同时实现 viewForZoomingInScrollView: 和 scrollViewDidEndZooming:withView:atScale:;另外,最大(maximumZoomScale)和最小(minimumZoomScale)缩放比例必须不同。

最后一句警告:访问 UIScrollView 的子视图时要小心。您的子视图并不孤单。 UIScrollView 添加自己的 UIImageViews 作为自己的子视图来实现其滚动条 UI。所以像这样的代码......

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    return [[myView subviews] objectAtIndex:pageNum]; 

... 可能无法达到您的预期。

【讨论】:

以上是关于如何选择正确的视图来缩放视图中的多个 UIScrollView 对象(iPhoneSDK obj-C)?的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图缩放问题

从 Vuejs 中的多个 Treeview 组件中选择数据

使用图像无法正确缩放的绘制视图缩放:Android

如何根据集合视图中的单元格选择来控制表格视图的内容?

iPhone:如何在捏缩放uiscrollview时重绘子视图

除非在情节提要中设置设备,否则视图无法正确缩放(视图为:iphone 5s/8/etc)