如何记录UIControlEvents?

时间:2014-02-14 16:57:24

标签: ios objective-c event-handling nslog uicontrolevents

我正在试图弄清楚如何记录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位掩码? 有什么想法吗?

2 个答案:

答案 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;
}

更新:
你会得到触摸,然后在最后一次触摸中你会有阶段,这表明这是什么事件

说明:

从触摸位置和阶段,您将能够计算事件:

  • UITouchPhaseEnded +触摸位置在bounds =>范围内UITouchUpInside
  • UITouchPhaseEnded +触摸位置超出边界=> UITouchUpOutside
  • ...

答案 1 :(得分:1)

您在事件参数中没有收到“UIControlEvent”,而是“UIEvent”,这是一个完全不同的类。

文件说: UIEvent属于某种类型。这些可以是任何UIEventType枚举,它们是

  • UIEventTypeTouches
  • UIEventTypeMotion
  • UIEventTypeRemoteControl

事件也可以有一个子类型,它们似乎只与remoteControl类型有关。

https://developer.apple.com/library/ios/documentation/uikit/reference/UIEvent_Class/Reference/Reference.html

因此,您不会在事件参数中找到确切的ControlEventType,而只会找到控件响应的“常规”操作类型。

似乎唯一的选择是为不同的UIControlEvents触发不同的方法。

----编辑----
另一个选择是自己实现UIControl,这样你就可以准确地弄清楚用户何时触摸的位置以及手指的数量等。