上下文菜单的 SwiftUI 自定义视图

2023-12-07

我想在视图上长按手势时实现相同的自定义弹出视图,如照片(来自 Tweeter 应用程序)所示,这样我就可以同时显示自定义视图和上下文菜单。

enter image description here


您需要进行定制ContextMenu using UIContextMenu from UIKit.

struct ContextMenuHelper<Content: View, Preview: View>: UIViewRepresentable {
    var content: Content
    var preview: Preview
    var menu: UIMenu
    var navigate: () -> Void
    init(content: Content, preview: Preview, menu: UIMenu, navigate: @escaping () -> Void) {
        self.content = content
        self.preview = preview
        self.menu = menu
        self.navigate = navigate
    }
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        view.backgroundColor = .clear
        let hostView = UIHostingController(rootView: content)
        hostView.view.translatesAutoresizingMaskIntoConstraints = false
        let constraints = [
            hostView.view.topAnchor.constraint(equalTo: view.topAnchor),
            hostView.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            hostView.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            hostView.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            hostView.view.widthAnchor.constraint(equalTo: view.widthAnchor),
            hostView.view.heightAnchor.constraint(equalTo: view.heightAnchor)
        ]
        view.addSubview(hostView.view)
        view.addConstraints(constraints)
        let interaction = UIContextMenuInteraction(delegate: context.coordinator)
        view.addInteraction(interaction)
        return view
    }
    func updateUIView(_ uiView: UIView, context: Context) {
    }
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }
    class Coordinator: NSObject, UIContextMenuInteractionDelegate {
        var parent: ContextMenuHelper
        init(_ parent: ContextMenuHelper) {
            self.parent = parent
        }
        func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
            return UIContextMenuConfiguration(identifier: nil) {
                let previewController = UIHostingController(rootView: self.parent.preview)
                return previewController
            } actionProvider: { items in
                return self.parent.menu
            }
        }
        func contextMenuInteraction(_ interaction: UIContextMenuInteraction, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionCommitAnimating) {
            parent.navigate()
        }
    }
}

extension View {
    func contextMenu<Preview: View>(navigate: @escaping () -> Void = {}, @ViewBuilder preview: @escaping () -> Preview, menu: @escaping () -> UIMenu) -> some View {
        return CustomContextMenu(navigate: navigate, content: {self}, preview: preview, menu: menu)
    }
}

struct CustomContextMenu<Content: View, Preview: View>: View {
    var content: Content
    var preview: Preview
    var menu: UIMenu
    var navigate: () -> Void
    init(navigate: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content, @ViewBuilder preview: @escaping () -> Preview, menu: @escaping () -> UIMenu) {
        self.content = content()
        self.preview = preview()
        self.menu = menu()
        self.navigate = navigate
    }
    var body: some View {
        ZStack {
            content
                .overlay(ContextMenuHelper(content: content, preview: preview, menu: menu, navigate: navigate))
        }
    }
}

Usage:

.contextMenu(navigate: {
    UIApplication.shared.open(url) //User tapped the preview
}) {
    LinkView(link: url.absoluteString) //Preview
        .environment(\.managedObjectContext, viewContext)
        .accentColor(Color(hex: "59AF97"))
        .environmentObject(variables)
}menu: {
    let openUrl = UIAction(title: "Open", image: UIImage(systemName: "sidebar.left")) { _ in
        withAnimation() {
            UIApplication.shared.open(url)
        }
    }
    let menu = UIMenu(title: url.absoluteString, image: nil, identifier: nil, options: .displayInline, children: [openUrl]) //Menu
    return menu
}

对于导航:

add isActive: $navigate给你的NavigationLink:

NavigationLink(目的地:SomeView(),isActive:$navigate)

以及一个新属性:

@State var 导航 = false

.contextMenu(navigate: {
    navigate.toggle() //User tapped the preview
}) {
    LinkView(link: url.absoluteString) //Preview
        .environment(\.managedObjectContext, viewContext)
        .accentColor(Color(hex: "59AF97"))
        .environmentObject(variables)
}menu: {
    let openUrl = UIAction(title: "Open", image: UIImage(systemName: "sidebar.left")) { _ in
        withAnimation() {
            UIApplication.shared.open(url)
        }
    }
    let menu = UIMenu(title: url.absoluteString, image: nil, identifier: nil, options: .displayInline, children: [openUrl]) //Menu
    return menu
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上下文菜单的 SwiftUI 自定义视图 的相关文章

  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • 如何使用 Vapor 和 Leaf 将图像从浏览器上传到 Amazon S3?

    我已经设置了 AWS S3 存储桶 并且可以使用 Vapor 3 和 Postman 上传文件 PUT request 和标头 x amz acl public read 但我想从浏览器中执行此操作 我使用的是 leaf 那么如何从浏览器上
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 错误域=kAFAssistantErrorDomain 代码=209“(空)”

    我面临着一个问题SFSpeechRecognizer 启动应用程序几秒钟后 我开始收到错误消息 错误域 kAFAssistantErrorDomain 代码 209 空 和 错误 域 kAFAssistantErrorDomain 代码 2
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • 无法在 Swift 中对闭包进行弱引用

    Update 我试着不弱化地写一下 好像也没有漏的情况 所以也许这个问题已经没有必要了 在 Objective C ARC 中 当你想让一个闭包能够在闭包内部使用它自己时 该块不能捕获对自身的强引用 否则它将是一个保留循环 因此您可以使闭包
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • 如何在 Swift 中从 UIColor 获取 RGB 代码(INT)[重复]

    这个问题在这里已经有答案了 我想在 Swift 中获取 UIColor 的 RGB 值 let swiftColor UIColor red 1 green 165 255 blue 0 alpha 1 println RGB Value
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • 如何更改 SwiftUI 列表中分隔符的颜色?

    我在 SwiftUI 中创建了一个列表 我想更改颜色或删除分隔符 因为在 UIKit 中 我们可以轻松更改 TableView 中分隔符的颜色 下面是 SwiftUI 中列表的代码和 UI 图片 State private var user
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • iPhone 上的纵向 UISplitViewController 在 iOS 8 中始终显示主视图和细节视图

    UISplitViewController in portrait在 iPhone 上始终显示主控和细节iOS 8 我尝试子类化UISplitViewController并将其配置为同时显示主视图和细节视图 但没有任何效果 class AP
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se

随机推荐

  • 从函数中的列表中返回项目。蟒蛇[重复]

    这个问题在这里已经有答案了 my list a b c def func input for i in input print i print func my list Output a b c None 我不想要 无 所以如何执行一行代码
  • UIScrollView 不随 UItextfields 一起滚动

    我正在制作一个普通视图 用户可以在其中更新他们的个人资料 我按照以下步骤制作了该视图 创建了一个新的UIViewController带有 xib 文件 Added a UIScrollView在超级视图中 添加了近9个UITextField
  • 使用 .onLoad 加载依赖包

    我的包需要 ggplot2 包 但我无法修复运行 R CMD 检查时得到的以下注释 no visible global function definition for qplot library or require call not de
  • 这个比较器是如何工作的?

    package vehicles order import java util ArrayList import java util Collections import java util Iterator public class ve
  • 理解 let 与 var 提升 [重复]

    这个问题在这里已经有答案了 With let vs var我了解到主要区别在于 let 变量的作用域为最近的块并且不会被提升 也让变量可以重新赋值 但不能在同一作用域内重新声明 那么为什么这段代码会返回 未定义 错误呢 let x 10 i
  • 将 CGImage 转换为 python 图像 (pil/opencv)

    我想在屏幕上进行一些模式识别 并将使用 Quartz PyObjc 库来获取屏幕截图 我得到的屏幕截图是 CGImage 我想使用 openCV 库搜索其中的模式 但似乎找不到如何将数据转换为 opencv 可读的 所以我想做的是 get
  • 如何重新组装 javap 生成的 java 字节码? [复制]

    这个问题在这里已经有答案了 我希望能够编辑字节码并重新编译为可执行类文件 我不知道该怎么做 我尝试使用 javap c 和 v 进行反编译 编辑一些内容 然后将其更改回我的 Class 文件 但出现错误 错误 无法找到或加载主类 Test
  • 如何在 Python 中使用 mutagen 将封面图像添加到 mp3 文件?

    下面的代码似乎没有更新 mp3 文件的插图 代码 from mutagen id3 import ID3 APIC audio ID3 musicFilename with open coverFilename rb as albumart
  • Java 中 == 和 .equals 之间的区别。

    我知道这已经被涵盖了 但我在这里看到了不一致的论点 所以如果我有 String a apple2e String b apple2e System out println a b a b I get FALSE 据我了解 这是因为a and
  • 将工件添加到标准 Maven 部署

    我希望有人可以帮助我进行 Maven 部署 通常通过发布插件运行 我想在发布时将除了打包的 jar 之外的文件部署到存储库 例如特定的说明文档和生成的 SQL 文件 如果我不必使用就好了deploy deploy file为每一个 如果我可
  • 如何控制 PyYAML 对我的数据使用哪种标量形式?

    我有一个具有短字符串属性和长多行字符串属性的对象 我想将短字符串写为 YAML 带引号的标量 将多行字符串写为文字标量 my obj short Hello my obj long Line1 nLine2 nLine3 我希望 YAML
  • 用户身份验证后重定向回页面选项卡?

    在用户验证我的应用程序后 我应该如何将用户重定向回我的页面选项卡 我无法输入一个特定的网址进行重定向 因为我的应用程序将驻留在多个页面上 所以我需要以某种方式获取页面的 id 并将其放入 url 中 我尝试过使用会话变量 但它似乎对我不起作
  • PHP 四舍五入不起作用

    我有这个代码 我想将两位小数四舍五入到一半 我期望值为 0 58 但上面的代码打印 0 57 我怎样才能做到这一点 如果您期望 0 58 则不必使用 半轮 而是使用 ceil 函数 v 0 575 echo ceil v 100 100 s
  • SQLAlchemy 中的编译扩展:索引中使用的函数

    我想在 SQLAlchemy 中创建一个不区分大小写的唯一约束 它可以与 Postgres 和 SQLite 一起使用 在Postgres中是这样实现的 SQL CREATE UNIQUE INDEX my index ON my tabl
  • 删除前面没有 NULL 的换行符

    我有一串数据 在我需要删除的行中插入了随机 CRLF 并以正确的 CRLF 结束了我需要保留的数据 我尝试使用 Notepad 正则表达式尝试将以下内容替换为空 NULL r n 但是 它不会删除插入的 CRLF 关于如何在 Notepad
  • 使用用户输入创建新对象 [JAVA]

    您好 我正在尝试创建一个程序 每当用户输入某个对象的新信息时就创建一个新对象 目前我有这个 import java util Scanner public class Main public static void main String
  • 无法销毁使用 Core Data 和 SQLite 创建的持久存储

    我有一个 iOS 应用程序 我想在每次启动时都从一个新的核心数据数据库开始 存储类型是 SQLite 但是 当我调用 persistenceStoreCoordinator destroyPersistentStore 时 100 都会收到
  • 通过 preg_replace 使用文本中的电话号码

    我可以使用 preg replace 在文本中查找电话号码 text preg replace d s 8 25 0 9 d strong 1 strong text 但是 我正在开发一个小功能 其中电话号码将被混淆 因此我需要实际的电话号
  • 是否有适用于 iphone sdk 的谷歌日历 api?

    有没有适用于 iphone sdk 的谷歌日历 api 目前我开发了一个 iphone 日历本机应用程序 在此应用程序中 我想从两侧与谷歌日历同步 所以我想知道是否有任何谷歌日历 API 可以完成这项工作 I found iphone gc
  • 上下文菜单的 SwiftUI 自定义视图

    我想在视图上长按手势时实现相同的自定义弹出视图 如照片 来自 Tweeter 应用程序 所示 这样我就可以同时显示自定义视图和上下文菜单 您需要进行定制ContextMenu using UIContextMenu from UIKit s