iOS) NVActivityIndicatorView 라이브러리 사용해보기

1 minute read

  • 서버통신하는 동안 유저가 로딩되고 있음을 보여줄 수 있도록 activity indicator 를 제공하는 라이브러리를 사용해보자.

NVActivityIndicatorView

로딩 애니메이션을 제공하는 오픈 라이브러리

GitHub - ninjaprox/NVActivityIndicatorView: A collection of awesome loading animations

아래와 같은 로딩 애니메이션을 제공한다.

pod install

pod 'NVActivityIndicatorView'

initializer

시작하기

  • 불투명한 배경을 가지는 activity indicator 만들기
import NVActivityIndicatorView

// lazy: 사용되기 전까지 연산되지 않는다. 로딩이 불필요한 경우에도 메모리를 잡아먹지 않는다.
lazy var loadingBgView: UIView = {
        let bgView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
        bgView.backgroundColor = .bottomDimmedBackground
        
        return bgView
}()
    
lazy var activityIndicator: NVActivityIndicatorView = {
        // ✅ activity indicator 설정
        let activityIndicator = NVActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height: 40),
                                                        type: .ballBeat,
                                                        color: .mainColorNadaMain,
                                                        padding: .zero)
        activityIndicator.translatesAutoresizingMaskIntoConstraints = false
        
        return activityIndicator
}()
  • 불투명 뷰 추가. 애니메이션 시작.
private func setActivityIndicator() {
        // 불투명 뷰 추가
        view.addSubview(loadingBgView)
        // activity indicator 추가
        loadingBgView.addSubview(activityIndicator)
        
        NSLayoutConstraint.activate([
            activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
        
        // 애니메이션 시작
        activityIndicator.startAnimating()
}
  • dispatch queue 에서 제공하는 main 큐는 serial 큐이기 때문에 직렬적으로 작업을 처리한다. 그래서 setActivityIndicator() 가 실행되고 aync 즉, 비동기적으로 작업이 마칠때까지 기다리지 않고 리턴하여 다음 작업을 main 큐에 넣게 되는 구조이다. 그리고 serial 큐이기 때문에 애니메이션이 시작되고 끝나는 순서가 보장된다.
DispatchQueue.main.async {
        self.setActivityIndicator()
}
        
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        // 애니메이션 정지.
        // 서버 통신 완료 후 다음의 메서드를 실행해서 통신의 끝나는 느낌을 줄 수 있다.
        self.avtivityIndicator.stopAnimating()
        self.loadingBgView.removeFromSuperview()
}

Categories:

Updated: