Вот решение, которое создаст простое представление загрузчика поверх представленного представления,
Сначала нам нужно создать класс, который отвечает за добавление / удаление activityIndicator
class AppLoaderView : UIView{
fileprivate
lazy var circularProgressIndicator : UIActivityIndicatorView = {
let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
activityIndicator.center = self.center
activityIndicator.style = .gray
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
activityIndicator.hidesWhenStopped = true
self.addSubview(activityIndicator)
return activityIndicator
}()
func showSpinning() {
setupConstraints()
circularProgressIndicator.startAnimating()
}
private
func setupConstraints() {
let xCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerX,
relatedBy: .equal, toItem: circularProgressIndicator,
attribute: .centerX,
multiplier: 1,
constant: 0)
self.addConstraint(xCenterConstraint)
let yCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerY,
relatedBy: .equal, toItem: circularProgressIndicator,
attribute: .centerY,
multiplier: 1,
constant: 0)
self.addConstraint(yCenterConstraint)
}
func removeLoading() {
circularProgressIndicator.stopAnimating()
}
}
Теперь мы создадим расширение для viewController, которое имеет два метода: один для отображения LoaderView
и один для его удаления,
extension UIViewController{
private var loaderView : AppLoaderView?{
if let view = self.view.subviews.first(where: { $0 is AppLoaderView}) as? AppLoaderView { return view }
let view = AppLoaderView(frame: self.view.frame)
view.backgroundColor = .white
view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
view.isHidden = true
return view
}
func showLoaderView(){
if let view = loaderView {
self.view.addSubview(view)
self.view.bringSubviewToFront(view)
view.isHidden = false
view.clipsToBounds = true
view.layoutIfNeeded()
view.showSpinning()
}
}
func removeLoaderView(){
if let view = loaderView{
view.removeLoading()
view.removeFromSuperview()
self.view.layoutIfNeeded()
}
}
}
Вот и все, теперь с вашим примером вы можете вызвать self.showLoaderView()
, когда кнопка нажата, и как только вызов API вернется, вы вызовете self.removeLoaderView()
.
Добавьте их где-нибудь в своем проекте, и на любом viewController вы можете вызвать эти методы для show/hide
вашего loaderView
.