问题
在我的 iPad 应用程序中,我无法仅在按住事件后将弹出框附加到按钮栏项目。但这似乎是撤消/重做的标准。其他应用程序如何做到这一点?
背景
我的 UIKit (iPad) 应用程序的工具栏中有一个撤消按钮 (UIBarButtonSystemItemUndo)。当我按下撤消按钮时,它会触发撤消操作:并且正确执行。
但是,iPad 上撤消/重做的“标准 UE 约定”是按下撤消执行撤消,但按住按钮会显示一个弹出控制器,其中用户选择“撤消”或“重做”,直到控制器被解除。
附加弹出框控制器的常规方法是使用 presentPopoverFromBarButtonItem:,我可以很容易地配置它。为了让它仅在按住后显示,我们必须设置一个视图来响应“长按”手势事件,如以下代码段所示:
UILongPressGestureRecognizer *longPressOnUndoGesture = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPressOnUndoGesture:)];
//Broken because there is no customView in a UIBarButtonSystemItemUndo item
[self.undoButtonItem.customView addGestureRecognizer:longPressOnUndoGesture];
[longPressOnUndoGesture release];
这样,在按住视图后,将调用方法 handleLongPressOnUndoGesture:,在此方法中,我将配置并显示用于撤消/重做的弹出框。到目前为止,一切都很好。
这样做的问题是没有可附加的视图。self.undoButtonItem 是 UIButtonBarItem,而不是视图。
可能的解决方案
1) [理想]将手势识别器附加到按钮栏项目。可以将手势识别器附加到视图,但 UIButtonBarItem 不是视图。它确实具有 .customView 的属性,但是当 buttonbaritem 是标准系统类型(在本例中是)时,该属性为 nil。
2)使用另一个视图。我可以使用 UIToolbar 但这将需要一些奇怪的命中测试并且是一个全方位的黑客,如果可能的话。我想不出其他可以使用的替代视图。
3)使用 customView 属性。像 UIBarButtonSystemItemUndo 这样的标准类型没有 customView(它是 nil)。设置 customView 将删除它需要的标准内容。这相当于重新实现 UIBarButtonSystemItemUndo 的所有外观和功能,如果可能的话。
问题
如何将手势识别器附加到此“按钮”?更具体地说,如何在 iPad 应用程序中实现标准的按住以显示重做弹出窗口?
想法?非常感谢你,特别是如果有人真的在他们的应用程序中有这个工作(我在想你,omni)并且想要分享......