Вы могли бы использовать GCD, как в ответе Аспери, но это не объясняет, почему ваш код не работал.
Проблема в том, что, хотя представление прокрутки отслеживает ваше касание, оно запускает прогон l oop в режиме .tracking
. Но поскольку вы создали Timer
с использованием scheduledTimer(withTimeInterval:repeats:block:)
, Timer
настроен на работу только в режиме .default
.
Вы можете добавить таймер для всех общих режимов запуска l oop (включая .tracking
), например:
RunLoop.main.add(timer, forMode: .common)
Но я бы, вероятно, вместо этого использовал бы издателя Combine, например:
class Model: ObservableObject, Identifiable {
@Published var offset: CGFloat = 0
let id = UUID()
private var tickets: [AnyCancellable] = []
init() {
Timer.publish(every: 0.5, on: RunLoop.main, in: .common)
.autoconnect()
.map { _ in CGFloat.random(in: 0...300) }
.sink { [weak self] in self?.offset = $0 }
.store(in: &tickets)
}
}