我有幾個 UIKit 彈出選單按鈕,在 Swift 應用程式的同一螢屏上具有相同的選單項。這些按鈕是通過呼叫一個函式來構建的,該函式使用字串陣列來創建選單項串列。
問題在于,根據按鈕在螢屏上的垂直位置,選單項可能會按照函式指定的順序出現,或者相反。如果按鈕位于螢屏的上半部分,則選單項以正確的順序列出。如果按鈕位于螢屏的下半部分,則選單項以相反的順序列出。
無論按鈕在螢屏上的位置如何,我都希望選單項以相同的順序出現。我可以檢查按鈕位置并讓選單創建功能顛倒順序,但這似乎有點笨拙。我希望有一種更清潔的方法來覆寫這種行為。
用于創建按鈕選單的代碼和陣列:
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)
uj5u.com熱心網友回復:
從 iOS 16 開始.preferredMenuElementOrder,可以在按鈕上設定一個屬性:
- 案例自動
- 允許系統根據當前背景關系選擇排序策略的常量。
- 案件優先
- 根據優先級顯示選單元素的常量。
- 案例固定
- 以固定順序顯示選單元素的常量。
.automatic最好我能說(與許多 Apple 定義一樣),和之間沒有區別.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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/531185.html
