Skip to content

Instantly share code, notes, and snippets.

View mhijack's full-sized avatar
🎯
Focusing

Jianyuan Chen mhijack

🎯
Focusing
View GitHub Profile
[
"Africa/Abidjan",
"Africa/Accra",
"Africa/Addis_Ababa",
"Africa/Algiers",
"Africa/Asmara",
"Africa/Bamako",
"Africa/Bangui",
"Africa/Banjul",
"Africa/Bissau",
[
"WAT": "Africa/Lagos",
"EAT": "Africa/Addis_Ababa",
"MDT": "America/Denver",
"ICT": "Asia/Bangkok",
"TRT": "Europe/Istanbul",
"PHT": "Asia/Manila",
"CAT": "Africa/Harare",
"EET": "Europe/Athens",
"SGT": "Asia/Singapore",
periodicTimeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(value: CMTimeValue(1), timescale: 2), queue: DispatchQueue.main) {[weak self] (progressTime) in
print("periodic time: \(CMTimeGetSeconds(progressTime))")
self?.updatePlaybackProgress(progressTime: progressTime)
}
let seekTime = PlayerPlaybackTimeFormatter.getConvertedCMTimeByProgress(player: player, progress: progressWhenSliderIsReleased)
player.seek(to: seekTime, toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] _ in
guard let `self` = self else { return }
print("Player time after seeking: \(CMTimeGetSeconds(self.player.currentTime()))")
}
/// Used to prevent progress bar updating while manually changing progress
public private(set) var isScrubbingInProgress: Bool = false
if !self.playbackManager.isScrubbingInProgress {
/// Do not let scrubbing interfere with periodic observer
self.controlsView.setProgress(progress: Float(self.playbackManager.currentPlaybackProgress))
self.controlsView.updateCurrentTime(label: PlayerPlaybackTimeFormatter.getCurrentTimeFormatted(player: self.playbackManager.player)) /// update current time with playback current time
}
private var progressBarHighlightedObserver: NSKeyValueObservation?
private lazy var progressBar: UISlider = {
let bar = UISlider()
bar.minimumTrackTintColor = .red
bar.maximumTrackTintColor = .white
bar.value = 0.0
bar.isContinuous = false
bar.addTarget(self, action: #selector(handleSliderChange), for: .valueChanged)
self.progressBarHighlightedObserver = bar.observe(\UISlider.isTracking, options: [.old, .new]) { (_, change) in
public private(set) var isSeekInProgress = false /// Used to notify whether to update playback progress bar
func manualSeekToProgress(progress: Float) {
self.isSeekInProgress = true /// Mark
let seekTime = PlayerPlaybackTimeFormatter.getConvertedCMTimeByProgress(player: player, progress: progress)
player.seek(to: seekTime, toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] _ in
guard let `self` = self else { return }
print("Player time after seeking: \(CMTimeGetSeconds(self.player.currentTime()))")
self.isSeekInProgress = false /// Unmark
private var button: UIButton = UIButton()
button.setTitle(NSLocalizedString("other-view-controller-button", value: "Button", comment: "Action button title in Other page"), for: .normal)
class ResponderViewController: UIViewController {
private var redView = UIView()
private var greenView = UIView()
private var blueView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
view.subviews(redView.subviews(greenView).subviews(blueView))