UIButton touchDragEnter и touchDragExit вызывается слишком часто - PullRequest
0 голосов
/ 06 мая 2018

Как можно избежать быстрых срабатываний функций UIButtons .touchDragEnter и .touchDragExit? Этот вопрос наглядно демонстрирует проблему , но единственный ответ не описывает, как ее обойти. Я пытаюсь анимировать кнопку, когда пользователь нажимает на кнопку, и снова анимировать ее, когда их палец соскальзывает. Есть ли лучшие способы сделать это? Если нет, то как я могу остановить многократный запуск моего кода анимации, когда палец пользователя находится между состоянием .enter и .exit?

1 Ответ

0 голосов
/ 11 июня 2018

Вместо этого можно отслеживать местоположение самой точки касания и определять, когда точка касания перемещается внутрь и наружу кнопки

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let point = t.location(in: self)
        // moving in to the button
        if button.frame.contains(point) && !wasInButton {
            // trigger animation
            wasInButton = true
        }
        // moving out of the button
        if !button.frame.contains(point) && wasInButton {
            // trigger animation
            wasInButton = false
        }
    }
}

wasInButton может быть булевой переменной, для которой установлено значение true, когда в кадре кнопки происходит касание:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let point = t.location(in: self)
        if button.frame.contains(point) {
            wasInButton = true
            // trigger animation
        } else {
            wasInButton = false
        }
    }

Это потребует от вас подкласса суперпредставления кнопки. А поскольку вы, возможно, не захотите анимировать, как только точка покинет рамку кнопки (поскольку палец или большой палец пользователя по-прежнему будут покрывать большую часть кнопки), вы можете вместо этого выполнить проверку нажатия в большем кадре, который инкапсулирует вашу кнопку.

...