Как я могу реализовать одноэлементный счетчик (индикатор активности)? - PullRequest
0 голосов
/ 01 июля 2019

Я хочу реализовать одноэлементный спиннер, потому что для любого приложения, имеющего API, нужен спиннер.ну, я могу кодировать пользовательский спиннер, но моя проблема в том, что я должен кодировать следующую строку, если я хочу ее показать.

    let rosetaGIF = UIImage(named: "wheel.png")
    let ind = MyIndicator(frame: CGRect(x: 0, y: 0, width: (rosetaGIF?.size.width)!/2, height: (rosetaGIF?.size.height)!/2), image: rosetaGIF!)
    view.addSubview(ind)
    view.alpha = 0.5
    ind.startAnimating()

, это не хорошо, потому что я должен ставить эти строки каждый раз, когда яхочу показать прядильщик, ну, мой класс прядильщика следующий.Я использую swift 4.2

import UIKit

class MyIndicator: UIActivityIndicatorView {


let loadingView = UIView(frame: (UIApplication.shared.delegate?.window??.bounds)!)
let imageView = UIImageView()
let sizeView = UIViewController()

init(frame: CGRect, image: UIImage) {
    super.init(frame: frame)

    imageView.frame = bounds
    imageView.image = image
    imageView.contentMode = .scaleAspectFit
    imageView.center = CGPoint(x: sizeView.view.frame.width/2, y: sizeView.view.frame.height/2)
    imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(imageView)
}

required init(coder: NSCoder) {
    fatalError()
}

override func startAnimating()
{
    isHidden = false
    rotate()
}

override func stopAnimating()
{
    isHidden = true
    removeRotation()
}

private func rotate() {
    let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
    rotation.toValue = NSNumber(value: Double.pi * 1)
    rotation.duration = 1
    rotation.isCumulative = true
    rotation.repeatCount = Float.greatestFiniteMagnitude
    self.imageView.layer.add(rotation, forKey: "rotationAnimation")
}

private func removeRotation() {
    self.imageView.layer.removeAnimation(forKey: "rotationAnimation")
}
}

что мне делать, чтобы спиннер был синглтоном?

спасибо

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Создайте Base Controller с вашим счетчиком , затем наследуйте другие контроллеры от вас Base Controller и покажите счетчик, когда захотите .

class BaseViewController: UIViewController {

    var activityIndicator: UIActivityIndicatorView!

    override func viewDidLoad() {
        super.viewDidLoad()

        activityIndicator = UIActivityIndicatorView(frame: CGRect(x: (UIScreen.main.bounds.width-40)/2, y: (UIScreen.main.bounds.height-40)/2, width: 40, height: 40))
        activityIndicator.transform = CGAffineTransform(scaleX: 2, y: 2)
        activityIndicator.color = .darkGray
        view.addSubview(activityIndicator)
    }
}

class ViewController: BaseViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        activityIndicator.startAnimating() // you can show the spinner wherever you want.
    }
}

надеюсь, это поможет вам.

0 голосов
/ 01 июля 2019

Я предлагаю вам создать класс util и сделать этот класс Singleton.

import UIKit
class Util {
    static let shared = Util()
    private init(){}

    var loader: MyIndicator?

    func showLoader(view: UIView){
        hideLoader()
        let rosetaGIF = UIImage(named: "wheel.png")
         loader = MyIndicator(frame: CGRect(x: 0, y: 0, width: (rosetaGIF?.size.width)!/2, height: (rosetaGIF?.size.height)!/2), image: rosetaGIF!)
        view.addSubview(loader!)
        view.alpha = 0.5
        loader?.startAnimating()
    }

    func hideLoader(){
        loader?.stopAnimating()
        loader?.removeFromSuperview()
    }
}

Как использовать этот класс

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        Util.shared.showLoader(view: view) // for showing the loader
        Util.shared.hideLoader() // for hiding the loader
    }
}
...