如何在 iOS 应用程序中不允许 PiP 窗口覆盖在某些区域(如导航栏)?

问题描述 投票:0回答:1

在 iOS 中,主屏幕和一些系统应用程序(如 App Store)的设计使画中画窗口不覆盖底部导航栏。如何在我的应用程序中执行此操作?

我正在制作一个 SwiftUI 聊天应用程序,屏幕底部有一个输入框。我该如何避免该输入框上显示画中画视频并使其像 App Store 中那样稍微向上移动?

像这样:

    var body: some View {
        VStack(spacing: 0) {
            HStack(alignment: .bottom) {
                ComposerInputView(
                    factory: DefaultViewFactory.shared,
                    text: $viewModel.text,
                )
            }
        }
    }
}
ios swift swiftui
1个回答
0
投票

要防止画中画 (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)
        }
    }
}

此方法可确保当画中画窗口处于活动状态时,您的输入框会相应向上移动,避免任何重叠。

© www.soinside.com 2019 - 2024. All rights reserved.