ios SwiftUI故障/错误-在LazyVStack和ScrollView中使用AVPlayer时,状态栏不显示

e5nqia27  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(126)

我试图找出为什么在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的原因可能是什么?

yzxexxkh

yzxexxkh1#

如果需要快速修复,可以使用.statusBar(hidden:)修饰符来显示状态栏。
ZStack的底部添加以下代码行:

} // ZStack ends here
 .statusBar(hidden: false) // <---- here *****
 .onAppear() {
      player = AVPlayer(url: URL(string: videoUrl)!)
 }
 .preferredColorScheme(.dark)
 .background(
     GeometryReader { proxy in ........

相关问题