QMUI_iOS 中 QMUIPopupMenuView 的选中状态自定义方案
2025-05-30 14:44:41作者:盛欣凯Ernestine
背景介绍
QMUI_iOS 是腾讯开源的一套高质量 UI 组件库,其中 QMUIPopupMenuView 是一个常用的弹出菜单组件。在 4.8.0 版本更新后,该组件的 API 设计发生了一些变化,导致开发者在使用过程中遇到了一些关于菜单项选中状态自定义的问题。
问题分析
在 4.8.0 版本之前,QMUIPopupMenuView 提供了较为灵活的菜单项(Item)字体和颜色设置方式,开发者可以方便地区分选中和未选中状态。但在新版本中,这些直接设置属性的 API 被移除或调整了,导致开发者需要寻找新的实现方式。
解决方案
方案一:在每次显示时动态设置
开发者可以通过在每次显示菜单时,遍历所有菜单项并设置它们的样式:
[popupMenuView showWithAnimated:YES completion:^(BOOL finished) {
for (QMUIPopupMenuItemView *itemView in popupMenuView.itemViews) {
itemView.textLabel.textColor = itemView.selected ? selectedColor : normalColor;
itemView.textLabel.font = itemView.selected ? selectedFont : normalFont;
}
}];
这种方式的优点是实现简单直接,缺点是每次显示菜单都需要执行这段代码,且样式逻辑分散在业务代码中。
方案二:自定义 QMUIPopupMenuItemView 子类
更优雅的解决方案是创建自定义的菜单项视图子类:
@interface CustomPopupMenuItemView : QMUIPopupMenuItemView
@property (nonatomic, strong) UIColor *normalColor;
@property (nonatomic, strong) UIColor *selectedColor;
@property (nonatomic, strong) UIFont *normalFont;
@property (nonatomic, strong) UIFont *selectedFont;
@end
@implementation CustomPopupMenuItemView
- (void)setSelected:(BOOL)selected {
[super setSelected:selected];
[self updateAppearance];
}
- (void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
[self updateAppearance];
}
- (void)updateAppearance {
self.textLabel.textColor = self.selected || self.highlighted ? self.selectedColor : self.normalColor;
self.textLabel.font = self.selected || self.highlighted ? self.selectedFont : self.normalFont;
}
@end
使用时:
popupMenuView.itemViewConfigurationHandler = ^(QMUIPopupMenuItemView *itemView, NSUInteger index) {
if ([itemView isKindOfClass:[CustomPopupMenuItemView class]]) {
CustomPopupMenuItemView *customItemView = (CustomPopupMenuItemView *)itemView;
customItemView.normalColor = [UIColor grayColor];
customItemView.selectedColor = [UIColor redColor];
customItemView.normalFont = [UIFont systemFontOfSize:14];
customItemView.selectedFont = [UIFont boldSystemFontOfSize:14];
[customItemView updateAppearance];
}
};
这种方案的优点在于:
- 将样式逻辑封装在自定义视图中,业务代码只需关心状态值
- 更符合面向对象的设计原则
- 便于复用和维护
最佳实践建议
-
样式与逻辑分离:将视觉样式相关的代码尽可能封装在视图层,业务层只需控制状态
-
考虑继承与组合:对于简单的样式变化,继承是合适的;如果需要更复杂的变化,可以考虑使用装饰器模式
-
性能考量:避免在频繁调用的方法(如setSelected:)中进行复杂的计算或对象创建
-
状态一致性:注意处理selected和highlighted状态的关系,通常需要同时考虑这两个状态
总结
QMUI_iOS 4.8.0 版本对 QMUIPopupMenuView 的 API 进行了调整,虽然移除了部分直接设置样式的接口,但通过自定义菜单项视图子类的方式,开发者仍然可以实现灵活的状态样式控制。这种设计实际上鼓励了更好的代码组织方式,将样式逻辑从业务代码中解耦出来,提高了代码的可维护性和复用性。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
项目优选
收起
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
538
3.76 K
Ascend Extension for PyTorch
Python
343
410
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
886
602
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
337
181
暂无简介
Dart
775
192
deepin linux kernel
C
27
11
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.34 K
757
React Native鸿蒙化仓库
JavaScript
303
356
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
987
252
仓颉编译器源码及 cjdb 调试工具。
C++
154
895