似乎每次用户触摸我的视图时都会调用此方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if ([touch view] == self && [touch tapCount] >= 1) {
// do something...
}
}
我在UIScrollView中实现了它。 UIEvent的文档没有提到在连接到操作方法时Interface Builder中可用的touchUpInside,touchUpOutside等事件。
实际上我希望只在其中一个“touchUpInside”事件中调用方法,而不是任何触摸。
答案 0 :(得分:3)
你想要touchesEnded:withEvent:
。当在UIResponder内开始触摸或一系列触摸时,会调用touchesBegan
方法;当完成一批触摸时(即用户停止触摸屏幕/抬起手指),touchesEnded
方法被调用。
答案 1 :(得分:1)
规范的方法是创建一个IBAction并将其连接到InterfaceBuilder.app中的touchUpInside事件。
一旦touchUpInside发生,您的IBAction将被调用。
如果您在IB之外以编程方式创建,您仍然可以连接IBAction。
答案 2 :(得分:1)
这就是我将IBAction链接到文本字段的方式:
[yourTextField addTarget:self action:@selector(your method:) forControlEvents:UIControlEventTouchUpInside];
答案 3 :(得分:0)
Vadoff的技术很整洁,但不要忘记通过调用超级功能来清理触摸事件。这是完整的代码。
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
BOOL touchedUpInside = NO;
if (self.isTouchUpInside) {
touchedUpInside = YES;
}
[super touchesEnded:touches withEvent:event];
if (touchedUpInside) {
// touched up inside
}
}
答案 4 :(得分:0)
摘自UIControlEventTouchUpInside的文档。
控件中的触摸事件,手指处于控件的边界之内。
AFAICS,您需要实现touchesEnded:withEvent:
。
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let point = touches.first?.location(in: self), self.point(inside: point, with: event) {
//didTouchUpInside
}
}
如果您在不调用super的情况下重写此方法(通常使用的模式),则即使您的实现不执行任何操作,也必须重写其他方法来处理触摸事件。