В соответствии с документацией для метода hittest (_: with :) из UIView https://developer.apple.com/documentation/uikit/uiview/1622469-hittest
Этот метод игнорирует объекты просмотра, которые скрыты, которые отключили взаимодействие с пользователем или имеютальфа уровень менее 0,01.Этот метод не учитывает содержимое представления при определении попадания.Таким образом, представление все еще может быть возвращено, даже если указанная точка находится в прозрачной части содержимого этого представления.
Это означает, что любое представление, особенно кнопка, с альфа 0.0 не будет затронуто.
Однако проблема здесь в том, что кнопка все еще видна, по крайней мере, для вас.Такое поведение odd происходит потому, что фактическое альфа-значение кнопки уже установлено равным 0.0, когда анимация начинается.Анимации работают, изменяя визуальную иерархию и переводя разницу с параметрами, которые вы задаете функции.В вашем случае у вас есть два состояния: вид с видимой кнопкой и другой вид без кнопки.Только визуальная часть анимирована, но соответствующие значения уже установлены.Решение будет:
func tappedButton() {
self.button.alpha = 1.0
UIView.animate(withDuration: 1.0, delay: 4.0, options: .curveLinear, animations: { [weak self] in
self?.button.alpha = 0.01
}) { [weak self] _ in self?.button.alpha = 0.0 }
}
РЕДАКТИРОВАТЬ: Это решение выглядит как взломать, но работает.Я использую этот подход, потому что обработчик завершения всегда вызывается со значением true
.
func tapped() {
let duration = 1.0
let delay = 2.0
let delayDuration = delay + duration
UIView.animate(withDuration: duration, delay: delay, options: [.curveLinear, .allowUserInteraction], animations: { [weak self] in
self?.saveButton.alpha = 0.1
})
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayDuration, execute: { [weak self] in
self?.saveButton.alpha = 0.0
})
}