UICollectionViewCell内按钮的UIMenu显示异常:弹出后移至屏幕顶部
问题解决方案
核心错误修正
你代码里最关键的问题是把awakeFromNib写成了类方法(override class func awakeFromNib()),但这个方法应该是实例方法——类方法无法访问当前cell实例的contentView和子视图,导致布局和菜单配置逻辑没有正确绑定到cell实例上,这才是菜单位置异常的根本原因。
完整修正后的代码
final class YourCustomCollectionViewCell: UICollectionViewCell { private let menuButton: UIButton = { let button = UIButton() button.showsMenuAsPrimaryAction = true button.translatesAutoresizingMaskIntoConstraints = false // 可添加背景色方便调试,后续可移除 button.backgroundColor = .lightGray return button }() // 去掉class关键字,改为实例方法 override func awakeFromNib() { super.awakeFromNib() contentView.addSubview(menuButton) configureButtonConstraints() configureMenu() } private func configureButtonConstraints() { NSLayoutConstraint.activate([ // 约束需基于contentView,而非cell本身 menuButton.topAnchor.constraint(equalTo: contentView.topAnchor), menuButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), menuButton.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), menuButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) ]) } private func configureMenu() { let editAction = UIAction(title: "Edit") { _ in print("Edit Button Clicked") } let deleteAction = UIAction(title: "Delete") { _ in print("Delete Button Clicked") } // 若无需强制内联显示,可移除displayInline选项,让系统自动适配菜单位置 let menuForCell = UIMenu(title: "Options", children: [editAction, deleteAction]) menuButton.menu = menuForCell } }
额外注意点
- UICollectionViewCell的子视图必须添加到
contentView上,而非cell本身,否则在cell复用、滚动时会出现布局异常。 displayInline选项会强制菜单内联显示,可能干扰系统的菜单自动定位逻辑,若无需特殊排版,建议移除该选项。
内容的提问来源于stack exchange,提问作者nirav
相关产品推荐
相关产品推荐

