向UIWindow上添加的视图添加手势识别器

时间:2018-12-28 07:17:11

标签: ios swift uigesturerecognizer toast uiwindow

我在UIWindow上以toast view的形式添加了一个子视图,现在我在2秒后自动将其(toast视图)删除。但是我需要添加一个swipe/tap gesture recogniser才能在用户滑动/触摸它时将其删除。我尝试了很多,但没有结果。

有什么方法可以实现这一目标,请告诉我是否有解决方案。谢谢。

 class func showToast(withDuration duration: TimeInterval, afterDelay delay: TimeInterval, withMessage message: String, toastType type: UINotificationFeedbackGenerator.FeedbackType, hideToastAfterCompletion: Bool) {

    let notificationFeedback = UINotificationFeedbackGenerator()

    let window = UIApplication.shared.keyWindow

    let toastView = UIView()
    toastView.tag = 999
    toastView.accessibilityHint = "toastView"
    toastView.backgroundColor = UIColor.clear
    toastView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: 80)
    toastView.isUserInteractionEnabled = true

    let toastLabelWidth = screenWidth*0.75
    let xPosition = (screenWidth - toastLabelWidth)/2
    let size = message.height(withConstrainedWidth: toastLabelWidth, font: UIFont.LatoRegular(16))

    var topPadding: CGFloat = 0.0
    if #available(iOS 11.0, *) {
        topPadding = window?.safeAreaInsets.top ?? 0.0
    }
    topPadding = (topPadding == 0.0 ?  20.0  : topPadding)

    let toastLabel = UILabel(frame: CGRect(x: xPosition, y: topPadding, width: toastLabelWidth, height: size))
    toastLabel.text = message
    toastLabel.numberOfLines = 0
    toastLabel.textAlignment = .center
    toastLabel.textColor = type.TextColor
    toastLabel.font = UIFont.LatoRegular(16)
    toastLabel.backgroundColor = UIColor.clear
    toastView.addSubview(toastLabel)
    toastView.frame.size.height = toastLabel.frame.origin.y + size + 32
    removeExistedToast()
    self.drawWave(forToastView: toastView, fillColor: type.ToastColor)
    toastView.transform = CGAffineTransform(translationX: 0, y: -toastView.frame.height)
    window?.addSubview(toastView)

    notificationFeedback.notificationOccurred(type)

    Toast.animateLayer(toastView: toastView)

    let swipeGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(toastViewSwiped))
    toastView.addGestureRecognizer(swipeGestureRecognizer)

    animate(toast: toastView, withDelay: delay, duration: 0.5, transform: CGAffineTransform.identity, {
        if $0 && hideToastAfterCompletion {
            animate(toast: toastView, withDelay: delay + duration, duration: 0.25, transform: CGAffineTransform(translationX: 0, y: -toastView.frame.height), { _ in
                toastView.removeFromSuperview()
            })
        }
    })
}

@objc private func toastViewSwiped(_ gesture: UIGestureRecognizer) {
    Toast.removeExistedToast()
}

class func removeExistedToast(){
    let window = UIApplication.shared.keyWindow
    window?.subviews.filter({ $0.tag == 999 && $0.accessibilityHint == "toastView" }).forEach({ (existedToast) in
        UIView.animate(withDuration: 0.25, animations: {
            existedToast.alpha = 0
        }, completion: { (_) in
            existedToast.removeFromSuperview()
        })
    })
}

这里我的代码允许检查ID,为手势识别器分配目标或无法添加目标时是否有错误。

1 个答案:

答案 0 :(得分:0)

在将“ toastView”和“ toastLabel”在此“ Toast”中设置为全局并获取实例后,它起作用了

private var window: UIWindow!

public var toastView: UIView!
private var toastLabel: UILabel!

private static let sharedInstance = Toast()

class func shared() -> Toast {
    return sharedInstance
}

我替换了以下代码,

animate(toast: toastView, withDelay: delay + duration, duration: 0.25, transform: CGAffineTransform(translationX: 0, y: -toastView.frame.height), { _ in
            toastView.removeFromSuperview()
        })

self.perform(#selector(self.removeExistedToast), with: nil, afterDelay: delay + duration)

通过

func removeExistedToast()

@objc func removeExistedToast()