1

我有一个简单的 UIButton 并且想要在用户触摸它时做一些事情,但是然后将手指移到按钮之外并且不触摸屏幕。所以看起来我需要监听 UIControlEventTouchUpOutside 事件。

在我的视图控制器中,我这样做了:

UIButton *bt = [[UIButton alloc] initWithFrame:rect];
[bt setBackgroundColor:[UIColor whiteColor]];
[bt addTarget:self action:@selector(onTouchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
[self.view addSubview:bt];

以及对应的动作方法:

- (void)onTouchUpOutside {
    NSLog(@"touchUpOutside");
}

现在猜猜是什么?我触摸按钮,然后将手指拖到按钮外面,取消触摸屏幕并且没有记录任何消息。事实上,它会记录我发生了 UIControlEventTouchUpInside 事件,即使我的手指并没有真正位于按钮上方。似乎我可以在触摸时将手指围绕该按钮移动大约 150% 的宽度和高度,并且当我不触摸时它会告诉我手指在按钮中。但是当我把它移得很远(=足够远)时,我确实收到了“touchUpOutside”日志消息。那么这只是苹果的另一个疯狂,比如延迟 -touchesMoved 和类似的东西吗?还是我做错了什么?

4

2 回答 2

2

我发现这恰好是正常的 UIKit 行为。奇怪,但很正常。用户必须将手指移得足够远才能“取消”触摸。如果手指距离触摸按钮和liftet 的距离不够远,则触发touchUpInside 事件。找不到来自苹果的文字,但我在几个项目中进行了多次测试,包括一个带有普通 UIButton 和 IBAction 的全新项目。苹果的一些示例代码也显示了同样的奇怪行为。

于 2009-08-19T16:02:22.060 回答
2

touchUpInside当您将手指移到按钮外一点时触发,因为人们的手指很大且不精确。

如果您真的想覆盖此行为,请在处理程序中检查触摸的位置,然后如果在按钮之外触摸它touchUpInside,则直接调用处理程序。touchUpOutsidebounds

于 2009-08-19T16:06:32.160 回答