我想在我的应用程序中添加一个UIMenu,我正在练习它,现在有一个问题是,是否可以将UIMenu的位置设置得比按钮当前显示的位置高一点:

正如你在这张照片中看到的,菜单当前覆盖在选项卡栏上,我想将其设置得比选项卡栏高一点。下面是我的代码:
let menu = UIMenu(title: "", children: [
UIAction(title: NSLocalizedString("Gallery", comment: ""), image: UIImage(systemName: "folder"), handler: {
(_) in
self.loadPhotoGallery()
})
])
btnMenuExtras.menu = menu发布于 2021-10-03 14:20:39
iOS 14+
Sinse iOS 14 UIControl具有提供附加菜单的点的方法
/// Return a point in this control's coordinate space to which to attach the given configuration's menu.
@available(iOS 14.0, *)
open func menuAttachmentPoint(for configuration: UIContextMenuConfiguration) -> CGPoint因此,您可以重写UIButton,为菜单提供相对于按钮本身的所需位置(计算或硬编码)(因为它在按钮的坐标空间中),并在故事板中(作为控件的类)或以编程方式创建的按钮(如果需要将其注入到某个位置)中使用该按钮:
class MyButton: UIButton {
var offset = CGPoint.zero
override func menuAttachmentPoint(for configuration: UIContextMenuConfiguration) -> CGPoint {
// hardcoded variant
// return CGPoint(x: 0, y: -50)
// or relative to orginal
let original = super.menuAttachmentPoint(for: configuration)
return CGPoint(x: original.x + offset.x, y: original.y + offset.y)
}
}
class ViewController: UIViewController {
@IBOutlet weak var btnMenuExtras: MyButton! // << from storyboard
override func viewDidLoad() {
super.viewDidLoad()
let menu = UIMenu(title: "", children: [
UIAction(title: NSLocalizedString("Gallery", comment: ""), image: UIImage(systemName: "folder"), handler: {
(_) in
// self.loadPhotoGallery()
})
])
// offset is hardcoded for demo simplicity
btnMenuExtras.offset = CGPoint(x: 0, y: -50) // << here !!
btnMenuExtras.menu = menu
}
}

结果:

使用Xcode13/ iOS 15准备和测试演示
发布于 2021-10-05 11:20:35
您可以使用UIControl for UIButton的menuAttachmentPoint方法来定位菜单,并使用以下扩展将该UIButton转换为UIBarButtonItem
@available(iOS 14.0, *)
open func menuAttachmentPoint(for configuration: UIContextMenuConfiguration) -> CGPoint
extension UIButton {
func toBarButtonItem() -> UIBarButtonItem? {
return UIBarButtonItem(customView: self)
}
}发布于 2021-10-06 03:09:51
我想扩展@Asperi和@Jayesh Patel关于如何将该技术应用于UIBarButtonItem的答案
//
// Technique provided by @Asperi
//
class MyButton: UIButton {
var offset = CGPoint.zero
override func menuAttachmentPoint(for configuration: UIContextMenuConfiguration) -> CGPoint {
// hardcoded variant
// return CGPoint(x: 0, y: -50)
// or relative to orginal
let original = super.menuAttachmentPoint(for: configuration)
return CGPoint(x: original.x + offset.x, y: original.y + offset.y)
}
}
let image = UIImage(systemName: "ellipsis.circle", withConfiguration: UIImage.SymbolConfiguration(scale: .default))
let button = MyButton()
button.setImage(image, for: .normal)
let menu = UIMenu(title: "", children: [
UIAction(title: NSLocalizedString("Gallery", comment: ""), image: UIImage(systemName: "folder"), handler: {
(_) in
})
])
// offset is hardcoded for demo simplicity
button.offset = CGPoint(x: 0, y: 50) // << here !!
//
// This is how we can make UIButton as UIBarButtonItem
//
button.menu = menu
button.showsMenuAsPrimaryAction = true
//
// Technique provided by @Jayesh Patel
//
let threeDotsBarButtonItem = UIBarButtonItem(customView: button)
var items = toolbar.items
items?.append(threeDotsBarButtonItem)
toolbar.items = itemshttps://stackoverflow.com/questions/67809341
复制相似问题