Xcode12 Swift5环境下UICollectionViewCell按钮上下文菜单顺序异常问题
问题原因
这是iOS 14及以上版本的系统默认行为:当UIButton绑定的上下文菜单靠近屏幕底部边缘时,系统为了避免菜单内容超出屏幕可视区域,会自动反转菜单项的展示顺序,和Xcode版本、Swift语言版本无直接关联。
解决方案
创建UIMenu时新增options参数,指定UIMenuOptionsDisplayInline(Swift中为.displayInline)选项,该选项会强制菜单按照传入的children数组的原始顺序展示,不会因菜单展示位置自动调整顺序。
Objective-C 代码示例
self.moreButton.showsMenuAsPrimaryAction = YES; // 新增options参数固定菜单项顺序 self.moreButton.menu = [UIMenu menuWithTitle:@"title" options:UIMenuOptionsDisplayInline children:@[renameAction, deleteAction, shareAction]];
Swift 代码示例
moreButton.showsMenuAsPrimaryAction = true moreButton.menu = UIMenu(title: "title", options: .displayInline, children: [renameAction, deleteAction, shareAction])
额外优化建议
- 因为UICollectionViewCell存在复用机制,建议将menu的配置逻辑放在cell的初始化方法中,不要在
cellForItemAt代理方法中重复创建,减少不必要的性能消耗。 - 如果修改配置后仍偶现顺序反转,可以在cell的
prepareForReuse方法中先重置menu再重新配置,避免cell复用带来的上下文污染:
- (void)prepareForReuse { [super prepareForReuse]; self.moreButton.menu = nil; // 重新初始化menu即可 self.moreButton.menu = [UIMenu menuWithTitle:@"title" options:UIMenuOptionsDisplayInline children:@[renameAction, deleteAction, shareAction]]; }
- 如果需要适配iOS 13以下版本,注意对UIMenu相关API添加版本判断。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

