【问题标题】:Don't show UIActivityIndicatorView when it loads fast enough (less than a second)当 UIActivityIndi​​catorView 加载足够快时(不到一秒)不显示
【发布时间】:2016-06-22 09:26:37
【问题描述】:

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

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

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

【问题讨论】:

  • view.hidden = true?
  • 但问题是,如果加载时间是 1.5 秒,那么第一秒它不会显示任何内容,然后闪烁 0.5 秒

标签: ios swift uiactivityindicatorview


【解决方案1】:

使用这个类,如果回调发生的时间少于 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()
        }
    }
}

【讨论】:

    【解决方案2】:

    一旦您对服务器做出响应,请设置一个计时器。如果您在几秒钟内收到响应,您可以隐藏被隐藏的 uiactivity 指示器

    activityindicator.hidden =false 
    

    【讨论】:

      【解决方案3】:

      子类 UIActivityIndi​​catorView 并覆盖设置器以显示视图。在此处设置一个计时器,使其仅在 2 秒后显示。如果在此之前关闭活动指示器,则不会显示任何内容。

      【讨论】:

        【解决方案4】:

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

        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()
                    }
                }
        }
        

        【讨论】:

          【解决方案5】:

          如果无法知道您的数据占用了多少时间,您可以使用计时器或延迟函数来延迟 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多