将 UITouch 管理从 touchesBegan 切换到 UIScrollViewDelegate

Posted

技术标签:

【中文标题】将 UITouch 管理从 touchesBegan 切换到 UIScrollViewDelegate【英文标题】:Switch UITouch management from touchesBegan to UIScrollViewDelegate 【发布时间】:2018-09-19 13:34:44 【问题描述】:

我正在开发一个 ios 绘图应用程序,其主要功能是用户可以加载图像作为背景,然后他可以开始在其上绘制手指,缩放和平移图像,并在图像本身顶部绘制.

应用程序的架构如下。

MainUiView->UIScrollView->UIImageView

UIRespondertouchesBegantouchesMovedtouchesEnded 覆盖上管理手指的绘制和跟踪。

UIImageView 的缩放和平移由 UIScrollViewDelegate 实现管理。

我有一个按钮,可以通过以下方式将应用程序模式从绘图模式切换到缩放和平移模式:

如果你想画画:

    [scrollView setUserInteractionEnabled:NO];
    [imageView setUserInteractionEnabled:YES];

所以触摸是在touchesBegantouchesMovedtouchesEnded 方法中管理的。

如果您想用两根手指使用捏合缩放手势进行平移和缩放

[scrollView setUserInteractionEnabled:YES]; 
[imageView setUserInteractionEnabled:NO];

所以两个手指手势由UIScrollViewDelegate管理

现在我正在尝试改进应用程序,移除按钮以从绘制模式切换到缩放和平移模式。

我的想法是在touchesBegan 中跟踪两个手指的存在,然后在UIImageView 中禁用用户交互以启用滚动视图中的用户交互,但问题是这样做之后触摸仍然在touchesMoved 方法中管理,直到我将手指从屏幕上抬起之前,scrollViewDelegate 什么都不会出现,之后,如果我再次将手指放在屏幕上,一切都由scrollViewDelegate 管理。

总结一下:是否可以在touchesBegan 之后停止触摸循环并将其传播到ScrollViewDelegate

如果这不可能,我如何在UImageView 上实现缩放、平移和绘图功能?我应该删除滚动视图并尝试通过UIResponder 方法缩放和平移UImageView 吗?

感谢您的帮助

【问题讨论】:

看到你贴的代码,好像你用的是objc而不是swift,对吗? 在我使用 c# 的应用程序中,因为该应用程序是在 Xamarin.iOS 中制作的,但你是对的,我发布的代码是 objc。我将更新标签添加 objc ..我真的不介意我可以同时处理的代码。 【参考方案1】:

尝试更改您的实现以使用手势识别器而不是使用 UIResponder 方法的触摸处理。 这种方法的主要好处是:

你可以use UIPanGestureRecognizer for drawing,甚至创建一个 custom recogniser 您可以在识别器之间建立依赖关系,使用 requireGestureRecognizerToFail,甚至跨视图 您可以遍历视图上的所有识别器并仅禁用特定的手势集,而无需禁用整个视图的触摸 手势识别器具有与触摸相关的相同方法,您可以使用这些方法将触摸处理代码从当前实现移至手势

因此,您的图像视图将具有平移或自定义手势识别器,单点触摸,用于绘图,您可以循环滚动视图的识别器,并标记它们在触发“绘图”手势时不触发,使用requireGestureRecognizerToFail .

有了这个,您不需要启用/禁用任何视图上的用户交互,尽管您必须进行反复试验才能使所有手势正确地相互工作。

编码愉快:)

【讨论】:

感谢 Swapni,因此您建议不要使用 UIResponder 方法来使用 UIPanGestureRecognizer。我阅读了一些关于与UIPanGestureRecognizer 绘图相关的性能问题的帖子,您知道吗?无论如何再次感谢..我会尝试你的建议,我会在这里通知我的结果。

以上是关于将 UITouch 管理从 touchesBegan 切换到 UIScrollViewDelegate的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UITouch触摸API简介

从 UITouch 对象调用 UIGestureRecognizer

苹果触屏接口啥时候打开

如何从 - (void)touchesEnded:withEvent: 获取 UITouch 位置的 UIView 对象?

如何从 uiscrollview 中的点击位置获取 UITOUCH?

如何将 Obj-C 中的 UITouch 对象与 WebKit JavaScript 中的相应触摸对象匹配?