我正在尝试创建一个UIControl的子类,以便跟踪触摸事件以改变控件外观。
我不知道为什么,但如果我从IB或代码中添加操作(用于.TouchUpInside),当我触摸控件时,注册操作方法会被调用两次。
堆栈跟踪告诉我,第一次调用来自_sendActionsForEvents: withEvent:
,第二次则不清楚。
下面是我如何重写跟踪方法的方式:
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
let touchPoint = touch.locationInView(self)
if CGRectContainsPoint(bounds, touchPoint) {
sendActionsForControlEvents(.TouchDragInside)
}
else {
sendActionsForControlEvents(.TouchDragOutside)
}
return true
}
override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
sendActionsForControlEvents(.TouchDown)
return true
}
override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) {
guard let tou = touch else { return }
let touchPoint = tou.locationInView(self)
if CGRectContainsPoint(bounds, touchPoint) {
sendActionsForControlEvents(.TouchUpInside)
}
else {
sendActionsForControlEvents(.TouchUpOutside)
}
}
override func cancelTrackingWithEvent(event: UIEvent?) {
sendActionsForControlEvents(.TouchCancel)
}
我还发现了这个答案,但它似乎不适用于我的问题,因为当我为.TouchUpInside事件添加目标时,我不会像该答案中所述那样自动从事件分派器获取任何操作。