我試圖創建一個UIControl的子類和跟蹤觸摸來改變控制外觀。
自定義UIControl,動作調用兩次
我不知道爲什麼,但如果我從IB或代碼中添加動作(對於.TouchUpInside),當我觸摸控件時,register動作方法會被調用兩次。
堆棧跟蹤告訴我,第一個電話來自_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)
}
我還發現這answer,但它似乎並不適合我的問題,因爲當我添加了目標.TouchUpInside事件我不如該答案中所述,不會從事件調度程序自動執行任何操作。
您是否在每個sendActionsForControlEvents上放置了斷點並查看是否有超過1個命中?您是否觸發touchDown事件一次,觸發TouchUpInside事件一次? – fsb
當然,我想我已經找到了答案。我會在稍後發佈。基本上看來,動作已經由超類發送了,但是我想追蹤所有事件或者僅僅幾個。所以我發送了一些已發送的內容 – Andrea