Swift - UIProgressView 使用 NSTimer 时不流畅

swift

1个回答

写回答

1519654604

2025-08-22 02:15

+ 关注

CAD
CAD

使用NSTimer时,我们可能会遇到UIProgressView在更新进度时出现不流畅的情况。这是由于NSTimer的精确度和UI更新的频率不匹配所导致的。为了解决这个问题,我们可以采用其他方式来更新UIProgressView的进度,以获得更流畅的效果。

使用CADisplayLink进行更新

在解决UIProgressView不流畅的问题时,我们可以使用CADisplayLink来代替NSTimer进行UI的更新。CADisplayLink是一个和屏幕刷新频率相匹配的定时器,可以确保UI的更新和屏幕的刷新保持同步。

下面是使用CADisplayLink来更新UIProgressView进度的示例代码:

Swift

class ViewController: UIViewController {

@IBOutlet weak var progressView: UIProgressView!

var displayLink: CADisplayLink?

var progress: Float = 0.0

override func viewDidLoad() {

super.viewDidLoad()

displayLink = CADisplayLink(target: self, selector: #selector(updateProgress))

displayLink?.preferredFramesPerSecond = 60

displayLink?.add(to: .mAIn, forMode: .default)

}

@objc func updateProgress() {

progress += 0.01

if progress >= 1.0 {

displayLink?.invalidate()

}

progressView.setProgress(progress, animated: true)

}

}

在这个示例代码中,我们创建了一个CADisplayLink对象,并将其添加到主运行循环中。在每次屏幕刷新时,CADisplayLink会调用updateProgress方法来更新进度。我们使用一个变量progress来模拟进度的增加,并将其赋值给UIProgressView的progress属性。

使用GCD进行更新

除了使用CADisplayLink,我们还可以使用GCD(Grand Central Dispatch)来更新UIProgressView的进度。GCD是苹果提供的一种用于编写并发代码的技术,它可以帮助我们更好地管理多线程任务。

下面是使用GCD来更新UIProgressView进度的示例代码:

Swift

class ViewController: UIViewController {

@IBOutlet weak var progressView: UIProgressView!

var progress: Float = 0.0

override func viewDidLoad() {

super.viewDidLoad()

let queue = DispatchQueue(label: "progressQueue")

queue.async {

while self.progress < 1.0 {</p> DispatchQueue.mAIn.async {

self.progress += 0.01

self.progressView.setProgress(self.progress, animated: true)

}

Thread.sleep(forTimeInterval: 0.05)

}

}

}

}

在这个示例代码中,我们创建了一个串行队列,并在其中使用异步任务来更新进度。在每次更新进度时,我们通过调度到主队列中来更新UIProgressView的进度。为了控制更新的频率,我们使用Thread.sleep方法来暂停一小段时间。

通过使用CADisplayLink或GCD,我们可以解决使用NSTimer更新UIProgressView时不流畅的问题。这些方法能够更好地与屏幕刷新频率相匹配,从而获得更流畅的UI更新效果。无论是使用CADisplayLink还是GCD,我们都可以根据自己的需求选择适合的方法来更新UIProgressView的进度。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号