使用iOS 6.0 SDK并为iOS 5构build目标导致UIScrollView setMinimumZoomScale在iOS 5模拟器上运行时失败

我升级到Xcode 4.5,并开始使用iOS SDK 6.0: 在这里输入图像说明

我有一个与Xcode 4.4和iOS SDK 5.1开发的通用应用程序

在这里输入图像说明

它已经在所有的设备和模拟器上运行,没有任何毛刺。

希望能继续在iPhone 5上工作,我想提供适当的启动图像,让它运行。

该应用程序的许多部分工作没有变化,但其中的一部分不:我放在UIScrollView中的图像不能平移。 这一直以前工作,但不是在iOS 6模拟器。

但问题的真正症结所在:当我去iOS 5.0或iOS 5.1模拟器上运行时,在我的debugging日志中,我看到一个抛出的exception,如下所示:

-[NSKeyValueMethodSetter setMaximumNumberOfTouches:]: unrecognized selector sent to instance 0x6ddab20

堆栈爬网显示试图进行此调用的代码是UIScrollView setMinimumZoomScale

我的代码来调用setMimimumZoomScale如下:

  CGFloat widthScale = self.scrollView.bounds.size.width / self.image.size.width; CGFloat heightScale = self.scrollView.bounds.size.height / self.image.size.height; // just reset the zoom scales; leave center and everything else where possible self.scrollView.minimumZoomScale = MIN(1.0, MIN(widthScale, heightScale)); self.scrollView.maximumZoomScale = 4.0; 

抛出的exception(和随后的崩溃)发生在第一次调用setMimimumZoomScale时带有上面提到的信息。

我猜测,Xcode 4.5正在使用setMinimumZoomScale的代码来调用发送该消息,这可能存在于iOS 6的库,但从来没有在iOS 5中。

别人看到类似的问题?

fwiw,我还没有碰到我的.storyboard文件,所以他们仍然会被设置为无autoLayout工作。

是否必须返回并在Xcode 4.5旁边安装Xcode 4.4以便能够继续允许我的工作应用程序被维护?

回答我自己的问题

我原来的问题的复杂性涉及到额外的手势识别器。

在iOS 5.1 SDK(以及之前的版本)下,可以将手势识别器添加到UIScrollView,并且能够与内置在UIScrollView中的panGestureRecognizer和pinchGestureRecognizer一起使用。

在iOS 6.0 SDK下,这种行为显然不再被真正支持。 相关的文档没有太多的明确地禁止行为,因为它定义了什么UIScrollView将会做什么可能或可能不会涉及到泛和捏。

因为滚动视图没有滚动条,所以它必须知道触摸是否意味着滚动的意图,而不是意图跟踪内容中的子视图。 为了做出这个决定,它通过启动一个定时器暂时拦截一个触发事件,在定时器触发之前,看看触摸手指是否有任何移动。 如果定时器在没有显着位置变化的情况下触发,则滚动视图将追踪事件发送到所触摸的内容视图的子视图。 如果用户在计时器过去之前拖动手指足够远,则滚动视图取消子视图中的任何跟踪,并执行滚动本身。 子类可以覆盖touchesShouldBegin:withEvent:inContentView:,pagingEnabled和touchesShouldCancelInContentView:方法(由滚动视图调用)来影响滚动视图如何处理滚动手势。

为了纠正这个问题,我必须确保故事板中的手势识别器不再是与scrollview相关联的集合的一部分,而是将它们与scrollview的内容视图相关联。

(在我的情况下,为了做到这一点,我不得不手动添加他们使用addGestureRecognizer:我感兴趣的每个手势识别器,因为内容视图是在故事板时间不知道的图像。