我正在使用UIMenuController的新自定义功能,将“复制”以外的内容添加到菜单中,以便剪切和粘贴到网页视图中。
我所做的是获取对共享UIMenuController的引用,将我的NSArray的UIMenuItems设置为menuItems,只要我添加一个项目,一切正常。例如,我看到[COPY | FOOBAR]。
相反,如果我尝试添加多个项目,那么我会看到[复制|更多],如果我按下MORE而不是其他项目将会显示。
可以直接显示[COPY | FOO | BAR | THREE | FOUR]吗?我看到了一些能够做到这一点的应用程序,尤其是iBooks。
任何非常有用的帮助,谢谢。
干杯, sissensio
答案 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的框架
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,你必须再次设置它们。