我试图创建一个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)
}
我也发现了answer,但它似乎不适合我的问题,因为当我为.TouchUpInside事件添加目标时,我不会自动从中获取任何操作事件调度员如答案所述。
答案 0 :(得分:2)
我发现我误解了文档,可能还有很多人(在互联网上看到一些样本)。
覆盖上述方法并不能使您能够管理事件分派,为此,最好使用sendAction:to:forEvent:
。
在我使用UIControl
子类创建一个小项目并为最流行的控件事件添加一些操作之后,这些考虑因素出现了:
<强>结果
除了值更改之外,所有其他事件都已被调用,甚至跟踪方法都被覆盖。如果我们想要发送更改的值,我们必须自己调用它,这是有道理的,因为它的名称与触摸无关。
我发现有趣的一件事是当调用外部跟踪时,似乎在用户将手指拖动到控制范围之外大约多50%的时候调用它,我在通过其边界后期待它
class TestControl: UIControl {
override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
let touchPoint = touch.locationInView(self)
print(touchPoint)
return true
}
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
let touchPoint = touch.locationInView(self)
print(touchPoint)
return true
}
override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) {
guard let touch = touch else { return }
let touchPoint = touch.locationInView(self)
print(touchPoint)
}
}
class ViewController: UIViewController {
@IBOutlet weak var tezst: TestControl!
@IBAction func touchDown(sender: AnyObject){
print("Touch Down")
}
@IBAction func touchUpInside(sender: AnyObject){
print("Touch up inside")
}
@IBAction func touchUpOutside(sender: AnyObject){
print("Touch up outside")
}
@IBAction func touchDragOutside(sender: AnyObject){
print("Touch drag outside")
}
@IBAction func touchDragInside(sender: AnyObject){
print("Touch drag inside")
}
@IBAction func valueChanged(sender: AnyObject){
print("Value changed")
}
}