首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有任何选项可以为SwiftUI中的菜单项设置顺序?

是否有任何选项可以为SwiftUI中的菜单项设置顺序?
EN

Stack Overflow用户
提问于 2021-04-16 11:11:33
回答 3查看 1.3K关注 0票数 3

如何设置以下按钮项的排序顺序(忽略和引脚)?它没有按菜单列表中的确切排序顺序显示。我认为os本身正在更新排序顺序。是否有任何选择来限制同样的?

结构ContentView:视图{

代码语言:javascript
运行
复制
var body: some View {
    Menu {
            Button(action: {
    self.self.placeOrder()
}) {
    HStack {
        Text("Ignore")
            .multilineTextAlignment(.leading)
        Image("Menu_Ignore")
            .renderingMode(.original)
    }
}

Button(action: {
    self.adjustOrder()
}) {
    HStack {
        Text("Pin")
            .multilineTextAlignment(.leading)
        Image("Menu_Pin")
            .renderingMode(.original)
    }
}
    } label: {
        Label("Options", systemImage: "paperplane")
    }
}

func placeOrder() { }
func adjustOrder() { }}
EN

回答 3

Stack Overflow用户

发布于 2022-06-07 06:41:58

Xcode 14 / iOS 16 / macOS 13 /.

现在我们有了环境价值来管理这一点:

代码语言:javascript
运行
复制
var body: some View {
    Menu {
       // .. buttons here
    }
    .environment(\.menuOrder, .fixed)     // << here !!
}
票数 5
EN

Stack Overflow用户

发布于 2022-04-04 13:04:56

这感觉就像一种力量,但我解决了它,通过GeometryReader获得菜单的全局y位置,并在屏幕的顶部或底部设置顺序。

您点击菜单(顶部或底部)的位置决定了菜单中元素的顺序,所以我使用了这个特性。

代码语言:javascript
运行
复制
import SwiftUI

struct ContentView: View {
    var body: some View {
        ScrollView {
            GeometryReader { geometry in
                Menu("show menu") {
                    // get global position
                    let frame = geometry.frame(in: .global)
                    // top or bottom
                    let isTop = frame.midY <= UIScreen.main.bounds.height/2
                    if isTop {
                        Button("first button", action: {})
                        Button("second button", action: {})
                    }
                    else {
                        Button("second button", action: {})
                        Button("first button", action: {})
                    }
                }
            }
            .padding(.vertical, 800)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
票数 3
EN

Stack Overflow用户

发布于 2021-04-16 13:05:55

更新

正如Asperi所提到的,在iOS 16 & macOS 13 https://developer.apple.com/documentation/swiftui/text/menuorder(_:)中是可能的

iOS 15和macOS 12及更低版本的原始答案

您的代码是完全正确的,并且工作非常完美。您所遇到的问题可能与这样一个事实有关,即第一个菜单项总是最接近用户使用的触发MenuMenu。(示例中的“Menu标签”)。

因此,如果点击的对象在屏幕上很低,那么系统可能会显示上面的菜单而不是点击下面的菜单。当它这样做的时候,它就颠倒了顺序。

对于2个Menu项,这一点可能并不清楚(因为如果将它们反转,它可能看起来是顺序的随机变化),但如果添加更多,您将看到订单保持不变,但整个Menu可能会显示在按常规顺序的抽头下面,或者显示在具有反向顺序的抽头之上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67124144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档