|
//
// 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
}
}
|