Bri*_*n H 4 menu popup button uikit swift
我在 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)
}
Run Code Online (Sandbox Code Playgroud)
结果是这样的:
我现在在测试中使用的版本:Xcode 14.1、iOS 16.1,但我也在早期版本中看到了这种行为。(回到iOS 14.x)
从 iOS 16 开始,.preferredMenuElementOrder可以在按钮上设置一个属性:
.automatic据我所知(正如许多苹果定义一样),和之间没有区别.priority。
从.priority 文档页面:
讨论
此排序策略显示 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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |