0

我升级到 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 模拟器上运行时,在我的调试日志中,我看到抛出如下异常:

-[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;

抛出的异常(以及随后的崩溃)发生在第一次调用 setMimimumZoomScale 时出现上述消息。

我猜 Xcode 4.5 正在使用 setMinimumZoomScale 的代码调用发送该消息,该消息可能存在于 iOS 6 的库中,但在 iOS 5 中从未出现过。

其他人是否看到类似的问题?

fwiw,我没有碰过我的 .storyboard 文件,所以它们仍然可以在没有 autoLayout 的情况下工作。

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

4

1 回答 1

2

回答我自己的问题……</p>

我最初的问题的复杂性涉及额外的手势识别器。

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

在 iOS 6.0 SDK 下,显然不再真正支持这种行为。相关文档并没有明确禁止该行为,因为它确实定义了 UIScrollView 将对可能与平移和捏合相关或不相关的触摸执行什么操作。

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

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

(在我的情况下,为了做到这一点,我必须使用addGestureRecognizer:我感兴趣的每个手势识别器手动添加它们,因为内容视图用于在情节提要时不知道的图像。)

于 2012-10-02T00:54:00.420 回答