ios - 自定义 UIControl, Action 调用两次
<p><p>我正在尝试创建 UIControl 的子类并跟踪触摸以更改控件外观。<br/></p>
<p>我不知道为什么,但是如果我从 IB 或代码添加操作(用于 .TouchUpInside),当我触摸控件时,注册操作方法会被调用两次。<br/>
堆栈跟踪告诉我,第一个调用来自 <code>_sendActionsForEvents:withEvent:</code>,第二个不清楚。
<br/>
以下是我如何覆盖跟踪方法:<br/></p>
<pre><code> 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)
}
</code></pre>
<p>我也发现了这个 <a href="https://stackoverflow.com/questions/6689893/uicontrol-subclass-events-called-twice" rel="noreferrer noopener nofollow">answer</a>但这似乎不适合我的问题,因为当我为 .TouchUpInside 事件添加目标时,我没有从该答案中所述的事件调度程序自动获得任何操作。<br/></p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我发现我误解了文档,并且可能有很多人在那里(在互联网上看到一些示例)。<br/>
覆盖上述方法并不能让您管理事件分派(dispatch),为此最好使用 <code>sendAction:to:forEvent:</code>。
<br/>
在我使用 <code>UIControl</code> 子类创建了一个小项目并为最流行的控件事件添加一些操作之后,这些考虑出现了:</p>
<ul>
<li>触地</li>
<li>内部修饰</li>
<li>在外面修饰</li>
<li>拖到外面</li>
<li>拖入</li>
<li>值已更改</li>
</ul>
<p><strong>结果</strong><br/>
除了值改变了,所有其他的事件都已经被调用了,甚至跟踪方法也被覆盖了。如果我们想发送一个改变的值,我们必须自己调用它,这是有道理的,因为它的名字与触摸无关。 <br/>
我发现有趣的一件事是在调用外部跟踪时,当用户将手指拖动到控件边界之外大约 50% 时,它似乎被调用了,我在通过它的边界之后就期待了</p>
<pre><code>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")
}
}
</code></pre></p>
<p style="font-size: 20px;">关于ios - 自定义 UIControl, Action 调用两次,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/36627846/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/36627846/
</a>
</p>
页:
[1]