如何在自己的应用程序中使用iOS工具提示菜单

您可能已经在某些Apple的默认应用程序中或在iOS上编辑文本时看到了此工具提示控件。 该工具提示实际上有一个名称UIMenuController ,并且可以自定义并在您自己的应用程序中使用,尽管该API可能很难理解。

成为FirstResponder()

与应用程序具有源自UIWindowUIView层次结构类似,它也具有UIResponder链,因为视图本质上是响应者。

为了在自定义视图上使用UIMenuController ,该视图必须首先成为应用程序的第一响应者。

在应用程序中,首先接收多种事件的响应者对象称为第一响应者。 它接收关键事件,动作事件和动作消息等。

这并不需要花哨的东西,但是在处理多个UIResponder子类时,了解响应者的层次结构很重要。 尽管UIView基类继承了UIResponder接口,但它不会自动赋予UIView实例成为第一响应者的能力,这就是为什么您只能在UIView子类上调用.becomeFirstResponder() 。 默认情况下,某些iOS控件(如UITextField可以成为第一响应者,但是对于自定义视图,您需要覆盖canBecomeFirstResponder变量。

现在, ResponsiveView任何实例都可以调用.becomeFirstResponder()并成为其超级窗口的第一个响应者,并且由于UIView基类默认将其UIResponder变量canResignFirstResponder为true,因此我们也可以在ResponsiveView上调用.resignFirstResponder() 。 。

UIMenuController

现在我们有了一个自定义视图,可以将其设置为应用程序的第一响应者,让我们在其上显示一个工具提示! UIMenuController具有一个单例实例,您可以在您的应用程序中使用它来轻松地使用多个视图-这样可确保您不会一次显示多个菜单。

请注意,在显示菜单之前,我们必须指定responsiveView View的框架。 这是因为UIMenuController使用此信息将自身适当地放置在窗口中的适当位置。 默认情况下,菜单将显示在第一响应者上方,其箭头指向下方。 您当然可以通过设置箭头方向,指定与第一响应者不同的帧,甚至为目标矩形计算指定不同的超级视图来自定义此行为。

UIMenuItem

在显示菜单之前,我们想要设置一些选项以使其首先显示在菜单中。

这是上面的代码示例。 我更喜欢使用minimumPressDuration0.3UIMenuController来触发UIMenuController ,因为它模仿了iOS中的默认行为。

如果您对Twitter @sdrzn有任何疑问或想法,请告诉我!