我遇到了同样的问题,并想出了一个解决方案。它不是非常漂亮,但效果很好。它是一个 UIControl 类别,将最后一次触发的 UIControlEvent 存储到它自己的标记属性中。您可以从下面的链接中获取它。为了进一步参考,这里是我的类别中的文档,更详细地描述了正在发生的事情。
希望这会有所帮助!干杯/J
UIControl+CaptureUIControlEvents
git 要点: http: //gist.github.com/513796
问题:在触发时,UIControlEvents 不会传递到分配给特定事件的目标操作中。这对于只有一个基于触发的 UIControlEvent 进行切换的操作很有用。
解决方案:添加一种方法来存储在 UIEvent 中触发的 UIControlEvent。
问题:但我们无法覆盖私有 API,因此:(更糟糕的)解决方案:让 UIControl 存储上次触发的 UIControlEvent。
UIControl 文档指出:
当用户以对应于一个或多个指定事件的方式触摸控件时,UIControl 会向自身发送 sendActionsForControlEvents:。这导致 UIControl 在 sendAction:to:from:forEvent: 消息中将操作发送到 UIApplication。
有人会认为 sendActionsForControlEvents: 可以被覆盖(或子类化)以存储标志,但事实并非如此。似乎 sendActionsForControlEvents: 主要是为了让客户端以编程方式触发事件。
相反,我必须设置一个方案,为想要跟踪的每个控制事件注册一个动作。为了性能和易用性,我决定不跟踪所有事件(或所有 UIControls)。
使用示例:
在 UIControl 设置上:
UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];
和目标行动:
- (void) touch:(UIControl *)sender {
UIColor *color = [UIColor clearColor];
switch (sender.tag) {
case UIControlEventTouchDown: color = [UIColor redColor]; break;
case UIControlEventTouchUpInside: color = [UIColor blueColor]; break;
case UIControlEventTouchUpOutside: color = [UIColor redColor]; break;
}
sender.backgroundColor = color;
}