我正在试图弄清楚如何记录UIControlEvents,以便我可以确切地看到我想要添加到我的UIButton中的那些。
我似乎无法弄明白。这是我到目前为止所尝试的:
[button addTarget:self action:@selector(buttonTouched:forEvent:) forControlEvents:UIControlEventAllEvents];
-(void)buttonTouched:(UIButton *)button forEvent:(UIControlEvents)event{
NSLog(@"%s", __PRETTY_FUNCTION__);
switch (event) {
case UIControlEventTouchDown:
NSLog(@"UIControlEventTouchDown");
break;
case UIControlEventTouchDownRepeat:
NSLog(@"UIControlEventTouchDownRepeat");
break;
case UIControlEventTouchDragInside:
NSLog(@"UIControlEventTouchDragInside");
break;
case UIControlEventTouchDragOutside:
NSLog(@"UIControlEventTouchDragOutside");
break;
case UIControlEventTouchDragEnter:
NSLog(@"UIControlEventTouchDragEnter");
break;
case UIControlEventTouchDragExit:
NSLog(@"UIControlEventTouchDragExit");
break;
case UIControlEventTouchUpInside:
NSLog(@"UIControlEventTouchUpInside");
break;
case UIControlEventTouchUpOutside:
NSLog(@"UIControlEventTouchUpOutside");
break;
case UIControlEventTouchCancel:
NSLog(@"UIControlEventTouchCancel");
break;
case UIControlEventValueChanged:
NSLog(@"UIControlEventValueChanged");
default:
break;
}
}
唯一打印的日志是__PRETTY_FUNCTION__
日志。我也试过这个,以防switch语句出现问题:
if (event == UIControlEventTouchDown) {
NSLog(@"UIControlEventTouchDown");
}
if (event == UIControlEventTouchDownRepeat){
NSLog(@"UIControlEventTouchDownRepeat");
}
etc...
仍然没有记录。我做错了什么?
修改:我通过更改添加到按钮的事件进行了进一步的实验,如下所示:
[button addTarget:self action:@selector(buttonTouched:forEvent:) forControlEvents:UIControlEventTouchDown];
然后我非常具体地记录了输入:
-(void)buttonTouched:(UIButton *)button forEvent:(UIControlEvents)event{
NSLog(@"UIControlEventTouchDown = %i", UIControlEventTouchDown);
NSLog(@"event = %i", event);
}
这是输出:
UIControlEventTouchDown = 1
event = 350486320
有谁知道发生了什么事?
编辑2:感谢TAKeanice,我现在意识到我没有正确地编写选择器。我不确定事件的日志是什么打印出来的,但是当我基本上将UIEvent
作为枚举类型(UIControlEvents
)时,它仍然在日志中给出一个值。
无论如何,在我看来,仍然有办法找出UIControlEvents是什么,但我无法从文档中看到。
但是,Apple在UIControl文档中提到了它:
子类注释 您可能希望扩展UIControl子类有以下两个原因:
观察或修改向目标发送的操作消息 特殊事件要执行此操作,请将sendAction:覆盖为:forEvent:, 评估传入的选择器,目标对象或 UIControlEvents位 掩码,并根据需要继续。
提供自定义跟踪行为(例如,更改 突出显示外观)为此,请覆盖以下一项或所有内容 方法:beginTrackingWithTouch:withEvent:, continueTrackingWithTouch:withEvent:,endTrackingWithTouch:withEvent:
当传递给UIControlEvents
的参数是sendAction:to:forEvent:
时,如何评估UIEvent
位掩码?
有什么想法吗?
答案 0 :(得分:2)
试试这个:
// somewhere
[self.btn addTarget:self action:@selector(buttonTouched:forEvent:) forControlEvents:UIControlEventAllEvents];
- (void)buttonTouched:(UIButton*)sender forEvent:(id)event {
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
UITouchPhase phase = touch.phase;
}
更新:
你会得到触摸,然后在最后一次触摸中你会有阶段,这表明这是什么事件
说明:
从触摸位置和阶段,您将能够计算事件:
答案 1 :(得分:1)
您在事件参数中没有收到“UIControlEvent”,而是“UIEvent”,这是一个完全不同的类。
文件说: UIEvent属于某种类型。这些可以是任何UIEventType枚举,它们是
事件也可以有一个子类型,它们似乎只与remoteControl类型有关。
因此,您不会在事件参数中找到确切的ControlEventType,而只会找到控件响应的“常规”操作类型。
似乎唯一的选择是为不同的UIControlEvents触发不同的方法。
----编辑----
另一个选择是自己实现UIControl,这样你就可以准确地弄清楚用户何时触摸的位置以及手指的数量等。