AVPlayerViewController 播放速度的自定义控件
Custom control for playback speed for AVPlayerViewController
- 我们可以添加自定义播放速度(0.5、1.0、1.5、2.0)控制到
AVPlayerViewController
吗?
- 有没有一种方法可以使用
UISlider
值更改来刷新速度?
- 如果正在播放,我们可以改变播放速度吗?
- Can we add custom playback speed (0.5, 1.0, 1.5, 2.0) control to
AVPlayerViewController
?
您可以通过一些技巧将自定义播放速度按钮添加到 AVPlayerViewController
。
在iOS 11中,即,您可以通过在“Play/Pause旁边添加控件来向AVPlayerViewController
添加一个按钮“ 按钮。该按钮具有可帮助您找到该控件的可访问标识符。
所以,我所做的基本上就是找到“Play/Pause”按钮并将我的播放速度按钮添加到“Play/Pause”按钮。
func findPlayPauseButton(view: UIView) -> UIView? {
if view.accessibilityIdentifier == "Play/Pause" {
return view
}
for subview in view.subviews {
if let result = findPlayPauseButton(view: subview) {
return result
}
}
return nil
}
guard let playerView = playerViewController?.view else {
return
}
guard let playPauseButton = findPlayPauseButton(view: playerView) else {
return
}
if let playerControlsView = playPauseButton.superview {
let playbackSpeedButton = UIButton(type: .system)
playbackSpeedButton.accessibilityIdentifier = "PlaybackSpeed"
playbackSpeedButton.setTitle("1 X", for: .normal)
playbackSpeedButton.addTarget(self, action: #selector(self.playbackSpeedButtonTapped), for: .touchUpInside)
playbackSpeedButton.translatesAutoresizingMaskIntoConstraints = false
playerControlsView.addSubview(playbackSpeedButton)
NSLayoutConstraint.activate([
playbackSpeedButton.heightAnchor.constraint(equalTo: playPauseButton.heightAnchor),
playbackSpeedButton.widthAnchor.constraint(equalToConstant: 50),
playbackSpeedButton.leadingAnchor.constraint(equalTo: playPauseButton.trailingAnchor, constant: 70),
playbackSpeedButton.bottomAnchor.constraint(equalTo: playPauseButton.bottomAnchor),
])
}
结果:
你可能知道,这有很多缺点,因为你会发现所有的边缘情况,也就是说,你也需要注意景观,你需要检查 hack 是否仍然有效每个新的 iOS 版本等。如果您的应用程序支持 iOS 10,那么情况就不同了,因为 AVPlayerViewController
的 UI 在 iOS 11 中发生了变化。
- Is there a way we can refresh speed rate using an UISlider value change?
是的,不用 UIButton
来改变播放速度,只需添加一个 UISlider
。
- Can we change the playback speed if it is playing currently?
是的,如果它正在播放那么你只需要改变播放器的rate
属性:例如1.25 X => playerViewController.player?.rate = 1.25
.
更新:
请求增强!雷达编号为 46022646:Playback speed control for AVPlayerViewController (Video).
- 我们可以添加自定义播放速度(0.5、1.0、1.5、2.0)控制到
AVPlayerViewController
吗? - 有没有一种方法可以使用
UISlider
值更改来刷新速度? - 如果正在播放,我们可以改变播放速度吗?
- Can we add custom playback speed (0.5, 1.0, 1.5, 2.0) control to
AVPlayerViewController
?
您可以通过一些技巧将自定义播放速度按钮添加到 AVPlayerViewController
。
在iOS 11中,即,您可以通过在“Play/Pause旁边添加控件来向AVPlayerViewController
添加一个按钮“ 按钮。该按钮具有可帮助您找到该控件的可访问标识符。
所以,我所做的基本上就是找到“Play/Pause”按钮并将我的播放速度按钮添加到“Play/Pause”按钮。
func findPlayPauseButton(view: UIView) -> UIView? {
if view.accessibilityIdentifier == "Play/Pause" {
return view
}
for subview in view.subviews {
if let result = findPlayPauseButton(view: subview) {
return result
}
}
return nil
}
guard let playerView = playerViewController?.view else {
return
}
guard let playPauseButton = findPlayPauseButton(view: playerView) else {
return
}
if let playerControlsView = playPauseButton.superview {
let playbackSpeedButton = UIButton(type: .system)
playbackSpeedButton.accessibilityIdentifier = "PlaybackSpeed"
playbackSpeedButton.setTitle("1 X", for: .normal)
playbackSpeedButton.addTarget(self, action: #selector(self.playbackSpeedButtonTapped), for: .touchUpInside)
playbackSpeedButton.translatesAutoresizingMaskIntoConstraints = false
playerControlsView.addSubview(playbackSpeedButton)
NSLayoutConstraint.activate([
playbackSpeedButton.heightAnchor.constraint(equalTo: playPauseButton.heightAnchor),
playbackSpeedButton.widthAnchor.constraint(equalToConstant: 50),
playbackSpeedButton.leadingAnchor.constraint(equalTo: playPauseButton.trailingAnchor, constant: 70),
playbackSpeedButton.bottomAnchor.constraint(equalTo: playPauseButton.bottomAnchor),
])
}
结果:
你可能知道,这有很多缺点,因为你会发现所有的边缘情况,也就是说,你也需要注意景观,你需要检查 hack 是否仍然有效每个新的 iOS 版本等。如果您的应用程序支持 iOS 10,那么情况就不同了,因为 AVPlayerViewController
的 UI 在 iOS 11 中发生了变化。
- Is there a way we can refresh speed rate using an UISlider value change?
是的,不用 UIButton
来改变播放速度,只需添加一个 UISlider
。
- Can we change the playback speed if it is playing currently?
是的,如果它正在播放那么你只需要改变播放器的rate
属性:例如1.25 X => playerViewController.player?.rate = 1.25
.
更新:
请求增强!雷达编号为 46022646:Playback speed control for AVPlayerViewController (Video).