我需要显示一个供用户 Select 的 Select 列表.我已经判断了Menu、.ConextMenu()和.Popover().虽然这三个都很好,但我不能展示我需要展示的东西,或者我无法设计它们的样式来满足设计需要.例如:

  • 菜单
    • 只接受StringLiteral参数.我需要它接受一个视图.
    • 列表仅显示带有文本和图像的标签.我需要它接受一个视图.当我将视图转换为图像时,它会剪辑到顶部和底部.
  • . contextMenu()
    • 我可以在视图上运行这个程序,但是当我试图显示图像时,List也会出现同样的标签问题.
    • 只使用longPress显示列表.必须是一个水龙头.
  • . popover()
    • 执行我需要显示的所有内容,除了在iOS中,它会显示一个指向父视图的箭头.我不能有箭.

在这一点上,它看起来像弹出是最有利的 Select ,如果我可以设置它,使箭头不显示.根据我从文档中了解到的,只有macOS可以隐藏箭头.

有没有办法在iOS中显示没有箭头的.opover()?

推荐答案

你总是可以做自己的卷饼.可采用下列技术:

  • 将弹出框显示为ZStack中的顶层.
  • 使用.matchedGeometryEffect定位.

下面是一个例子来说明它是如何工作的:

struct ContentView: View {

    enum PopoverTarget {
        case text1
        case text2
        case text3
    }

    @State private var popoverTarget: PopoverTarget?
    @Namespace private var nsPopover

    @ViewBuilder
    private var customPopover: some View {
        if let popoverTarget {
            Text("Popover for \(popoverTarget)")
                .padding()
                .foregroundStyle(.gray)
                .background {
                    RoundedRectangle(cornerRadius: 10)
                        .fill(Color(white: 0.95))
                        .shadow(radius: 6)
                }
                .matchedGeometryEffect(
                    id: popoverTarget,
                    in: nsPopover,
                    properties: .position,
                    isSource: false
                )
        }
    }

    private func popoverPlaceholder(
        target: PopoverTarget,
        xOffset: CGFloat = 0,
        yOffset: CGFloat = 0
    ) -> some View {
        Color.clear
            .matchedGeometryEffect(id: target, in: nsPopover)
            .offset(x: xOffset, y: yOffset)
    }

    private func showPopover(target: PopoverTarget) {
        if popoverTarget != nil {
            withAnimation {
                popoverTarget = nil
            } completion: {
                popoverTarget = target
            }
        } else {
            popoverTarget = target
        }
    }

    var body: some View {
        ZStack {
            VStack {
                Text("Text 1")
                    .padding()
                    .background(.blue)
                    .onTapGesture { showPopover(target: .text1) }
                    .background { popoverPlaceholder(target: .text1, yOffset: 70) }
                    .padding(.top, 50)
                    .padding(.leading, 100)
                    .frame(maxWidth: .infinity, alignment: .leading)

                Text("Text 2")
                    .padding()
                    .background(.orange)
                    .onTapGesture { showPopover(target: .text2) }
                    .background { popoverPlaceholder(target: .text2, xOffset: -40, yOffset: -70) }
                    .padding(.top, 100)
                    .padding(.trailing, 40)
                    .frame(maxWidth: .infinity, alignment: .trailing)

                Spacer()

                Text("Text 3")
                    .padding()
                    .background(.green)
                    .onTapGesture { showPopover(target: .text3) }
                    .background { popoverPlaceholder(target: .text3, yOffset: -70) }
                    .padding(.bottom, 250)
            }
            customPopover
                .transition(
                    .opacity.combined(with: .scale)
                    .animation(.bouncy(duration: 0.25, extraBounce: 0.2))
                )
        }
        .foregroundStyle(.white)
        .contentShape(Rectangle())
        .onTapGesture {
            popoverTarget = nil
        }
    }
}

Animation

Ios相关问答推荐

构建iOS项目失败.我们运行了";xcodeBuild";命令,但它退出并返回错误代码65-expo reaction ative

自定义油漆圆角三角形

在iOS 17脉冲符号效果不起作用的情况下制作UIBarButtonItem动画(没有UIImageView)

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

无法向委托发送数据

如何通过点击按钮滚动到 ScrollView 中的特定视图?

CGPath intersection(_:using:) 和朋友(iOS 16 中的新功能)坏了?

在我的 M1 上出现 Architecture arm64 问题,因此我无法运行我的旧项目

iOS - 判断开发者模式是否开启 (Swift)

如何在 SwiftUI 中对表格行使用 Transferable

如何为 XCTest、SwiftUI 预览等初始化带有 @MainActor 注释的 Swift 类

如何在 SwiftUI 的 TabView 中添加底部曲线?

类型任何视图不能符合具有泛型的协议上的视图

为什么我不能让 passthrough 科目为 combine 工作?

直接下载Xcode模拟器

无效的 iPhone 应用程序二进制文件

iOS UITextView 或 UILabel 带有可点击的动作链接

UITextView 内容插图

请在您的 Podfile 中为此目标指定一个平台?

未找到符号:kUTTypeImage