微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义警报消息覆盖

如何解决自定义警报消息覆盖

我的模型:

struct Model : Codable {
    let title : String
    var target : Int
    var read : Int
    let mean : String
    let useful : String
}

然后我创建自定义警报消息模型:

class MyAlert  {
    struct Constants {
        static let backgroundAlphaTo : CGFloat = 0.6
    }

    private var backgroundView : UIView = {
        let backgroundView = UIView()
        backgroundView.backgroundColor = .black
        backgroundView.alpha = 0
        return backgroundView
    }()

    private let alertView : UIView = {
        let alertView = UIView()
        alertView.backgroundColor = .white
        alertView.layer.masksToBounds = true
        alertView.layer.cornerRadius = 12
        return alertView
    }()
    
    private var myTargetView : UIView?
    
    func showAlert(with title :String,message : String,on ViewController : UIViewController){
        guard let targetView = ViewController.view else {
            return
        }
        myTargetView = targetView
        
        backgroundView.frame = targetView.bounds
        targetView.addSubview(backgroundView)
        targetView.addSubview(alertView)
        
        alertView.frame = CGRect(
            x: 40,y: -300,width: targetView.frame.size.width-80,height: 300
        )
        
        let titleLabel = UILabel(frame: CGRect(
                                    x: 0,y: 0,width: alertView.frame.size.width,height: 80))
        titleLabel.text = title
        titleLabel.textAlignment = .center
        alertView.addSubview(titleLabel)
        
        
        let messageLabel = UILabel(frame: CGRect(
                                    x: 0,y: 80,height: 170))
        
        messageLabel.numberOfLines = 0
        messageLabel.text = message
        messageLabel.textAlignment = .center
        alertView.addSubview(messageLabel)
        
        let button = UIButton(frame: CGRect(
                                x: 0,y: alertView.frame.size.height-50,height: 50))
        
        alertView.addSubview(button)
        button.setTitle("Kapat",for: .normal)
        button.setTitleColor(.blue,for: .normal)
        button.addTarget(self,action: #selector(dissmissAlert),for: .touchUpInside)
        
        UIView.animate(withDuration: 0.25) {
            self.backgroundView.alpha = Constants.backgroundAlphaTo
        } completion: { (done) in
            if done {
                UIView.animate(withDuration: 0.25) {
                    self.alertView.center = targetView.center
                }
            }
        }
    }
    
    @objc  func dissmissAlert() {
        guard let targetView = myTargetView else {
            return
        }
        
        UIView.animate(withDuration: 0.25,animations: {
            self.alertView.frame = CGRect(
                x: 40,y: targetView.frame.size.height,height: 300
                
            )},completion: {done in
                if done {
                    UIView.animate(withDuration: 0.25,animations: {
                        self.backgroundView.alpha = 0
                    },completion: {done in
                        if done {
                            self.alertView.removeFromSuperview()
                            self.backgroundView.removeFromSuperview()
                        }
                        
                    })
                }
                
            }
        )
    }
}

我有 segmentController :

@objc func ButtonTapped( _ sender : UISegmentedControl) {
    if sender.selectedSegmentIndex == 1 {
        customAlert.showAlert(with: zikirs.title,message: zikirs.mean,on: self)
    } else if sender.selectedSegmentIndex == 2 {
        customAlert.showAlert(with: zikirs.title,message: zikirs.useful,on: self)
    }
}

private func dismissAlert(){
    customAlert.dissmissAlert()
}

这里的问题是第一条消息是正常的,但第二条消息覆盖了另一条消息。

enter image description here

我该如何克服这个问题。我认为这是来自类的继承属性。但我想用 Struct 做我的 CustomAlert 模型,因为@objc 只能是类

解决方法

问题是您没有从 alertView 中删除标签和按钮,而是在下次调用时添加新的。

我的建议是为视图分配标签并仅在第一次创建它们

class MyAlert  {
    struct Constants {
        static let backgroundAlphaTo : CGFloat = 0.6
    }

    private var backgroundView : UIView = {
        let backgroundView = UIView()
        backgroundView.backgroundColor = .black
        backgroundView.alpha = 0
        return backgroundView
    }()

    private let alertView : UIView = {
        let alertView = UIView()
        alertView.backgroundColor = .white
        alertView.layer.masksToBounds = true
        alertView.layer.cornerRadius = 12
        return alertView
    }()
    
    private var myTargetView : UIView?
    
    func showAlert(with title :String,message : String,on ViewController : UIViewController){
        guard let targetView = ViewController.view else {
            return
        }
        myTargetView = targetView
        
        backgroundView.frame = targetView.bounds
        targetView.addSubview(backgroundView)
        targetView.addSubview(alertView)
        
        alertView.frame = CGRect(
            x: 40,y: -300,width: targetView.frame.size.width-80,height: 300
        )
        
        if let titleLabel = alertView.viewWithTag(100) as? UILabel {
             titleLabel.text = title
        } else {      
            let titleLabel = UILabel(frame: CGRect(
                x: 0,y: 0,width: alertView.frame.size.width,height: 80))
            titleLabel.tag = 100
            titleLabel.text = title
            titleLabel.textAlignment = .center
            alertView.addSubview(titleLabel)
        }
        
        if let messageLabel = alertView.viewWithTag(101) as? UILabel {
            messageLabel.text = message
        } else {
            let messageLabel = UILabel(frame: CGRect(
                x: 0,y: 80,height: 170))
            
            messageLabel.tag = 101
            messageLabel.numberOfLines = 0
            messageLabel.text = message
            messageLabel.textAlignment = .center
            alertView.addSubview(messageLabel)
        }
        
        if alertView.viewWithTag(102) == nil {
            let button = UIButton(frame: CGRect(
                x: 0,y: alertView.frame.size.height-50,height: 50))
            
            button.tag = 102
            alertView.addSubview(button)
            button.setTitle("Kapat",for: .normal)
            button.setTitleColor(.blue,for: .normal)
            button.addTarget(self,action: #selector(dissmissAlert),for: .touchUpInside)
        }
        
        UIView.animate(withDuration: 0.25) {
            self.backgroundView.alpha = Constants.backgroundAlphaTo
        } completion: { (done) in
            if done {
                UIView.animate(withDuration: 0.25) {
                    self.alertView.center = targetView.center
                }
            }
        }
    }
    
    @objc  func dissmissAlert() {
        guard let targetView = myTargetView else {
            return
        }
        
        UIView.animate(withDuration: 0.25,animations: {
            self.alertView.frame = CGRect(
                x: 40,y: targetView.frame.size.height,height: 300
                
            )},completion: {done in
                if done {
                    UIView.animate(withDuration: 0.25,animations: {
                        self.backgroundView.alpha = 0
                    },completion: {done in
                        if done {
                            self.alertView.removeFromSuperview()
                            self.backgroundView.removeFromSuperview()
                        }
                        
                    })
                }
                
            }
        )
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。