Неожиданно вызывается cancelTracking при перетаскивании в настраиваемый сегментированный элемент управления

Я использую настраиваемый сегментированный элемент управления из этого руководства, кроме того, я хотел бы, чтобы выбранный сегмент был изменен при перетаскивании / перетаскивании, поэтому я добавил следующие функции:

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, так или иначе касание отменяется, когда я перетаскиваю вид большого пальца на короткое расстояние

введите описание изображения здесь

Может ли это быть проблемой с контейнером представления, и как я могу это исправить?

Спасибо, если вы все прочитали.

0 ответов

Я столкнулся с этим недавно, когда мой пользовательский UIControl был в форме. Он отлично работал с всплывающим окном, но когда я помещал тот же элемент управления в форму, он отменял возможность резкого перетаскивания вбок, казалось бы, без причины.cancelTrackingбыл вызван, но событие не объяснило мне почему. Я понял, что это связано с новым способом iOS13 отклонять формы с помощью перетаскивания вниз. Чтобы исправить это, я добавил этот код в свой класс, расширяющий UIControl:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer is UIPanGestureRecognizer {
        return false
    }
    return true
}
Другие вопросы по тегам