extension UIViewController {
/// Показывает view (экран блокировки интерфейса), например, на время загрузки данных по сети.
/// - Parameters:
/// - state: true - показать, false - убрать темный экран
/// - upperView: перемещает view выше черного экрана во view-hierarchy
/// - withIndicator: показывать или нет ActivityIndicator
/// - indicatorColor: цвет ActivityIndicator
/// - bgColor: цвет фона view
/// - alpha: прозрачность фона
/// - completion: замыкание, срабатывающее при нажатии на темный view
func activityIndicator(state: Bool,
upperView: UIView? = nil,
withIndicator: Bool = true,
indicatorColor: UIColor? = nil,
bgColor: UIColor = .black,
alpha: CGFloat = 0.5,
completion: (() -> Void)? = nil) {
let viewTag = 9944
if state {
let blackView = UIView()
view.addSubview(blackView)
blackView.tag = viewTag
blackView.backgroundColor = bgColor.withAlphaComponent(alpha)
blackView.translatesAutoresizingMaskIntoConstraints = false
blackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
blackView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
blackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
blackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
if withIndicator {
let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
if let color = indicatorColor {
activityIndicator.color = color
}
blackView.addSubview(activityIndicator)
activityIndicator.startAnimating()
activityIndicator.hidesWhenStopped = true
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
activityIndicator.centerXAnchor.constraint(equalTo: blackView.centerXAnchor, constant: 0).isActive = true
activityIndicator.centerYAnchor.constraint(equalTo: blackView.centerYAnchor, constant: 0).isActive = true
}
if let completion = completion {
blackView.addTapGesture { [weak self] (_) in
self?.view.subviews.forEach { view in
if view.tag == viewTag {
view.removeFromSuperview()
completion()
}
}
}
}
if let upperView = upperView {
view.bringSubviewToFront(upperView)
}
} else {
view.subviews.forEach { view in
if view.tag == viewTag {
view.removeFromSuperview()
if let completion = completion {
completion()
}
}
}
}
}
}