我在 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)
}
结果是这样的:
我现在在测试中使用的版本:Xcode 14.1、iOS 16.1,但我也在早期版本中看到了这种行为。 (回到 iOS 14.x)
.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
}