Ios Don';当UIActivityIndicatorView加载速度足够快(少于一秒)时,它不会显示UIActivityIndicatorView
我想知道当数据加载速度足够快(例如不到一秒钟)时,是否可以不显示Ios Don';当UIActivityIndicatorView加载速度足够快(少于一秒)时,它不会显示UIActivityIndicatorView,ios,swift,uiactivityindicatorview,Ios,Swift,Uiactivityindicatorview,我想知道当数据加载速度足够快(例如不到一秒钟)时,是否可以不显示UIActivityIndicatorView 在我当前的应用程序中,每次新的搜索都会重新加载我的收藏视图,但有时搜索速度非常快,指示器视图会闪烁并立即消失,给应用程序带来一种丑陋的整体感觉 因此,基本上我的问题是:当加载足够快时,我可以“禁用”UIActivityIndicator视图吗?一旦你向服务器发送响应,设置一个计时器。如果你在几秒钟内收到响应,你可以隐藏uiactivity indicator activityindic
UIActivityIndicatorView
在我当前的应用程序中,每次新的搜索都会重新加载我的收藏视图,但有时搜索速度非常快,指示器视图会闪烁并立即消失,给应用程序带来一种丑陋的整体感觉
因此,基本上我的问题是:当加载足够快时,我可以“禁用”UIActivityIndicator视图吗?一旦你向服务器发送响应,设置一个计时器。如果你在几秒钟内收到响应,你可以隐藏uiactivity indicator
activityindicator.hidden =false
对UIActivityIndicatorView进行子类化,并重写setter以显示视图。在此处设置计时器,使其仅在2秒后显示。如果在此之前取消活动指示器,则不会显示任何内容。如果无法知道您的数据使用了多少时间,您可以使用计时器或延迟功能延迟显示您的
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框架来处理网络流,您还可以使用良好的AlamofireNetworkActivityIndicator来处理:
您可以简单地延迟启动指示器动画:
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()
}
}
}
使用这个类,如果回调发生的时间少于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()
}
}
}
view.hidden=true
?但问题是,如果加载时间为1.5秒,则在第一秒钟它不会显示任何内容,然后闪烁0.5秒
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()
}
}
}