按下按钮时,Swiftui中的AVPLayer将重置



我有一个视频播放器,下面有标题文本。当你点击文本时,我会使其字体增大。但当你增加字体大小时,会导致视频停止播放并重新启动。我不希望发生这种事。我希望视频播放时不受字体增加的影响。我对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)!)
}
}

最新更新