gpt4 book ai didi

cocoa-touch - 如何将 UIGestureRecognizer 添加到 UIBarButtonItem,就像 iPad 应用程序上常见的撤消/重做 UIPopoverController 方案一样?

转载 作者:行者123 更新时间:2023-12-03 07:25:26 25 4
gpt4 key购买 nike

问题

在我的 iPad 应用程序中,我无法将弹出框附加到按钮栏项目在按住事件之后。但这似乎是撤消/重做的标准。其他应用程序如何做到这一点?

背景

我的 UIKit (iPad) 应用程序的工具栏中有一个撤消按钮 (UIBarButtonSystemItemUndo)。当我按下撤消按钮时,它会触发撤消操作:并且正确执行。

但是,iPad 上撤消/重做的“标准 UE 约定”是,按撤消会执行撤消,但按住按钮会显示一个弹出 Controller ,用户可以在其中选择“撤消”或“重做”直到 Controller 被关闭。

附加弹出窗口 Controller 的正常方法是使用presentPopoverFromBarButtonItem:,我可以很容易地配置它。为了使其仅在按住后显示,我们必须设置一个 View 来响应“长按”手势事件,如以下代码段所示:

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];

这样,在按住 View 后,将调用方法handleLongPressOnUndoGesture:,在该方法中我将配置并显示撤消/重做的弹出窗口。到目前为止,一切顺利。

问题是没有可以附加的 View 。 self.undoButtonItem 是一个 UIButtonBarItem,而不是 View 。

可能的解决方案

1) [理想] 将手势识别器附加到按钮栏项目。可以将手势识别器附加到 View ,但 UIButtonBarItem 不是 View 。它确实有一个 .customView 属性,但当 Buttonbaritem 是标准系统类型时(在本例中是),该属性为零。

2) 使用另一个 View 。我可以使用 UIToolbar,但这需要一些奇怪的 HitTest ,并且是一个全面的黑客,如果可能的话。我想不出其他可以使用的替代 View 。

3) 使用 customView 属性。像 UIBarButtonSystemItemUndo 这样的标准类型没有 customView(它是 nil)。设置customView将删除它需要具有的标准内容。这相当于重新实现 UIBarButtonSystemItemUndo 的所有外观和功能,如果可能的话,再次实现。

问题

如何将手势识别器附加到此“按钮”?更具体地说,如何在 iPad 应用程序中实现标准的按住以显示重做弹出框?

想法?非常感谢,特别是如果有人确实在他们的应用程序中使用了此功能(我在想你,omni)并且想要分享...

最佳答案

注意:从 iOS 11 开始,此功能不再有效

为了避免在工具栏的 subview 列表中查找 UIBarButtonItem 的 View ,您还可以在将项目添加到工具栏后尝试此操作:

[barButtonItem valueForKey:@"view"];

这使用键值编码框架来访问 UIBarButtonItem 的私有(private) _view 变量,其中保存了它创建的 View 。

当然,我不知道这在苹果的私有(private) API 方面属于什么位置(这是用于访问公共(public)类的私有(private)变量的公共(public)方法 - 不像访问私有(private)框架来制作奇特的苹果专用效果或任何东西) ),但它确实有效,而且相当轻松。

关于cocoa-touch - 如何将 UIGestureRecognizer 添加到 UIBarButtonItem,就像 iPad 应用程序上常见的撤消/重做 UIPopoverController 方案一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com