【发布时间】:2022-06-20 02:23:36
【问题描述】:
我正在开发一个分形时钟应用程序,该应用程序在其主视图中显示基于时钟指针的动画分形。我希望我的应用程序的用户能够进入全屏模式,其中所有不必要的 UI 都被暂时隐藏,只有动画仍然可见。我正在寻找的行为类似于 Apple 的 Photos 应用程序,其中可以点击当前显示的图像,以便导航栏、底部栏、状态栏和主页指示器淡出,直到再次点击图像。
隐藏导航栏和状态栏就像找到正确的视图修饰符来传递隐藏条件一样简单。但据我所知,目前 SwiftUI 无法在不引入 UIKit 的情况下隐藏主页指示器。
在 Stack Overflow 上,我发现 this solution by Casper Zandbergen 有条件地隐藏 home 指示器并将其用于我的项目。 它可以工作,但遗憾的是带来了一个不可接受的副作用:主视图现在不再延伸到状态栏和主页指示器下方,这有两个含义:
- 使用相关 SwiftUI 修改器隐藏状态栏时,主视图的空间会随着隐藏状态栏的高度而增长,从而中断分形动画的显示。
- 隐藏的主页指示器始终保留黑色底栏,以防止全屏显示主视图。
我希望有良好 UIKit 经验的人可以帮助我解决这个问题。请记住,我是 SwiftUI 的初学者,而且我基本上没有使用 UIKit 的经验。提前致谢!
import SwiftUI
struct ContentView: View {
@StateObject var settings = Settings()
@State private var showSettings = false
@State private var hideUI = false
var body: some View {
NavigationView {
GeometryReader { proxy in
let radius = 0.5 * min(proxy.size.width, proxy.size.height) - 20
FractalClockView(settings: settings, clockRadius: radius)
}
.ignoresSafeArea(.all)
.toolbar {
Button(
action: { showSettings.toggle() },
label: { Label("Settings", systemImage: "slider.horizontal.3") }
)
.popover(isPresented: $showSettings) { SettingsView(settings: settings) }
}
.navigationBarTitleDisplayMode(.inline)
.onTapGesture {
withAnimation { hideUI.toggle() }
}
.navigationBarHidden(hideUI)
.statusBar(hidden: hideUI)
.prefersHomeIndicatorAutoHidden(hideUI) // Code by Amzd
}
.navigationViewStyle(.stack)
}
}
【问题讨论】: