Press ESC to close

Swift Loading Screen

Merhaba arkadaşlar, bu yazımızda Swift ile iOS projelerimizde nasıl ortak bir bekleme ekranı oluşturabiliriz bundan bahsedeceğimiz. Aslında bunun bir çok yolu var. Bunlar;

  • Bir pod kullanmak
  • UIView’e extension yazmak
  • Sınıf yazmak

Pod Kullanmak

Loading ekranı için bir pod kullanmak en basit ve kolay olan yollarından birisidir. Bizim bu iş için en çok kullandığımız pod SVProgressHud. Buradan inceleyebilirsiniz. Çok basit bir şekilde ekranınızda loading çıkartabilirsiniz. Çıktısı aşağıdaki gibidir.

UIView’e Extension Yazmak

Burada kendiniz ayrı bir view koymak istiyorsanız, en mantıklı yollardan birisidir. Burada ViewController’inizin en üstündeki View’de showLoading fonksiyonunu çağırdığınızda arka tarafı blurlanmış bir Loading ikonu göreceksiniz.

//
//  UIView+Extension.swift
//  OSMovie
//
//  Created by Omer Sezer on 8.03.2021.
//

import UIKit

extension UIView {
    func showLoading() {
        let blurLoader = BlurLoader(frame: frame)
        self.addSubview(blurLoader)
    }
    
    func hideLoading() {
        if let blurLoader = subviews.first(where: { $0 is BlurLoader }) {
            blurLoader.removeFromSuperview()
        }
    }
}

class BlurLoader: UIView {

    var blurEffectView: UIVisualEffectView?

    override init(frame: CGRect) {
        let blurEffect = UIBlurEffect(style: .dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = frame
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        self.blurEffectView = blurEffectView
        super.init(frame: frame)
        addSubview(blurEffectView)
        addLoader()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func addLoader() {
        guard let blurEffectView = blurEffectView else { return }
        let activityIndicator = UIActivityIndicatorView()
        if #available(iOS 13.0, *) {
            activityIndicator.style = .large
        } else {
            activityIndicator.style = .gray
        }
        activityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        blurEffectView.contentView.addSubview(activityIndicator)
        activityIndicator.center = blurEffectView.contentView.center
        activityIndicator.startAnimating()
    }
}

Ekran çıktısı aşağıdaki gibidir.

Sınıf Yazmak

Kullandığımız diğer bir yöntem ise bir sınıf oluşturup burada statik bir değişken ile bunu tanımlayıp ekranın en üst katmanında View göstermek. bunun için aşağıdaki kodu yazmanız yeterli.

public class LoadingOverlay{

    var overlayView = UIView()
    var activityIndicator = UIActivityIndicatorView()

    class var shared: LoadingOverlay {
        struct Static {
            static let instance: LoadingOverlay = LoadingOverlay()
        }
        return Static.instance
    }
    
    public func showOverlay() {
        if  let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = appDelegate.window {
            overlayView.frame = CGRect(x: 0, y: 0, width: 80, height: 80)
            overlayView.center = CGPoint(x: window.frame.width / 2.0, y: window.frame.height / 2.0)
            overlayView.backgroundColor = .blue
            overlayView.clipsToBounds = true
            overlayView.layer.cornerRadius = 10

            activityIndicator.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
            activityIndicator.style = .whiteLarge
            activityIndicator.center = CGPoint(x: overlayView.bounds.width / 2, y: overlayView.bounds.height / 2)

            overlayView.addSubview(activityIndicator)
            window.addSubview(overlayView)

            activityIndicator.startAnimating()
        }
    }
    public func hideOverlayView() {
        activityIndicator.stopAnimating()
        overlayView.removeFromSuperview()
    }
}

Sonrasında ise kullanmak istediğiniz yerde, aşağıdaki kod satırını çalıştırmanız yeterli.

LoadingOverlay.shared.showOverlay()

Projeye buradan ulaşabilirsiniz. Sorularınız olursa mail veya yorum atarak sorabilirsiniz. İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir