拖入自定义分段控件时意外调用cancelTracking

Posted

技术标签:

【中文标题】拖入自定义分段控件时意外调用cancelTracking【英文标题】:cancelTracking called unexpectedly when dragging in customized segmented control 【发布时间】:2017-08-20 07:36:08 【问题描述】:

我正在使用来自this tutorial 的自定义分段控件,此外,我希望在滑动/拖动时更改选定的分段,所以我添加了这些功能:

override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool 
    super.beginTracking(touch, with: event)
    
    let location = touch.location(in: self)
    lastTouchLocation = location

    return true


override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool 
    super.continueTracking(touch, with: event)
    
    let location = touch.location(in: self)
    print(location.x - lastTouchLocation!.x)
    
    let newX = thumbView.frame.origin.x + (location.x - lastTouchLocation!.x)
    if frame.minX <= newX && newX + thumbView.frame.width <= frame.maxX 
        thumbView.frame.origin.x = newX
    
    lastTouchLocation = location
    
    return true


override func endTracking(_ touch: UITouch?, with event: UIEvent?) 
    super.endTracking(touch, with: event)
    
    let location = touch != nil ? touch!.location(in: self) : lastTouchLocation!
    
    var calculatedIndex : Int?
    for (index, item) in labels.enumerated() 
        if item.frame.contains(location) 
            calculatedIndex = index
        
    
    
    if calculatedIndex != nil && calculatedIndex != selectedIndex 
        selectedIndex = calculatedIndex!
        sendActions(for: .valueChanged)
     else 
        displayNewSelectedIndex()
    

我已将控件嵌入到 UIView 容器中,当我将拇指视图拖动一小段距离时,触摸会以某种方式被取消

这可能是视图容器的问题,我该如何解决?

感谢您阅读全文。

【问题讨论】:

【参考方案1】:

最近,当我的自定义 UIControl 在表单上时,我遇到了这个问题。它在弹出窗口上运行良好,但是当我将相同的控件放在表单上时,它会突然中止横向拖动的能力,似乎没有任何理由。 cancelTracking 被调用,但事件没有告诉我原因。我发现这与 ios13 通过向下拖动来解除 Formsheets 的新方法有关。为了修复它,我将此代码添加到扩展 UIControl 的类中:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
    if gestureRecognizer is UIPanGestureRecognizer 
        return false
    
    return true

【讨论】:

很棒的发现,遇到了完全相同的问题!

以上是关于拖入自定义分段控件时意外调用cancelTracking的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView Autolayout 使用标签但不使用自定义控件

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

PyQt5 QLineEdit控件 实现拖入文件时自动显示文件路径

删除按钮出现时自定义表格视图单元格中缺少 UISlider 宽度的动画