Вместо этого можно отслеживать местоположение самой точки касания и определять, когда точка касания перемещается внутрь и наружу кнопки
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
}
}
Это потребует от вас подкласса суперпредставления кнопки. А поскольку вы, возможно, не захотите анимировать, как только точка покинет рамку кнопки (поскольку палец или большой палец пользователя по-прежнему будут покрывать большую часть кнопки), вы можете вместо этого выполнить проверку нажатия в большем кадре, который инкапсулирует вашу кнопку.