如何强制UIKit弹出菜单按钮项的顺序?

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

我在 Swift 应用程序的同一屏幕上有几个 UIKit 弹出菜单按钮,它们具有相同的菜单项。这些按钮是通过调用一个函数来构建的,该函数使用字符串数组来创建菜单项列表。

问题在于,根据按钮在屏幕上的垂直位置,菜单项可能会按功能指定的顺序出现,或者相反。如果该按钮位于屏幕的上半部分,则菜单项会按正确的顺序列出。如果按钮位于屏幕的下半部分,则菜单项将以相反的顺序列出。

我希望菜单项以相同的顺序显示,无论按钮在屏幕上的位置如何。我可以检查按钮位置并让菜单创建功能反转顺序,但这似乎有点笨拙。我希望有一种更干净的方法来覆盖这种行为。

用于创建按钮菜单的代码和数组:

let buttonMenuItems = ["Spring","Summer","Autumn","Winter"]

func createAttributeMenu(menuNumber: Int)->UIMenu  {
    
    var menuActions: [UIAction] = []
    
    for attribute in buttonMenuItems {
        let item = UIAction(title: attribute) { action in
            self.updateMenu(menuID: menuNumber, selected: attribute)
        }
        menuActions.append(item)
    }
    
    return UIMenu(title: "", children: menuActions)
}

结果是这样的:

enter image description here enter image description here enter image description here

我现在在测试中使用的版本:Xcode 14.1、iOS 16.1,但我也在早期版本中看到了这种行为。 (回到 iOS 14.x)

swift button menu uikit popup
1个回答
10
投票

从 iOS 16 开始,可以在按钮上设置

.preferredMenuElementOrder
属性:

  • 案例自动
    • 一个常量,允许系统根据当前上下文选择排序策略。
  • 案例优先级
    • 根据优先级显示菜单元素的常量。
  • 情况已修复
    • 以固定顺序显示菜单元素的常量。

据我所知(与许多 Apple 定义一样),

.automatic
.priority
之间没有区别。

来自

.priority
docs 页面:

讨论

此排序策略显示 UIMenu 中最接近用户交互位置的第一个菜单元素。

因此,我们根据菜单相对于按钮的位置得到“相反”的顺序。

要保持您定义的顺序:

buttonNearTop.menu = createAttributeMenu(menuNumber: 1)
buttonNearBottom.menu = createAttributeMenu(menuNumber: 2)
if #available(iOS 16.0, *) {
    buttonNearBottom.preferredMenuElementOrder = .fixed
    buttonNearTop.preferredMenuElementOrder = .fixed
} else {
    // out of luck... you get Apple's "priority" ordering
}
© www.soinside.com 2019 - 2024. All rights reserved.