Swift中倒计时计时器结束后重启按钮不显示问题解决
问题原因及解决办法
核心问题
你的重启按钮无法显示主要有两个原因:
- 按钮和进度条的Y轴位置重叠(都设为100),被进度条完全遮挡
- 按钮未设置文字颜色或背景色,即便不重叠,在白色背景下默认白色文字也会和背景融合,无法看见
另外,计时器结束的判断逻辑存在浮点精度隐患,可能导致timeElapsed >= duration的条件偶尔不触发。
具体修复步骤
- 调整按钮位置:把按钮的Y坐标改得比进度条低,比如设为150,避免重叠
- 设置按钮样式:给按钮添加背景色或文字颜色,确保可见
- 优化计时器结束判断:用进度值是否达到1.0来判断,避免浮点累加的精度问题
修改后的完整代码
class TimerViewController: UIViewController { let duration: Double = 5 // duration in seconds var timer: Timer? var progressView: UIProgressView! var timeElapsed: Double = 0 // 将按钮设为成员变量,提前创建避免重复实例化,也方便控制显示隐藏 var restartButton: UIButton! override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 明确背景色,避免样式混乱 // 创建进度条 progressView = UIProgressView(progressViewStyle: .default) progressView.frame = CGRect(x: 20, y: 100, width: view.frame.width - 40, height: 10) progressView.progress = 0 view.addSubview(progressView) // 提前创建重启按钮,初始隐藏 restartButton = UIButton(type: .system) restartButton.frame = CGRect(x: view.frame.width/2 - 50, y: 150, width: 100, height: 50) restartButton.setTitle("Restart", for: .normal) restartButton.addTarget(self, action: #selector(restartTimer), for: .touchUpInside) restartButton.isHidden = true view.addSubview(restartButton) // 启动计时器 startTimer() } func startTimer() { timer?.invalidate() // 先销毁已有计时器,避免重复 timeElapsed = 0 progressView.progress = 0 restartButton.isHidden = true timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true) } @objc func timerFired() { timeElapsed += 0.01 let progress = Float(timeElapsed / duration) progressView.progress = progress // 用进度值判断结束,规避浮点精度问题 if progress >= 1.0 { timer?.invalidate() timerEnded() } } func timerEnded() { print("Ended") restartButton.isHidden = false // 显示重启按钮 } @objc func restartTimer() { startTimer() // 复用启动逻辑,减少代码冗余 } }
额外优化点
- 将重启按钮设为成员变量,提前创建并隐藏,计时器结束时再显示,避免重复创建视图
- 封装
startTimer()方法,统一处理计时器启动逻辑,减少代码重复 - 设置视图背景色为白色,确保界面样式统一
内容的提问来源于stack exchange,提问作者plzhelpme
相关产品推荐
相关产品推荐

