我正在尝试在拍摄视频时创建类似于SnapChat的应用。您应该按住一个按钮开始拍摄视频,然后在完成后释放它。我试图在7秒后实现超时功能,并使用Timer
对象实现进度条。但是,当我尝试触发计时器时,它只调用给定的选择器一次,即使我告诉它重复它也是如此。
这是我初始化按钮的代码:
let photoButton:UIButton = {
let but = UIButton(type: .custom)
but.layer.cornerRadius = 40
but.layer.borderColor = UIColor.white.cgColor
but.layer.borderWidth = 4
but.clipsToBounds = true
but.addTarget(self, action: #selector(takeVideo), for: .touchDown)
but.addTarget(self, action: #selector(stopVideo), for: [.touchUpInside, .touchUpOutside])
but.translatesAutoresizingMaskIntoConstraints = false
return but
}()
这是用户开始按住按钮时调用的函数takeVideo
。我在这里初始化并触发Timer
对象:
@objc func takeVideo() {
progressBar.isHidden = false
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProgressbar), userInfo: nil, repeats: true)
startTime = Date().timeIntervalSince1970()
timer?.fire()
}
这是函数stopVideo
,我将Timer
对象无效:
@objc func stopVideo() {
timer?.invalidate()
// stop video
}
这是updateProgressBar
函数:
@objc private func updateProgressbar() {
let maxLength = 7.0
let difference = Date().timeIntervalSince1970 - startTime!
progressBar.progress = Float(difference / maxLength)
if difference >= maxLength {
stopVideo() // Invalidates the timer and will stop video.
}
}
似乎this人有类似的问题,但当我尝试将他的答案用于使用异步呈现当前视图控制器时,它仍然不起作用。以下是我展示视频录制视图控制器的方法:
let recorder = RecorderViewController()
recorder.db = db
DispatchQueue.main.async(execute: {
self.present(recorder, animated: true, completion: nil)
})
修改:我已修复了Timer
对象的fireDate
属性的不正确性(修复程序也在上面的代码中修复)。它解决了我的问题。