菜鸟教程小白 发表于 2022-12-12 19:23:31

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?) -&gt; 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?) -&gt; 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?) -&gt; Bool {
      let touchPoint = touch.locationInView(self)
      print(touchPoint)
      return true
    }
    override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -&gt; 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(&#34;Touch Down&#34;)
    }
    @IBAction func touchUpInside(sender: AnyObject){
      print(&#34;Touch up inside&#34;)
    }

    @IBAction func touchUpOutside(sender: AnyObject){
      print(&#34;Touch up outside&#34;)
    }
    @IBAction func touchDragOutside(sender: AnyObject){
      print(&#34;Touch drag outside&#34;)
    }
    @IBAction func touchDragInside(sender: AnyObject){
      print(&#34;Touch drag inside&#34;)
    }
    @IBAction func valueChanged(sender: AnyObject){
      print(&#34;Value changed&#34;)
    }
}
</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]
查看完整版本: ios - 自定义 UIControl, Action 调用两次