iOS) NVActivityIndicatorView 라이브러리 사용해보기
- 서버통신하는 동안 유저가 로딩되고 있음을 보여줄 수 있도록 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()
}