End or Dismiss Lott ie Просмотр анимации, если playOnce завершен в Swift - PullRequest
2 голосов
/ 18 июня 2020

Я уже пробовал эти коды loadingview.removeFromSuperView и loadingView.isHidden = true

да, он удаляет или скрывает представление, но я больше не могу переходить к моему root представлению.

I также пробовал animatonview.background = .forceFini sh, но не выполняет свою работу.

import UIKit
import Lottie

class LoadingAnimationView: UIView {

@IBOutlet weak var loadingView: UIView!
let animationView = AnimationView()

override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func awakeFromNib() {
    super.awakeFromNib()
} 

func loadAnimation() {
        let animation = Animation.named("success")

        animationView.animation = animation
        animationView.contentMode = .scaleAspectFill

        loadingView.addSubview(animationView)
        animationView.backgroundBehavior = .pauseAndRestore
        animationView.translatesAutoresizingMaskIntoConstraints = false
        animationView.topAnchor.constraint(equalTo: loadingView.layoutMarginsGuide.topAnchor).isActive = true
        animationView.leadingAnchor.constraint(equalTo: loadingView.leadingAnchor, constant: 0).isActive = true

        animationView.bottomAnchor.constraint(equalTo: loadingView.bottomAnchor).isActive = true
        animationView.trailingAnchor.constraint(equalTo: loadingView.trailingAnchor, constant:0).isActive = true
        animationView.setContentCompressionResistancePriority(.fittingSizeLevel, for: .horizontal)

        animationView.play(fromProgress: 0,
                           toProgress: 1,
                           loopMode: .playOnce,
                           completion: { (finished) in
                            if finished {
                              print("Animation Complete")
                              //please put solution here? dismiss or end loadingView or animationView
                            } else {
                              print("Animation cancelled")
                            }
        })
    }

EDIT 2:

Я использую loadingView когда получено сообщение об успешном завершении или 200.

func goOnlineMode(){
        APIManager.sharedInstance.fetchServerStatus(completion: { data, error in
            if error != nil{
                print("Connection Failed")
            } else {
                if data?.status == 200 || data?.msg == "success" {
                    print("connected")
                    loadAnimation(true)
                    self.setCloudStateValue(value: true)
                    self.vc.cloudstateChecker()
                } else {
                    print("fail to connect")
                }
            }
        })
    }
}

это моя функция, загружающая логическое значение в loadAnimation для загрузки xib.

func loadAnimation(_ display: Bool) {
    if (display) {
        let window = UIApplication.shared.keyWindow!

        if Singleton.animationView == nil {
            if let view = Bundle.main.loadNibNamed("LoadingAnimationView", owner: window, options:nil)![0] as? LoadingAnimationView {

                Singleton.animationView = view
                Singleton.animationView?.frame.size = CGSize(width: window.bounds.width, height: window.bounds.height)
                window.addSubview(Singleton.animationView!)
                window.layoutIfNeeded()
                Singleton.animationView?.loadAnimation()
                Singleton.animationView?.translatesAutoresizingMaskIntoConstraints = false
                Singleton.animationView?.leftAnchor.constraint(equalTo: window.leftAnchor).isActive = true
                Singleton.animationView?.rightAnchor.constraint(equalTo: window.rightAnchor).isActive = true
                Singleton.animationView?.topAnchor.constraint(equalTo: window.topAnchor, constant:-60).isActive = true
                Singleton.animationView?.bottomAnchor.constraint(equalTo: window.bottomAnchor).isActive = true
                window.layoutIfNeeded()
            }
        }
    } else {
        if (Singleton.animationView != nil) {
            Singleton.animationView?.removeFromSuperview()
            Singleton.animationView = nil
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Попробуйте вот так: Swift 5

animationView.play { (finished) in
    animationViewNewOrder!.isHidden = true
}
1 голос
/ 18 июня 2020

Я решил свою проблему, используя NotificationCenter

Swift 4.2

Добавьте этот NotificationCenter Observer в свой MainViewController, а также зарегистрируйте Notification.Name в своих константах

NotificationCenter.default.addObserver(self, selector: #selector(removeAnimation(notification:)), name: HIDE_ANIMATION, object: nil)
}

также добавьте это вместе с вашим наблюдателем

@objc func removeAnimation(notification:NSNotification) {
        loadingAnimation(false)
}

Я помещаю это сообщение с уведомлением в свою недавно созданную функцию hideAnimation в LoadingAnimationView.

    func hideAnimation() {
        NotificationCenter.default.post(name: Notification.Name(HIDE_ANIMATION.rawValue), object: nil)
        loadingView.removeFromSuperview()
}

и помещаю функцию hideAnimation в ваше завершение sh.

...