更改 SwiftUI 中的弹出窗口大小

2023-12-26

我正在尝试为弹出窗口设置一定的大小或使其适应其内容

我尝试从弹出窗口更改视图的框架,但它似乎不起作用

Button("Popover") {
        self.popover7.toggle()
}.popover(isPresented: self.$popover7, arrowEdge: .bottom) {
         PopoverView().frame(width: 100, height: 100, alignment: .center)
}

我想实现在 iPad 的日历应用程序中发现的这种行为


@ccwasden 的解决方案效果很好。我通过使其在 SwiftUI 方面更加“自然”来扩展他的工作。另外,这个版本还利用了sizeThatFits方法,因此您不必指定弹出窗口内容的大小。

struct PopoverViewModifier<PopoverContent>: ViewModifier where PopoverContent: View {
    @Binding var isPresented: Bool
    let onDismiss: (() -> Void)?
    let content: () -> PopoverContent

    func body(content: Content) -> some View {
        content
            .background(
                Popover(
                    isPresented: self.$isPresented,
                    onDismiss: self.onDismiss,
                    content: self.content
                )
            )
    }
}

extension View {
    func popover<Content>(
        isPresented: Binding<Bool>,
        onDismiss: (() -> Void)? = nil,
        content: @escaping () -> Content
    ) -> some View where Content: View {
        ModifiedContent(
            content: self,
            modifier: PopoverViewModifier(
                isPresented: isPresented,
                onDismiss: onDismiss,
                content: content
            )
        )
    }
}

struct Popover<Content: View> : UIViewControllerRepresentable {
    @Binding var isPresented: Bool
    let onDismiss: (() -> Void)?
    @ViewBuilder let content: () -> Content

    func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self, content: self.content())
    }

    func makeUIViewController(context: Context) -> UIViewController {
        return UIViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        context.coordinator.host.rootView = self.content()
        if self.isPresented, uiViewController.presentedViewController == nil {
            let host = context.coordinator.host
            host.preferredContentSize = host.sizeThatFits(in: CGSize(width: Int.max, height: Int.max))
            host.modalPresentationStyle = UIModalPresentationStyle.popover
            host.popoverPresentationController?.delegate = context.coordinator
            host.popoverPresentationController?.sourceView = uiViewController.view
            host.popoverPresentationController?.sourceRect = uiViewController.view.bounds
            uiViewController.present(host, animated: true, completion: nil)
        }
    }

    class Coordinator: NSObject, UIPopoverPresentationControllerDelegate {
        let host: UIHostingController<Content>
        private let parent: Popover

        init(parent: Popover, content: Content) {
            self.parent = parent
            self.host = UIHostingController(rootView: content)
        }

        func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {
            self.parent.isPresented = false
            if let onDismiss = self.parent.onDismiss {
                onDismiss()
            }
        }

        func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
            return .none
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 SwiftUI 中的弹出窗口大小 的相关文章

随机推荐

  • 如何安装QPSQL驱动程序? [复制]

    这个问题在这里已经有答案了 我试图与我的PSQL数据库 但当我检查时 dbliste QtSql QSqlDatabase drivers print dbliste 我懂了 QSQLITE QODBC QODBC3 为什么我没有驱动程序Q
  • 如何更改“DivideByZeroException”的抛出处理?

    我想给int类似的行为float 即使其能够除以 0but我希望它返回0 此外 我想超载 运算符为int返回一个浮点数 我知道该怎么做 但只是为了完整性而提到 我不想检查每个除法的分母是否为 0 我也宁愿不等待抛出异常 因为异常速度很慢 理
  • 彩色框中的文本

    我正在创建一个简单的 HTML CSS 作品集网站 我正在努力寻找一种方法来按照图片中显示的方式设置以下文本的样式 值得注意的是 我已经取得了一些成果 但问题是这里的文本不是从左到右居中的 这更多的是随机排列 我不知道如何实现这一点 另请记
  • 注释不同 Symfony 2 / Doctrine 2

    这两者有什么区别 ORM ManyToOne targetEntity Category inversedBy products cascade remove ORM JoinColumn name category id referenc
  • Vim 和 Ruby - 匹配“do”和“end”?

    我相信我们都熟悉 意外的 kEnd 问题 对我来说 追踪它们总是很麻烦 因为 Vim 不匹配 do 和 end 显然 其他以 end 结尾的元素 例如 if 有没有办法配置 Vim 显示这些匹配项以帮助简化调试 如果您使用的是最新的 vim
  • 为什么 Razor Pages 脚手架对索引、详细信息和删除页面使用 HTML 帮助程序(而不是标记帮助程序)?

    我最近使用 Razor Pages 开始了我的第一个项目 我使用 EF Core 并将我的所有模型搭建到 CRUD Razor Pages 中 我注意到生成的创建和编辑 Razor 页面使用标签帮助程序来显示数据 IE div class
  • 使用 jQuery.load 加载 html 后,如何使用 MathJax 格式化 html?

    我正在使用 jQuery load 加载新页面 然而 内容却以某种方式被奇怪地对待 在原始页面上 我有一些使用 MathJax 格式化乳胶命令的代码 这对于原始文件来说效果很好 但是 当我单击链接并将更多 HTML 插
  • 如何在 iOS 12 或更早版本中集成 Apple 登录? [复制]

    这个问题在这里已经有答案了 我的应用程序因第三方登录服务而被拒绝 因此 我为 iOS 13 实现了 使用 Apple 登录 问题是如何为 iOS 12 或更早版本提供向后兼容性 就我而言 只有当我避免导入时它才有效 适用于 iOS12 及更
  • 发布Python标准库的一部分

    如何将 Python 中的一些标准模块与我的代码一起发送 我正在为 Anki 编写一个附加组件 我需要它Queue and threading模块来自Python2 7标准库 当我尝试启动 Anki 时 我得到ImportError No
  • windows azure 中的 Svgs 和其他 mime 类型

    您好 我正在 Windows Azure 上的 NodeJS 中设置一个网站 并且希望包含 svg 作为背景图像 一般情况下我如何允许 svgs 和 mimetypes Azure 的用途IISNode https github com t
  • 制作 dplyr 过程的自定义函数

    我想为这个修改后的 dplyr 过程创建一个自定义函数 在 R 数据框中用 NA 随机替换每组值的百分比 https stackoverflow com questions 64034962 randomly replacing perce
  • 我的脚本运行时是否调用了 setInterval 处理程序?

    我计划使用 setInterval 简单地将一个变量设置为 false 主循环将检查该变量以停止 示例 注意 这只是一个示例 实际代码不是易于重构的 while 循环 而是实际上由闭源软件生成的相当复杂且执行时间较长的脚本 var runn
  • 如何使用应用程序名称杀死应用程序?

    有没有办法从应用程序名称获取包名称 例如 如果应用程序名称是 location 我可以获取其包名称 com android location 以便我可以使用 am killBackgroundProcesses 包名 或者有人知道任何可以使
  • 有没有办法激活控件 WebView 桌面模式而不是移动模式?

    有没有办法激活控件 WebView 桌面模式而不是移动模式
  • 在 SQL 中使用不同值更新多行

    我有一个这样的表 SKU Size A 10 B 10 C 10 D 10 E 10 F 10 G 10 我想把它改成 SKU Size A 20 B 10 C 30 D 10 E 80 F 10 G 60 我有超过 3000 行记录需要更
  • Work Light 6.1 Android 应用程序渲染所有视图,无需小部件

    我使用 Worklight 6 1 Dojo 1 8 开发了一个混合应用程序 该应用程序使用 Chrome Common Android 测试结果良好 当我将设备部署到运行 4 3 版本的 Nexus 7 平板电脑时 我的所有视图都会一起出
  • 如何在 Swift 中从二维码保存 vCard

    swift 中二维码的输出是一个字符串 我需要保存QR Code如果代码包含vCard with swift 我收到一条错误消息 指出它无法将 CNContacts 转换为 CNMutableContacts func foundCode
  • 如何在php中在特定日期或时间自动发送电子邮件?

    我开发了一个用于用户注册的网站 但我需要一个我从未体验过的功能 我需要的功能是向刚刚注册的用户发送一封电子邮件 并附加一个 pdf 文件 注册 15 天后 系统将自动向该用户发送一封电子邮件 请指导我如何使用 mySQL 数据库在 PHP
  • KRL RSS 解析器:处理编码问题?

    我正在将 RSS 提要从 Tumblr 导入到 Kynetx 应用程序中 RSS 提要似乎存在一些编码问题 因为撇号如下所示 提要 您可以找到here http instancevariable tumblr com rss 声称以 UTF
  • 更改 SwiftUI 中的弹出窗口大小

    我正在尝试为弹出窗口设置一定的大小或使其适应其内容 我尝试从弹出窗口更改视图的框架 但它似乎不起作用 Button Popover self popover7 toggle popover isPresented self popover7