You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS 26中如何禁用UIBarButtonItem自定义视图的玻璃效果?

iOS 26中如何禁用UIBarButtonItem自定义视图的玻璃效果?

我刚好在iOS 26的项目里踩过这个坑!你的场景(用UIImageView做logo当leftBarButtonItem,不需要交互也不想有默认的玻璃蒙层)太常见了,下面是我亲测有效的两种解决方案,你可以根据需求选:

方法一:给自定义视图设置明确透明背景(最简单直接)

iOS 26的玻璃效果是UIBarButtonItem对无背景的customView自动添加的,所以只要给UIImageView明确设置透明背景,就能覆盖掉默认的玻璃效果:

let logoImageView = UIImageView(image: UIImage(named: "your-logo"))
logoImageView.backgroundColor = .clear // 关键:明确设置透明背景
logoImageView.contentMode = .scaleAspectFit
// 按需设置固定尺寸,保证在导航栏里显示正常
logoImageView.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

let leftBarButton = UIBarButtonItem(customView: logoImageView)
navigationItem.leftBarButtonItem = leftBarButton

这个方法零视图结构改动,加一行代码就能搞定,完全贴合你的现有实现。

方法二:用UIButton包装UIImageView(更灵活,适配未来需求)

如果之后你可能要给logo加点击事件,或者想更彻底地控制样式,把UIImageView放到UIButton里是更好的选择——通过配置Button样式就能彻底去掉玻璃效果:

let logoImageView = UIImageView(image: UIImage(named: "your-logo"))
logoImageView.contentMode = .scaleAspectFit

let logoButton = UIButton(type: .plain)
logoButton.addSubview(logoImageView)
// 用AutoLayout固定ImageView在Button中的位置
logoImageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    logoImageView.centerXAnchor.constraint(equalTo: logoButton.centerXAnchor),
    logoImageView.centerYAnchor.constraint(equalTo: logoButton.centerYAnchor),
    logoImageView.widthAnchor.constraint(equalToConstant: 32),
    logoImageView.heightAnchor.constraint(equalToConstant: 32)
])
// 禁用交互(如果不需要点击的话)
logoButton.isUserInteractionEnabled = false
// 关键:plain样式的Button自带无玻璃效果的背景
logoButton.configuration = .plain()

let leftBarButton = UIBarButtonItem(customView: logoButton)
navigationItem.leftBarButtonItem = leftBarButton

这种方法的优势是后续如果要开启交互,只需要把isUserInteractionEnabled改成true,再加点击事件就行,样式不会乱跳。

补充:别依赖兼容性plist键

你提到知道UIDesignRequiresCompatibility这个plist键,但那是强制回到旧设计,完全不符合你要适配iOS 26玻璃设计体系的需求——上面两种方法都是在新设计规则内解决问题的,不需要退回到旧样式。

另外要注意:如果你的UIBarButtonItem完全不需要交互,只要保证customView的isUserInteractionEnabled为false,就不会触发任何点击行为,同时也不会出现玻璃效果的触发态,刚好匹配你的需求。

火山引擎 最新活动