gpt4 book ai didi

iphone - 自定义 UIMenuController

转载 作者:行者123 更新时间:2023-12-03 18:40:34 26 4
gpt4 key购买 nike

您好,我想在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com