UIButton菜单动作顺序倒置问题求助
问题描述
我写了一个简单的Demo,给UIButton配置了菜单动作,代码如下:
class ViewController: UIViewController { @IBOutlet var button: UIButton! override func viewDidLoad() { super.viewDidLoad() var actions = [UIAction]() for title in ["One", "Two", "Three"] { let action = UIAction(title: title) { action in print(action.title) } actions.append(action) } let menu = UIMenu(title: "", children: actions) button.menu = menu } }
按钮已经设置为将菜单作为主要动作展示,但运行后点击按钮,菜单的顺序居然是倒过来的!我调试发现按钮菜单的actions数组顺序是正确的("One"在第一位),但显示出来却是反向的。这是UIKit的bug吗?我的环境是Xcode 16.4,iOS 18.5。
解答
嘿,这可不是UIKit的bug哦!这其实是iOS 18引入的一个自适应菜单排序特性,专门为了提升大屏设备的操作便利性设计的。
苹果在iOS 18中默认会根据设备的布局方向、用户的惯用手,甚至菜单弹出的位置,自动调整菜单选项的排列顺序,让用户更容易点击到常用选项。这个反转是在UI渲染层面做的,并不会改变你代码里actions数组的原始顺序,所以你调试的时候看到的顺序是对的,但显示出来就反过来了。
想要强制保持你设置的原始顺序也很简单,只需要在创建UIMenu的时候,指定preferredDisplayDirection属性即可:
修改创建菜单的代码:
let menu = UIMenu( title: "", children: actions, preferredDisplayDirection: .topToBottom )
如果你的菜单是横向排列的,可以把方向改成.leftToRight,这样就能严格按照你添加的顺序(One → Two → Three)展示了。
另外你也可以检查一下按钮的menuAttachmentPoint设置,但最直接有效的解决办法就是指定这个显示方向属性。这个新特性虽然有点反直觉,但确实是苹果为了优化用户体验做的调整,习惯一下就好啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

