Я пытаюсь создать пользовательский IndicatorView
, используя Lottie
Анимации. Я добавил вид в UIApplication.shared.keyWindow?
, и он работает нормально. Проблема возникает, когда я пытаюсь добавить другое подпредставление внутри IndicatorView
.
Код падает в setupLoadingView()
, когда я пытаюсь добавить ограничения на loadingAnimation
.
ОБНОВЛЕНИЕ: Спасибо @ Raghav7890. Произошла глупая ошибка, которая сейчас решена. Я обновил ответ для всех, кто хочет создать пользовательское представление индикаторов с помощью Lottie Animations. Веселитесь.
Вот код:
import Foundation
import UIKit
import Lottie
class IndicatorView : UIView {
static let shared = IndicatorView()
var loadingAnimation : AnimationView = {
let lottieView = AnimationView()
lottieView.translatesAutoresizingMaskIntoConstraints = false
lottieView.layer.masksToBounds = true
return lottieView
}()
override init(frame: CGRect) {
super.init(frame: frame)
translatesAutoresizingMaskIntoConstraints = false
setupLoadingView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public func show() {
self.alpha = 0
UIView.animate(withDuration: 0.5, animations: {
self.isHidden = false
self.alpha = 1
}, completion: nil)
applyLottieAnimation()
}
public func hide() {
removeLoadingView()
}
func applyLottieAnimation() {
let animationToShow = Animation.named("loading")
loadingAnimation.animation = animationToShow
loadingAnimation.animationSpeed = 1.0
loadingAnimation.loopMode = .loop
loadingAnimation.contentMode = .scaleAspectFill
loadingAnimation.play()
}
private func setupLoadingView() {
UIApplication.shared.keyWindow?.addSubview(self)
self.backgroundColor = UIColor.darkGray.withAlphaComponent(0.5)
guard let activeWindow = UIApplication.shared.keyWindow?.layoutMarginsGuide else {return}
self.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.size.height + 100).isActive = true
self.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.size.width).isActive = true
self.centerXAnchor.constraint(equalTo: activeWindow.centerXAnchor).isActive = true
self.centerYAnchor.constraint(equalTo: activeWindow.centerYAnchor).isActive = true
self.addSubview(loadingAnimation)
loadingAnimation.heightAnchor.constraint(equalToConstant: 100).isActive = true
loadingAnimation.widthAnchor.constraint(equalToConstant: 100).isActive = true
loadingAnimation.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
loadingAnimation.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
loadingAnimation.backgroundColor = UIColor(red: 48/255, green: 72/255, blue: 96/255, alpha: 1.0)
loadingAnimation.applyCornerRadius()
loadingAnimation.clipsToBounds = true
self.setNeedsLayout()
self.reloadInputViews()
}
func removeLoadingView() {
self.alpha = 1
UIView.animate(withDuration: 0.5, animations: {
self.alpha = 0
self.loadingAnimation.stop()
}, completion: { _ in
self.isHidden = true
})
}
}