奇怪的UIButton行为:这是正常的吗?

时间:2009-08-19 15:01:29

标签: iphone cocoa-touch uikit uibutton

我有一个简单的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”日志消息。那么这只是苹果的另一种疯狂,比如推迟了 - 以及这样的东西?或者我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

当你的手指稍微移动一下按钮时,

touchUpInside会被触发,因为人的手指很大,不精确。

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