在触发

时间:2018-05-22 15:54:26

标签: ios swift timer nstimer

我正在尝试在拍摄视频时创建类似于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属性的不正确性(修复程序也在上面的代码中修复)。它解决了我的问题。

0 个答案:

没有答案