简体   繁体   中英

Adding a gesture recogniser to a view which added on UIWindow

I added a subview on UIWindow as a toast view , now I removing it(toast view) automatically after 2 sec. But I need to add a swipe/tap gesture recogniser to remove it when user swipes/touches it. I tried a lot but no result.

Is there any way to implement this, please let me know if there is a solution. Thanks.

 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()
        })
    })
}

here id my code lets check, is there any wrong when assigning target for gesture recognizer or adding target is not possible.

It worked after making the 'toastView' and 'toastLabel' as global inside this 'Toast' and taking an instance,

private var window: UIWindow!

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

private static let sharedInstance = Toast()

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

I replaced the following code,

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

with

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

by making

func removeExistedToast()

as

@objc func removeExistedToast()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM