【问题标题】:How to make SwiftUI view fullscreen?如何让 SwiftUI 全屏显示?
【发布时间】:2019-11-06 02:06:22
【问题描述】:

正如标题所说,我正在尝试全屏显示视图(使其延伸到SafeArea),但SwiftUI 似乎总是将视图与safeArea 对齐。

在研究了一段时间后,我发现.edgesIgnoringSafeArea(.all) 这似乎是一种非常简单的方法。问题是它不起作用。视图仍然不是全屏。下面是一些示例代码:

struct ContentView : View {
    var body: some View {
        Text("Test")
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.all)
            .background(Color.red)
    }
}

【问题讨论】:

  • 我相信 edgesIgnoringSafeArea 所做的只是 center 忽略安全区域的视图内容。你的问题是真的 - 为什么你想忽略安全区域?几年来,Apple 一直在指导开发人员尊重安全区域 - 事实上,我相信很快就会(如果还没有提出拒绝理由的话。有一种方法(至少在 @ 987654327@) 以“忽略”安全区域...隐藏状态栏。也许在SwiftUI 中找到一种方法。
  • 感谢您的评论。隐藏状态栏确实有效,谢谢,但我想我会继续寻找解决方案而不必隐藏状态栏。我想忽略它的原因是我想在顶部显示一个 MKMapView,它也应该在缺口后面(就像在 Apple Maps 应用程序中一样)。它只是为了好看。
  • @dfd 有很多理由忽略安全区域;例如,您可能希望为视图提供自定义背景。如果你有一张图片作为背景,它看起来真的很难看,但顶部和底部都有白条。您不应该将诸如用户直接与之交互的 UI 元素之类的东西放在安全区域中,例如按钮。

标签: ios swift swiftui


【解决方案1】:

只需交换 ..background(Color.red) 和 .edgesIgnoringSafeArea(.all)。它会完美运行。

struct ContentView : View {

    var body: some View {
        Text("Test")
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .background(Color.red)
            .edgesIgnoringSafeArea(.all)

    }
}

【讨论】:

  • 这很奇怪,我实际上已经尝试过了,但现在它似乎工作了。也许这只是测试版中的一个小故障。还是谢谢。
  • 这是一个错误还是它应该如何工作?
  • 可能是错误,也可能不是。我不能肯定地说。但我意识到,如果我在 Text("Test") 之后给出背景颜色,它只会为字符串“Test”所采用的内容框架着色。但是,如果我在设置框架后给背景颜色,那么它将为整个框架着色。
  • 我认为这是一个错误....edgesIgnoringSafeArea(.all) 应该修改 View 的大小,.background(Color.red) 应该修改 View 的背景颜色。相反,.background() 似乎也在修改大小。
  • 这不是一个错误,它让您可以灵活地选择想要发生的事情,尽管在某种程度上会让人感到困惑和尴尬。基本上,颜色在被任何后续修改器调整大小之前应用于视图。首先应用颜色,然后应用填充之类的东西,额外的填充不着色。先做填充,然后着色,你会得到全尺寸视图的颜色。
【解决方案2】:

带有 SwiftUI 的增强现实 App 也有进入全屏的问题。 (Xcode 12.3,SwiftUI 5.3)

struct ContentView : View {
    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

以上代码来自 AR 模板。但是,它不起作用。

解决方案很棘手:您必须在“[yourTarget] -> General -> App Icons and Launch Images”中将“LaunchScreen.storyboard”设置为“Launch Screen File”。如果项目中没有“LaunchScreen.storyboard”,在该字段输入“LaunchScreen”仍然可以工作。

我在 Apple 论坛上找到了一个 similar discussion,它解释了失败的潜在原因:

如果设置不正确,那么听起来您的应用正在启动到兼容模式,该模式正在对您的应用进行信箱处理。

【讨论】:

  • 我遇到了同样的问题,但我使用的是 SwiftUI 和 SpriteKit。无论出于何种原因,它都不会进入全屏模式。即使我没有启动屏幕文件并且它有效,我也尝试了这个。花了几个小时在这个问题上摸不着头脑。不过,我很高兴它现在可以工作了。
【解决方案3】:

根据 iOS 14 中的 Apple documentation,您可以使用 fullScreenCover(item:onDismiss:content:)

这里是示例代码:

struct ContentView: View {
    @State private var isFullScreen = false
    var body: some View {
        ZStack{
        Color.yellow.edgesIgnoringSafeArea(.all)
        Text("Hello, FullScreen!")
            .padding()
            .background(Color.blue)
            .foregroundColor(.green)
            .cornerRadius(8)
            .fullScreenCover(isPresented: $isFullScreen) {
                FullScreen(isFullScreen: $isFullScreen)
            }
            .onTapGesture {
                isFullScreen.toggle()
            }
    }
    }
}

struct FullScreen: View {
    @Binding var isFullScreen: Bool
    
    var body: some View {
        ZStack {
            Color.red.edgesIgnoringSafeArea(.all)
            Text("This is full screen!!")
                .onTapGesture {
                    self.isFullScreen.toggle()
                }
            
        }
    }
}

【讨论】:

  • 虽然对于底层用例来说是一个非常好的解决方案,但并不是真正的全尺寸工作表解决方案。非常感谢,感谢您的代码。
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多