iOS Touch而不是touchDown?

Posted

技术标签:

【中文标题】iOS Touch而不是touchDown?【英文标题】:iOS Touch instead of touchDown? 【发布时间】:2013-01-05 17:36:49 【问题描述】:

我正在尝试在我正在制作的小型合成器键盘上设置一个触摸事件,但我只能将“触地”事件连接到我制作的按钮上。

如何在按钮上设置“触摸”?因此,假设有人按下一个键并用手指在其他按钮上滑动……您会期望其他键像钢琴一样在“触摸”上弹奏,对吗?不确定如何在 Interface Builder 中实现这一点。

任何帮助都会很棒 - 谢谢! 肖恩

【问题讨论】:

你所描述的本质上不是“触地”吗? 基本上 - 是的......但“触地”需要一触即发。如果您连续有 4 个按钮,并且您按下第一个在技术上是唯一“按下”的按钮,那么当您将手指滑过其他按钮时……它们不会被触发。有意义吗? 所以你想在钢琴上演奏“glissando”,对吧?现在这是另一种情况。 (我正在使用手套,否则会很痛 - 技术不好,我知道......)好吧,关于主题:我会说你最好在没有按钮的情况下绘制钢琴,并检测到滑动的移动具有透明覆盖视图的手指。这是一个合理的解决方案吗? Hrmm - 如果界面生成器无法做到这一点,还有很好的教程?我想不出我会怎么做... 使用UISwipeGestureRecognizerUIPanGestureRecognizer或简单地继承UIView并实现touchedMoved:withEvent:(等)方法。 【参考方案1】:

您需要连接的不仅仅是 touchDown 事件。为了实现你想要的,你不仅需要通过“down”事件来监听最初的触摸,还需要让你的应用知道“move”和“touch up”事件,这样你可以适当地响应用户移动他们的手指。更进一步,例如,通过将所有代码放在按钮子类中来尝试使每个按钮独立响应这些动作是很困难的。

相反,您需要创建一个可以同时查看所有按钮的单点代码,接收用户正在进行的触摸,并根据这些触摸做出要做什么的决定。这将是包含所有按钮的视图控制器的任务。

在这个视图控制器中,您可以使用touchesBegan:touchesMoved:touchesEnded: 方法。然后,您应该使用点击测试来检查触摸在哪些按钮上。查看convertPoint:hitTest:withEvent:pointInside:withEvent: 对按钮执行测试。

基本上在这些触摸方法中,您将跟踪何时按下touchDown: 中的新按钮,何时触摸移动到touchesMoved: 中的新按钮,以及触摸刚刚来自哪个按钮,以及何时用户在touchesEnded: 中停止触摸。通过将所有这些放在一起,您可以编写代码来跟踪每个手指的移动、其上方的按钮以及何时播放这些按钮的声音。

再次,我建议不要尝试将所有代码放在按钮操作的单个触摸处理程序中。相反,请使用您的视图控制器来一次管理所有按钮之间的触摸。

希望这会有所帮助。

【讨论】:

【参考方案2】:

查看UIControl Class Reference - UIControlEvents。

您正在寻找UIControlEventTouchDown

//For example:
UIButton *myButon = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButon addTarget:self action:@selector(methodName) forControlEvents:UIControlEventTouchDown];

【讨论】:

基本上 - 是的......但是“触地”需要先触摸一下。如果您连续有 4 个按钮,并且您按下第一个在技术上是唯一“按下”的按钮,那么当您将手指滑过其他按钮时……它们不会被触发。有道理? dailymotion.com/video/…(观看@0:17)【参考方案3】:

您想查看 ios 事件

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/EventsiPhoneOS/EventsiPhoneOS.html

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006779-RH2-SW65

听起来您想要UIControlEventTouchDown,它会在您当前按下按钮或区域时播放。 相反,您可以使用UIControlEventTouchUpInside,它会在您抬起按钮或区域时播放。

类似[results addTarget:self action:@selector(playSound) forControlEvents:UIControlEventTouchUpInside];

假设每次触摸都有相应的向下和向上动作。

如果您正在寻找诸如在钢琴上抚摸双手之类的东西,您可以尝试使用平移手势并跟踪滑动的位置。

【讨论】:

我不认为 UIControlEventTouchDownInside 存在 谢谢你!我可以 touchDragInside,但不能 touchDownInside。

以上是关于iOS Touch而不是touchDown?的主要内容,如果未能解决你的问题,请参考以下文章

Windows Touch Input WM GESTURE WM TOUCH

iOS 书签显示 favicon 而不是 apple-touch-icon

检测被点击的按钮 - iOS

UIButton 对 Touch Down 事件的响应

UIButton 不会立即检测到 Touch Down

iOS Safari 添加到我的 Angular Web 应用程序图标的主屏幕作为屏幕截图而不是 apple-touch-icon