我想弄明白为什么在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()
    }
}

这个漏洞的原因可能是什么?

推荐答案

如果需要快速修复,可以使用.statusBar(hidden:)修改器来显示状态栏.

ZStack的底部添加以下代码行:

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

Ios相关问答推荐

React Native Text组件内部TextInput组件在iOS上的问题:在TextInput组件内部键入文本时失go 焦点

iOS中的分段拾取器—手柄点击已 Select 的项目

Fastlane,iOS Provisioning Profile推送通知权限(通过示例)&

视图未更新以在按下按钮时显示另一个视图

执行devicectl:ProcessException时出错:进程异常退出:错误:命令超时超过5.0秒

使用异步重载实现Swift协议一致性

当任何 TextEditor 有多于一行时,所有 TextEditor 都会调整大小

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

React Native IOS base64 编码图像不显示

SwiftUI 菜单中的内联水平按钮

如何仅更改一个视图的导航标题 colored颜色 ?

如何在保持纵横比的同时zoom UIView 的内容以适应目标矩形?

如何阻止图像在 UIImageView 中拉伸?

在 UITextView 中垂直居中文本

如何从一个特定的视图控制器中隐藏导航栏

关闭通过模态 segue 显示的视图

呈现和关闭模态视图控制器

如何计算 Swift 数组中元素的出现次数?

Objective-C 将 NSDate 设置为当前 UTC

Xcode中的终端窗口?