#ios #swift #user-interface #uiview #uigesturerecognizer
Вопрос:
Я хотел, чтобы пользователь мог провести пальцем вниз, чтобы отклонить временное уведомление, которое приходит снизу.
Вот как выглядит код:
func showAnimationToast(animationName: String, message: String, duration: Double = 3, color: UIColor = .label, fontColor: UIColor = .label) {
view.endEditing(true)
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first!
let toastView = UIView(frame: CGRect(x: 10, y: view.frame.size.height - view.safeAreaInsets.bottom, width: view.frame.size.width - 20, height: 60))
toastView.layer.borderWidth = 2
toastView.layer.borderColor = color.cgColor
toastView.backgroundColor = UIColor.systemBackground.withAlphaComponent(0.9)
//Differentiate between toasts and other UIViews in the master view
toastView.tag = 1474
let animationView = AnimationView(name: animationName)
animationView.frame = CGRect(x: 5, y: 5, width: 50, height: 50)
animationView.contentMode = .scaleAspectFill
toastView.addSubview(animationView)
let messageLabel = UILabel(frame: CGRect(x: toastView.frame.size.height, y: 5, width: toastView.frame.size.width - toastView.frame.size.height, height: 50))
messageLabel.text = message
messageLabel.font = UIFont(name: "DIN Alternate Bold", size: 22)
messageLabel.textColor = fontColor
toastView.addSubview(messageLabel)
window.addSubview(toastView)
toastView.isUserInteractionEnabled = true
//Let Swipe Down Dismiss. Does not work
let swipeDownGesture = UISwipeGestureRecognizer(target: self, action: #selector(dismissToast(_:)))
swipeDownGesture.direction = .down
toastView.addGestureRecognizer(swipeDownGesture)
//Show "Toast"
UIView.animate(withDuration: 0.2, delay: 0, animations: {
toastView.frame.origin.y = self.view.frame.size.height - self.view.safeAreaInsets.bottom - 70
}, completion: {_ in
animationView.play()
})
//Remove "toast" after specific time.
UIView.animate(withDuration: 0.2, delay: duration, animations: {
toastView.center.y = self.view.frame.size.height 50
}, completion: {_ in
toastView.removeFromSuperview()
})
}
@objc func dismissToast(_ sender: UIGestureRecognizer) {
print("dismiss")
let toastView = view.subviews.filter { view in
if view.tag == 1474 {
return true
}
return false
}.last!
UIView.animate(withDuration: 0.2, delay: 0, animations: {
toastView.center.y = self.view.frame.size.height 50
}, completion: {_ in
toastView.removeFromSuperview()
})
}
Я попытался добавить распознаватель uiswipedowngesturer, но по какой-то причине, когда я провожу пальцем вниз, он никогда не вызывает действие. Чтобы проверить, я попытался добавить обычный распознаватель Uitapgesturer, и он тоже никогда не вызывался, даже когда я нажимал на него. Что мне делать?