iphone - 自定义 UIMenuController

标签 iphone uimenucontroller

您好,我想在 iPhone SDK3.x 中创建一个自定义气泡菜单,例如剪切/复制/粘贴菜单。我知道它是 UIMenuController 但它只提供标准的剪切/复制/粘贴菜单。任何人都知道如何制作类似这样的气泡菜单。有没有例子和代码可以引用?

最佳答案

1)您需要将自定义菜单项添加到共享的 UIMenuController:

UIMenuItem* miCustom1 = [[[UIMenuItem alloc] initWithTitle: @"Custom 1" action:@selector( onCustom1: )] autorelease];
UIMenuItem* miCustom2 = [[[UIMenuItem alloc] initWithTitle: @"Custom 2" action:@selector( onCustom2: )] autorelease];
UIMenuController* mc = [UIMenuController sharedMenuController];
mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2, nil];

2)您需要在响应程序链中的某个位置实现处理程序方法,以便当您显示菜单时该 View 将成为第一响应程序:

- (void) onCustom1: (UIMenuController*) sender
{
}

- (void) onCustom2: (UIMenuController*) sender
{
}

3) 您可以选择在响应者链中实现 canPerformAction: ,以便在显示菜单时将成为第一响应者:

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector( onCustom1: ) )
    {
            return YES; // logic here for context menu show/hide
    }

    if ( action == @selector( onCustom2: ) )
    {
            return NO;  // logic here for context menu show/hide
    }

    if ( action == @selector( copy: ) )
    {
             // turn off copy: if you like:
        return NO;
    }

    return [super canPerformAction: action withSender: sender];
}

4) 如果您想要显示菜单的 View 尚不支持显示菜单(即,当用户长按时 UIWebView 将显示菜单,但 UILabel 没有内置支持显示菜单),那么您需要自己呈现菜单。这通常是通过将 UILongPressGestureRecognizer 附加到 View ,然后在回调中显示菜单来完成的:

UILongPressGestureRecognizer* gr = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector( onShowMenu: ) ] autorelease];
   [_myview addGestureRecognizer: gr];



- (void) onShowMenu: (UIGestureRecognizer*) sender
{
    [sender.view becomeFirstResponder];

    UIMenuController* mc = [UIMenuController sharedMenuController];

    CGRect bounds = sender.view.bounds;

    [mc setTargetRect: sender.view.frame inView: sender.view.superview];
    [mc setMenuVisible: YES animated: YES];
}

注意,必须有一个声明为firstResponder 的 View 才能显示菜单。

5) 确保您显示菜单的 View 向 canBecomeFirstResponder 返回 YES/TRUE。例如,如果您尝试将 UILabel 设置为第一响应者,它将返回 NO,因此您必须对其进行子类化。

6) 就是这样。您可能希望在调用操作回调时退出 FirstResponder - 但要做到这一点,您需要实现逻辑来发现firstResponder。

关于iphone - 自定义 UIMenuController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604716/

相关文章:

iphone - 如何在不更改 iPhone 应用程序中的设备方向的情况下更改应用程序的方向

ios - Apple 如何访问 sharedMenuController 项目的 UIWebView PDF 字符串?

ios - UIMenuController 和 TapGesture 在移动时重新出现

ios - 使用 UICollisionBehavior 调整 UIView 的大小

javascript - Titanium iPhone 在共享首选项中存储变量值

objective-c - UIWebView中的UIMenuController编辑菜单只出现第二次

ios - 第二个 UIMenuController 没有隐藏

iphone - 如何显示自定义弹出窗口而不是UIMenuController

php - 构建 native 移动应用程序 - 基于 PHP 网络应用程序

javascript - 在 NodeJS 中通过 USB 连接 Android/iPhone 设备