在 iOS 中,主屏幕和一些系统应用程序(如 App Store)的设计使画中画窗口不覆盖底部导航栏。如何在我的应用程序中执行此操作?
我正在制作一个 SwiftUI 聊天应用程序,屏幕底部有一个输入框。我该如何避免该输入框上显示画中画视频并使其像 App Store 中那样稍微向上移动?
像这样:
var body: some View {
VStack(spacing: 0) {
HStack(alignment: .bottom) {
ComposerInputView(
factory: DefaultViewFactory.shared,
text: $viewModel.text,
)
}
}
}
}
要防止画中画 (PiP) 窗口覆盖 iOS SwiftUI 应用程序中的某些区域(例如底部输入框),您可以使用 iOS 16 及更高版本中提供的
smallestUnobscuredContentGuide
属性。此属性提供了一个布局指南,表示未被系统 UI 元素(如画中画窗口)覆盖的区域。
在 SwiftUI 中; 创建一个ObservableObject来观察未遮挡内容区域的变化
import SwiftUI
class UnobscuredContentViewModel: ObservableObject {
@Published var unobscuredHeight: CGFloat = 0.0
init() {
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
let guide = windowScene.smallestUnobscuredContentGuide
guide?.owningView?.layoutIfNeeded()
unobscuredHeight = guide?.layoutFrame.height ?? 0.0
NotificationCenter.default.addObserver(
self,
selector: #selector(updateUnobscuredHeight),
name: UILayoutGuide.layoutFrameDidChangeNotification,
object: guide
)
}
}
@objc func updateUnobscuredHeight(notification: Notification) {
if let guide = notification.object as? UILayoutGuide {
self.unobscuredHeight = guide.layoutFrame.height
}
}
}
使用观察到的无障碍高度调整 SwiftUI 视图
struct ContentView: View {
@StateObject var viewModel = UnobscuredContentViewModel()
var body: some View {
VStack(spacing: 0) {
// Your main content
Spacer()
HStack(alignment: .bottom) {
ComposerInputView(
factory: DefaultViewFactory.shared,
text: $viewModel.text
)
}
.padding(.bottom, viewModel.unobscuredHeight)
}
}
}
此方法可确保当画中画窗口处于活动状态时,您的输入框会相应向上移动,避免任何重叠。