如何向UIView添加触摸事件?
我尝试:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
我不想创建子类和覆盖
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
13 回答
创建一个手势识别器(子类),它将实现触摸事件,如
touchesBegan
. 之后您可以将其添加到视图中 .这样你就可以使用组合代替子类化(这是请求) .
在iOS 3.2及更高版本中,您可以使用手势识别器 . 例如,这是您处理点击事件的方式:
还有一堆内置手势 . 查看iOS事件处理的文档和
UIGestureRecognizer
. 我在github上也有一堆可能有用的示例代码 .手势识别器
当您向视图添加Gesture Recognizer时,可以通知许多常用的触摸事件(或手势) . 默认情况下支持以下手势类型:
UITapGestureRecognizer
Tap (短暂触摸屏幕一次或多次)UILongPressGestureRecognizer
Long touch (长时间触摸屏幕)UIPanGestureRecognizer
Pan (在屏幕上移动手指)UISwipeGestureRecognizer
Swipe (快速移动手指)UIPinchGestureRecognizer
Pinch (将两根手指放在一起或分开 - 通常是放大)UIRotationGestureRecognizer
Rotate (沿圆周方向移动两根手指)除此之外,您还可以制作自己的自定义手势识别器 .
在Interface Builder中添加手势
将手势识别器从对象库拖到视图上 .
控制从文档大纲中的手势拖动到View Controller代码,以便制作插座和操作 .
这应该默认设置,但也要确保视图的 User Action Enabled 设置为true .
以编程方式添加手势
要以编程方式添加手势,您(1)创建手势识别器,(2)将其添加到视图中,以及(3)创建在识别手势时调用的方法 .
Notes
sender
参数是可选的 . 如果您不需要对手势的引用,则可以将其保留 . 但是,如果这样做,请删除操作方法名称后面的(sender:)
.handleTap
方法的命名是任意的 . 使用action: #selector(someMethodName(sender:))
将其命名为您想要的任何名称 .更多例子
您可以研究我添加到这些视图中的手势识别器,以了解它们的工作原理 .
以下是该项目的代码:
Notes
您可以向单个视图添加多个手势识别器 . 但是为了简单起见,我没有这样做(滑动手势除外) . 如果您需要为您的项目,您应该阅读gesture recognizer documentation . 这是相当容易理解和有帮助的 .
上述示例的已知问题:(1)平移视图在下一个手势事件中重置其帧 . (2)第一次滑动时滑动视图来自错误的方向 . (不过,我的示例中的这些错误不应影响您对手势识别器如何工作的理解 . )
我想你可以简单地使用
我的意思是headerView从UIControl扩展 .
基于accepted answer,您可以定义一个宏:
这个宏使用ARC,因此没有
release
调用 .宏用法示例:
Swift 3 & Swift 4
Use
您可以通过在代码中添加Gesture Recogniser来实现此目的 .
Step 1: ViewController.m:
Step 2: ViewController.m:
注意:这里你的视图是
@property (strong, nonatomic) IBOutlet UIView *localView;
EDIT: * localView是Main.storyboard中的白色框,从下面开始
这是一个Swift版本:
斯威夫特3:
在 Swift 4.2 和Xcode 10中
使用 UITapGestureRecognizer 添加触摸事件
如果你想使用 SharedClass
我的ViewController中有3个视图,名为view1,view2和view3 .
这是ios tapgesture;首先,您需要在操作下面编写以下代码后为GestureRecognizer创建操作,如下所示
另一种方法是在视图中添加透明按钮
然后,处理点击:
你们为什么不试试SSEventListener?
您不需要创建任何手势识别器,并将您的逻辑与另一种方法分开 .
SSEventListener
支持在视图上设置侦听器块以侦听单击手势,双击手势和N-tap手势如果你喜欢,并长按手势 . 设置单击手势监听器就变成了这种方式:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];