11

我正在使用 UIMenuController 的新自定义功能将“复制”以外的内容添加到菜单中,以便剪切和粘贴到 web 视图中。

我所做的是获取对共享 UIMenuController 的引用,将 UIMenuItems 的 NSArray 设置到 menuItems 中,只要我添加一个项目,一切都会正常工作。例如,我看到 [COPY|FOOBAR]。

相反,如果我尝试添加多个项目,会发生什么情况是我看到 [COPY|MORE],如果我按下 MORE 而不是最终显示其他项目。

可以直接显示 [COPY|FOO|BAR|THREE|FOUR] 吗?我看到了一些能够做到这一点的应用程序,尤其是 iBooks。

任何帮助都非常感谢,谢谢。

干杯,西森西奥

4

4 回答 4

15

FluXa 的回答其实是正确的,但我觉得不是很清楚。

问题是当将自定义 UIMenuItem 对象添加到共享菜单控制器 ([UIMenuController sharedMenuController]) 时,只有第一个自定义 UIMenuItem 将显示在菜单的初始显示中。如果用户点击“更多...”,将显示剩余的自定义菜单项。

但是,如果菜单不包含任何内置系统菜单项(复制:、粘贴:等),则初始菜单显示将显示所有自定义菜单项,并且没有“更多...”项。

如果您需要包含内置系统项,只需添加具有相同标题但具有不同选择器的自定义 UIMenuItems。(myCopy:与复制:)

本质上,它归结为不调用 canPerformAction:withSender: 的默认实现,显式处理所有自定义菜单项,并为所有其他(系统提供的)菜单项返回 NO:

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector( onCommand1: ) )
    {
        // logic for showing/hiding command1
        BOOL show = ...;
        return show;
    }

    if ( action == @selector( onCommand2: ) )
    {
        // logic for showing/hiding command2
        BOOL show = ...;
        return show;
    }

    if ( action == @selector( onCopy: ) )
    {
        // always show our custom "copy" command
        return YES;
    }   

    return NO;
}
于 2011-01-05T19:55:34.947 回答
4

当我尝试在 iPad 中开发应用程序时,我们实际上遇到了同样的问题。但我所做的是我禁用了弹出菜单项

  • (BOOL)canPerformAction:(SEL)action withSender:(id)sender

使用

if ( [UIMenuController sharedMenuController] ) { [UIMenuController sharedMenuController].menuVisible = NO; } 返回否;

然后我使用了 UIPopoverController。

问候, ZaldzBugz

于 2010-07-21T03:03:46.130 回答
2

遇到同样的问题,我所做的是用子类覆盖 webview(是的,我知道你不应该)并为 canPerformAction:返回 NO:对于 copy:选择器。然后我将自己的 Copy 项添加到从 UIWebview 调用原始方法的 ShareMenuController。这样,您可以添加任意数量的项目,并且最初是可见的。

于 2010-08-22T12:35:34.990 回答
0

您可以使用 menuFrame (只读属性)获取先前显示的 UIMenuController 的矩形,使用它可以计算另一个 UIMenuController 显示在同一位置的位置。

在即将展示第二个 UIMenuController 的 action 方法中,获取上一个 UIMenuController 的框架

在此处输入图像描述

CGRect previousRect = [[UIMenuController sharedMenuController] menuFrame];

CGRect newRect = CGRectMake(previousRect.origin.x + previousRect.size.width/2,   previousRect.origin.y + previousRect.size.height, 0, 0);

大致你会得到箭头的位置。现在显示第二个 UIMenuController

UIMenuItem *testMenuItem1 = [[UIMenuItem alloc] initWithTitle:@"test1" action:@selector(test1ItemClicked)];
UIMenuItem *testMenuItem2 = [[UIMenuItem alloc] initWithTitle:@"test2" action:@selector(test2ItemClicked)];


[[UIMenuController sharedMenuController] setMenuItems:@[testMenuItem1,testMenuItem2]];

UIMenuController *menuController = [UIMenuController sharedMenuController];

[menuController setTargetRect:newRect inView:_readerWebView];

[menuController setMenuVisible:YES animated:YES];

在此处输入图像描述

因为 UIMenuController 是一个单例,如果你想显示以前的 menuItems,你必须再次设置它们。

于 2014-01-30T11:52:37.913 回答