swift의 확장을 통한 로딩 표시기 공통화
전체 화면에서 공통 로딩 표시기를 구현하고 싶습니다.
UI 조작 차단하는 시스템의 이런 것을 전체 화면에서 언제든지 호출할 수 있도록 하고 싶다
모처럼 swift이기 때문에 UIViewController의 확장으로 쓰고 싶습니다.
BaseViewController적인 클래스에 공통 함수 만들어 계승시켜 가는 것은 Swifty가 아닌 생각이 들기 때문에, UIViewController의 extension로 실현시키고 싶다. . .
Swift의 확장에는 저장 속성이 없습니다.
처음 시도한 것은 다음 방법 ※ 물론 빌드 오류
swift의 확장은 컴퓨팅 속성 만 가지고 있기 때문에이 접근법을 사용할 수 없습니다.
UIViewController+Extension.swift
extension UIViewController {
let indicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
let grayOutView = UIView(frame: self.view.frame)
func startIndicator() {
loadingIndicator.center = self.view.center
grayOutView.backgroundColor = .black
grayOutView.alpha = 0.6
self.view.addSubview(grayOutView)
self.view.addSubview(loadingIndicator)
self.view.bringSubview(toFront: grayOutView)
self.view.bringSubview(toFront: loadingIndicator)
loadingIndicator.startAnimating()
}
func dismissIndicator() {
indicatorView.removeFromSuperView()
grayOutView.removeFromSuperView()
}
}
최종 구현 방법
UIView의 tag 속성을 이용하여 식별, 표시, 숨기기
아주 간단하게, 쓸모없는 것 같은 값을 할당해 처리하는 것만(이번은 999를 사용)
UIViewController+Extension.swiftextension UIViewController {
func startIndicator() {
let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
loadingIndicator.center = self.view.center
let grayOutView = UIView(frame: self.view.frame)
grayOutView.backgroundColor = .black
grayOutView.alpha = 0.6
// 他のViewと被らない値を代入
grayOutView.tag = 999
grayOutView.addSubview(loadingIndicator)
self.view.addSubview(grayOutView)
self.view.bringSubviewToFront(grayOutView)
loadingIndicator.startAnimating()
}
func dismissIndicator() {
self.view.subviews.first(where: { $0.tag == 999 })?.removeFromSuperview()
}
}
사용방법
SampleViewController.swift
func sampleFunc() {
// ローディング開始
startIndicator()
DispatchQueue.global(qos: .default).async {
// 重い処理や通信処理
DispatchQueue.main.async {
// ローディング非表示
self.dismissIndicator()
}
}
}
더 스마트한 방식 모집 중
swift의 extension으로 쓰고 목적은 달성되었습니다만, 개인적으로 tag로 판정하는 것이 확실히 오지 않았기 때문에,
더 좋은 방법이 있습니다! 라는 분이 있으면 코멘트 부탁드립니다!
Reference
이 문제에 관하여(swift의 확장을 통한 로딩 표시기 공통화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rymshm/items/5fbff3283c0439e73117
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
extension UIViewController {
let indicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
let grayOutView = UIView(frame: self.view.frame)
func startIndicator() {
loadingIndicator.center = self.view.center
grayOutView.backgroundColor = .black
grayOutView.alpha = 0.6
self.view.addSubview(grayOutView)
self.view.addSubview(loadingIndicator)
self.view.bringSubview(toFront: grayOutView)
self.view.bringSubview(toFront: loadingIndicator)
loadingIndicator.startAnimating()
}
func dismissIndicator() {
indicatorView.removeFromSuperView()
grayOutView.removeFromSuperView()
}
}
extension UIViewController {
func startIndicator() {
let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
loadingIndicator.center = self.view.center
let grayOutView = UIView(frame: self.view.frame)
grayOutView.backgroundColor = .black
grayOutView.alpha = 0.6
// 他のViewと被らない値を代入
grayOutView.tag = 999
grayOutView.addSubview(loadingIndicator)
self.view.addSubview(grayOutView)
self.view.bringSubviewToFront(grayOutView)
loadingIndicator.startAnimating()
}
func dismissIndicator() {
self.view.subviews.first(where: { $0.tag == 999 })?.removeFromSuperview()
}
}
func sampleFunc() {
// ローディング開始
startIndicator()
DispatchQueue.global(qos: .default).async {
// 重い処理や通信処理
DispatchQueue.main.async {
// ローディング非表示
self.dismissIndicator()
}
}
}
Reference
이 문제에 관하여(swift의 확장을 통한 로딩 표시기 공통화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rymshm/items/5fbff3283c0439e73117텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)