加载速度足够快(不到一秒)时,不要显示UIActivityIndi catorView

问题描述 投票:1回答:5

我想知道当你的数据加载足够快时(例如不到一秒),是否有可能不显示UIActivityIndicatorView

在我当前的应用程序中,我的集合视图会在每次新搜索时重新加载,但有时搜索速度非常快,指示器视图会立即闪烁并消失,从而给应用程序带来难看的整体感觉。

所以基本上我的问题是:当我的装载足够快时,我可以“禁用”UIActivityIndicatorView吗?

ios swift uiactivityindicatorview
5个回答
0
投票

一旦你对服务器发出响应就设置一个计时器。如果你得到一个响应,你可以在几秒钟内隐藏隐藏的uiactivity指标

activityindicator.hidden =false 

0
投票

子类UIActivityIndi​​catorView并覆盖用于显示视图的setter。在此设置计时器仅在2秒后显示。如果活动指示器在此之前被解除,则不会显示任何内容。


0
投票

您可以简单地延迟启动指标动画:

var inUpdate = false
let indicatorView = UIActivityIndicatorView()

func startUpdate()
{
    // go to update request
    // do not forget to set inUpdate property to false in update completeon

    inUpdate = true
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC))), dispatch_get_main_queue())
        {
            [weak self] in
            if self?.inUpdate == true
            {
                self!.indicatorView.startAnimating()
            }
        }
}

0
投票

如果无法知道您的数据采用了多少时间,您可以使用计时器或延迟功能延迟显示UIActivityIndicator

func delay(seconds seconds: Double, completion:()->()) {
        let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds ))

        dispatch_after(popTime, dispatch_get_main_queue()) {
            completion()
        }
}

使用:

self.delay(seconds: 0.5, completion: {
            // show my activityindicator 
}

如果您使用Alamofire框架来处理您的网络流量,您还可以使用良好的AlamofireNetworkActivityIndi​​cator here

NetworkActivityIndicatorManager.sharedManager.startDelay = 1.0

0
投票

如果回调发生的时间不到1秒,我就不会显示活动指示符。

final class DelayableActivityIndicatorView: UIActivityIndicatorView {
    static let kDefaultDelay: TimeInterval = 1
    private var inProgress = false

    func startAnimatingWithDelay(_ delay: TimeInterval = kDefaultDelay) {
        inProgress = true
        DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
            if self.inProgress == true {
                self.startAnimating()
            }
            self.inProgress = false
        }
    }

    func stopAnimatingWithDelay() {
        inProgress = false
        stopAnimating()
    }
}

要在视图控制器中使用它,

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        self.view = view
    }

    var spinner: DelayableActivityIndicatorView = {
       let view = DelayableActivityIndicatorView(style: .gray)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(spinner)
        spinner.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        spinner.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        spinner.startAnimatingWithDelay()

        // replace this code with your network api
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.spinner.stopAnimatingWithDelay()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.