我有一个视频播放器,下面有标题文本。当你点击文本时,我会使其字体增大。但当你增加字体大小时,会导致视频停止播放并重新启动。我不希望发生这种事。我希望视频播放时不受字体增加的影响。我对swiftUI很陌生。
import SwiftUI
导入AVKit
structTEST:查看{
@State private var tapped: Bool = false
@State private var draggedOffset = CGSize.zero
@State private var fontSize: CGFloat = 20 // Change Font Size
var body: some View {
VStack {
VideoPlayer(player: AVPlayer(url: URL(string: "http://www.unisonprinting.com/0celot/dune/dune.mp4")!))
.aspectRatio(3/2, contentMode: .fit)
Text ("VIDEO TITLE")
.foregroundColor(.white)
.font(.system(size: fontSize))
.onTapGesture {
if self.fontSize < 44 {
self.fontSize = self.fontSize + 12
} else {
self.fontSize = 20
}
}
}//V
}
}
现在,每个View
的主体都被渲染,一个新的AVPlayer
被创建,导致视频停止播放并重新启动。
您可以通过将AVPlayer
存储在@State
变量中来避免这种情况,该变量在渲染中持续存在:
struct TEST: View {
@State private var tapped: Bool = false
@State private var draggedOffset = CGSize.zero
@State private var fontSize: CGFloat = 20 // Change Font Size
@State private var player = AVPlayer(url: URL(string: "https://www.unisonprinting.com/0celot/dune/dune.mp4")!)
var body: some View {
VStack {
VideoPlayer(player: player)
.aspectRatio(3/2, contentMode: .fit)
Text ("VIDEO TITLE")
.foregroundColor(.blue)
.font(.system(size: fontSize))
.onTapGesture {
if self.fontSize < 44 {
self.fontSize = self.fontSize + 12
} else {
self.fontSize = 20
}
}
}
}
}
基于注释的更新,显示了如何让VideoPlayer
根据不断变化的URL参数加载不同的AVPlayer
的一种可能解决方案:
struct ContentView: View {
var url : String = "https://www.unisonprinting.com/0celot/dune/dune.mp4"
@State private var tapped: Bool = false
@State private var draggedOffset = CGSize.zero
@State private var fontSize: CGFloat = 20 // Change Font Size
@State private var player : AVPlayer?
var body: some View {
VStack {
if let player = player {
VideoPlayer(player: player)
.aspectRatio(3/2, contentMode: .fit)
}
Text ("VIDEO TITLE")
.foregroundColor(.blue)
.font(.system(size: fontSize))
.onTapGesture {
if self.fontSize < 44 {
self.fontSize = self.fontSize + 12
} else {
self.fontSize = 20
}
}
}
.onAppear {
setPlayerToUrl(url)
}
.onChange(of: url) { url in
setPlayerToUrl(url)
}
}
func setPlayerToUrl(_ url: String) {
player = AVPlayer(url: URL(string: url)!)
}
}