一个接一个地显示UIMenuController的问题

时间:2010-07-15 11:26:40

标签: iphone ipad sdk uimenucontroller

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

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

相反,如果我尝试添加多个项目,那么我会看到[复制|更多],如果我按下MORE而不是其他项目将会显示。

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

任何非常有用的帮助,谢谢。

干杯, sissensio

4 个答案:

答案 0 :(得分:15)

fluXa的答案实际上是正确的,但我不认为它非常清楚。

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

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

如果您需要包含内置系统项,只需添加具有相同标题但具有不同选择器的自定义UIMenuItem。 (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;
}

答案 1 :(得分:4)

当我尝试在iPad中开发应用程序时,我们遇到了同样的问题。但我所做的是禁用了

中的弹出菜单项
  
      
  • (BOOL)canPerformAction:(SEL)action withSender:(id)sender
  •   

使用

  

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

然后我使用了UIPopoverController。

此致 ZaldzBugz

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

在您要显示第二个UIMenuController的action方法中,获取上一个UIMenuController的框架

enter image description here

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

enter image description here

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