You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIButton菜单动作顺序倒置问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:02:59