Don_Mag icon

Simple timed notification view

Don_Mag | PRO | 06/15/20 03:10:39 PM UTC | 0 ⭐ | 1019 👁️ | Never ⏰ | []
Swift |

4.02 KB

|

None

|

0 👍

/

0 👎

class MyAlertView: UIView {
    
    let titleLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.textAlignment = .center
        v.text = "My Alert View"
        v.font = UIFont.systemFont(ofSize: 20.0, weight: .bold)
        v.textColor = .red
        return v
    }()
    let messageLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.textAlignment = .center
        v.numberOfLines = 0
        v.font = UIFont.systemFont(ofSize: 15.0, weight: .regular)
        v.textColor = .blue
        return v
    }()
 
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        backgroundColor = UIColor.black.withAlphaComponent(0.25)
        layer.cornerRadius = 16
        layer.borderColor = UIColor.black.cgColor
        layer.borderWidth = 2
        addSubview(titleLabel)
        addSubview(messageLabel)
        NSLayoutConstraint.activate([
            // constrain title label to width of self, 16-pts from the top
            titleLabel.topAnchor.constraint(equalTo: topAnchor, constant: 16.0),
            titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor),
            titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor),
            
            // constrain Top of message label to Bottom of title label + 10-pts "spacing"
            messageLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 10.0),
            // 16-pts leading and trailing
            messageLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16.0),
            messageLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16.0),
            // bottom to self bottom + 16-pts "spacing"
            messageLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16.0),
        ])
    }
}
 
class ShowMyAlertViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 2 seconds after view appears, show the alert
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.showMyAlert("This is a test of showing a custom \"Alert / Notification\" view, which will dismiss itself after 5 seconds.")
        }
    }
    func showMyAlert(_ msg: String) -> Void {
        // instantiate MyAlertView
        let v = MyAlertView()
        // set the label's text
        v.messageLabel.text = msg
        v.translatesAutoresizingMaskIntoConstraints = false
        // add it to self's view
        view.addSubview(v)
        // hidden constraint will place the BOTTOM of the view 10-pts above the top of self's view
        let hiddenConstraint = v.bottomAnchor.constraint(equalTo: view.topAnchor, constant: -10.0)
        // visible constraint will place the TOP of the view 10-pts below the top of self's view (respecting safe area)
        let visibleConstraint = v.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10.0)
        NSLayoutConstraint.activate([
            // center the alert view horizontally
            v.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            // make its width 80% of the view
            v.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8),
            // height will be determined by the content of the view
            
            // start with view above self's view frame ("hidden")
            hiddenConstraint,
        ])
        // allow the alert view to start at its hidden position
        DispatchQueue.main.async {
            // swap active constraints
            hiddenConstraint.isActive = false
            visibleConstraint.isActive = true
            // animate it into view
            UIView.animate(withDuration: 0.3, animations: {
                self.view.layoutIfNeeded()
            }, completion: { done in
                // wait 5 seconds
                DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                    // swap active constraints
                    visibleConstraint.isActive = false
                    hiddenConstraint.isActive = true
                    // animate it out of view
                    UIView.animate(withDuration: 0.3, animations: {
                        self.view.layoutIfNeeded()
                    }, completion: { done in
                        // remove it
                        v.removeFromSuperview()
                    })
                }
            })
        }
    }
    
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎