Nessuna descrizione

ToastView.swift 5.9KB

    // // ToastView.swift // PaiaiDataKit // // Created by FFIB on 16/7/21. // Copyright © 2016年 FFIB. All rights reserved. // import UIKit class ToastView: UIView { var option: ToastOption var toastType: Toast.ToastType fileprivate var stackView = UIStackView(arrangedSubviews: []) fileprivate var visualView: UIVisualEffectView fileprivate var label: UILabel? fileprivate var imageView: UIImageView? fileprivate var activityIndicatorView: UIActivityIndicatorView? fileprivate var text: String? fileprivate var image: UIImage? fileprivate var isActivity: Bool = false fileprivate var padding = UIEdgeInsets(top: 24, left: 24, bottom: 24, right: 24) init(option: ToastOption, type: Toast.ToastType) { self.option = option self.toastType = type let effect = UIBlurEffect(style: .dark) self.visualView = UIVisualEffectView(effect: effect) super.init(frame: CGRect.zero) initProperty() } required init(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func initProperty() { layer.cornerRadius = 5 layer.masksToBounds = true stackView.axis = .vertical stackView.alignment = .center stackView.distribution = .equalSpacing stackView.spacing = 12 } public func switchToast() { clear() setToast() constructStackViewHierarchy() activateConstraints() } override func didMoveToWindow() { setToast() addSubview(visualView) constructStackViewHierarchy() activateConstraints() } private func clear() { image = nil isActivity = false text = nil let arrangedSubviews = stackView.arrangedSubviews arrangedSubviews.forEach { stackView.removeArrangedSubview($0) $0.removeFromSuperview() } stackView.removeFromSuperview() } private func setToast() { switch toastType { case let .text(str): text = str case let .image(img): image = img case let .imageWithText(img, str): image = img text = str case let .activityIndicator(str): text = str isActivity = true } } } /// construct view and layout fileprivate extension ToastView { func constructStackViewHierarchy() { addSubview(stackView) if image != nil { imageView = makeImageView() stackView.addArrangedSubview(imageView!) } if isActivity { activityIndicatorView = makeActivityIndicatorView() stackView.addArrangedSubview(activityIndicatorView!) } if text != nil { label = makeLabel() stackView.addArrangedSubview(label!) } } func activateConstraints() { activateConstraintsImage() activateConstraintsIndicator() activateConstraintsText() activateConstraintsStackView() activateConstraintsVisualView() activateConstraintsContentView() } func activateConstraintsStackView() { stackView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ stackView.topAnchor.constraint(equalTo: topAnchor, constant: padding.top), stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -padding.bottom), stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: padding.left), stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -padding.right) ]) } func activateConstraintsImage() { guard let imageView = imageView else { return } imageView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ imageView.widthAnchor.constraint(equalToConstant: 50), imageView.heightAnchor.constraint(equalToConstant: 50) ]) } func activateConstraintsIndicator() { guard let activityIndicatorView = activityIndicatorView else { return } activityIndicatorView.startAnimating() } func activateConstraintsText() { guard let label = label else { return } let windowSize = UIScreen.main.bounds.size label.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ widthAnchor.constraint(lessThanOrEqualToConstant: windowSize.width - 52) ]) } func activateConstraintsContentView() { guard let val = superview else { return } translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ centerXAnchor.constraint(equalTo: val.centerXAnchor), centerYAnchor.constraint(equalTo: val.centerYAnchor) ]) } func activateConstraintsVisualView() { visualView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ visualView.topAnchor.constraint(equalTo: topAnchor), visualView.leadingAnchor.constraint(equalTo: leadingAnchor), visualView.widthAnchor.constraint(equalTo: widthAnchor), visualView.heightAnchor.constraint(equalTo: heightAnchor) ]) } } fileprivate extension ToastView { func makeLabel() -> UILabel { let label = UILabel() label.text = text label.numberOfLines = 0 label.font = option.font label.textAlignment = .center label.textColor = option.tintColor label.sizeToFit() return label } func makeImageView() -> UIImageView { let imageView = UIImageView() imageView.image = image return imageView } func makeActivityIndicatorView() -> UIActivityIndicatorView { let activity = UIActivityIndicatorView(style: .whiteLarge) return activity } }