我试图找出为什么在LazyVStack和ScrollView中使用AVPlayer时状态栏不显示很多小时,所以我做了一个最小的例子,只需要复制和粘贴:
import SwiftUI
import AVKit
struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}
struct ContentView: View {
@State var toolbarHeight: CGFloat = 64
@State var freeScreenHeight: CGFloat = 0
@State var toolbarOffset: CGFloat = 0
@State var lastScrollOffset: CGFloat = 0
@State var startChecking: Bool = false
@State var player = AVPlayer()
var videoUrl: String = "someExternal1:1ratioVideo"
init() {
UIScrollView.appearance().bounces = false
}
var body: some View {
ZStack(alignment: .leading){
VStack{
HStack(spacing: 10){
Text("toolbar")
Spacer()
}
.padding(.horizontal, 12.0)
.frame(height: toolbarHeight)
.background(Color.green)
.padding(.bottom, toolbarOffset)
.offset(y: toolbarOffset)
.zIndex(2)
Spacer()
}
.clipped()
.zIndex(2)
ScrollView(.vertical, showsIndicators: false){
LazyVStack(spacing: 0){
VStack{
}
.frame(width: round(UIScreen.main.bounds.width / 1.5), height: toolbarHeight + 8)
ForEach(1..<5) { index in
VideoPlayer(player: player)
.onAppear{
startChecking = true
}
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width)
.padding(.bottom, 10)
}
}
.background(GeometryReader {
Color.clear.preference(key: ViewOffsetKey.self,
value: -$0.frame(in: .named("scroll")).origin.y)
})
.onPreferenceChange(ViewOffsetKey.self) {
if(startChecking){
if($0 > lastScrollOffset){
let howMuch = $0 - lastScrollOffset
if((toolbarOffset - howMuch) < -toolbarHeight){
toolbarOffset = -toolbarHeight
}else{
toolbarOffset -= howMuch
}
}else{
let howMuch = lastScrollOffset - $0
if((toolbarOffset + howMuch) > 0){
toolbarOffset = 0
}else{
toolbarOffset += howMuch
}
}
}
lastScrollOffset = $0
}
}
.frame(height: freeScreenHeight)
}
.onAppear() {
player = AVPlayer(url: URL(string: videoUrl)!)
}
.preferredColorScheme(.dark)
.background(
GeometryReader { proxy in
Color.clear
.onAppear {
freeScreenHeight = UIScreen.main.bounds.height - proxy.safeAreaInsets.top - proxy.safeAreaInsets.bottom
}
}
)
.clipped()
}
}
这个bug的原因可能是什么?
1条答案
按热度按时间yzxexxkh1#
如果需要快速修复,可以使用
.statusBar(hidden:)
修饰符来显示状态栏。在
ZStack
的底部添加以下代码行: