Я пытаюсь создать приложение, похожее на 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
function:
@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.
}
}
Похоже, у этого человека возникла похожая проблема, но когда я попытался включить его ответ о представлении текущего контроллера представления с помощью асинхронного, он все еще нене работаетВот как я представляю контроллер представления видеозаписи:
let recorder = RecorderViewController()
recorder.db = db
DispatchQueue.main.async(execute: {
self.present(recorder, animated: true, completion: nil)
})
Редактировать: Я исправил ошибку, касающуюся свойства fireDate
объекта Timer
(исправление также исправлено ввышеуказанный код).Это исправило мою проблему.