ind*_*gie 60 iphone cocoa-touch objective-c uimenucontroller ipad
我正在尝试创建一个自定义的UIMenuController并在我的视图中显示它.这是我的代码:
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *listMenuItem = [[UIMenuItem alloc] initWithTitle:@"List" action:@selector(addList:)];
[menuController setMenuItems:[NSArray arrayWithObject:listMenuItem]];
[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];
[listMenuItem release];
Run Code Online (Sandbox Code Playgroud)
没有错误或异常,但菜单控制器只是没有出现.
小智 162
你需要做三件事:
-becomeFirstResponder
视图或查看控制器.-canBecomeFirstResponder
(返回YES
).-canPerformAction:action withSender:sender
单独显示/隐藏菜单项.Kal*_*lle 19
答案提到了三件事,但要挑剔,有六件事:
-becomeFirstResponder
失败.userInteractionEnabled = YES
-window
属性必须与inView:
参数中视图的窗口相同.-canBecomeFirstResponder
并返回YES
.[handler becomeFirstResponder]
,否则后者将失败. [menu setTargetRect:inView:]
[menu setTargetRect:inView]
(至少一次)和[menu setMenuVisible:animated:]
.特别是上面1-3点得到了我.我想要一个自定义菜单处理程序类UIResponder
,它首先导致-becomeFirstResponder
返回NO
; 然后它是一个UIView
,它失败了,然后我试图使其成为UIButton
其工作,但只是因为userInteractionEnabled
默认YES
按钮和NO
为UIView
秒.
小智 15
UIMenuController
仅当视图是第一响应者时才在任何视图上可见
- (BOOL)canPerformAction
方法返回 YES
因此,如果要在按钮单击时显示菜单控制器,则按钮操作中的第一行应为[self becomeFirstResponder]
.注意:此处self是将显示菜单的视图.
如果要在长按手势上显示菜单,则UIView
在写入之前将longPressGesture 添加到longpress事件中
[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];
Run Code Online (Sandbox Code Playgroud)
写 [self becomeFirstResponder];
然后按照OZ提到的步骤进行操作.
以下是完整评论的工作示例...
查看子类头文件
#import <Foundation/Foundation.h>
@interface MenuControllerSupportingView : UIView
{
}
@end
Run Code Online (Sandbox Code Playgroud)
查看子类源文件
#import "MenuControllerSupportingView.h"
@implementation MenuControllerSupportingView
//It's mandatory and it has to return YES then only u can show menu items..
-(BOOL)canBecomeFirstResponder
{
return YES;
}
-(void)MenuItemAClicked
{
NSLog(@"Menu item A clicked");
}
-(void)MenuItemBClicked
{
NSLog(@"Menu item B clicked");
}
-(void)MenuItemCClicked
{
NSLog(@"Menu item C clicked");
}
//It's not mandatory for custom menu items
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action == @selector(MenuItemAClicked))
return YES;
else if(action == @selector(MenuItemBClicked))
return YES;
else if(action == @selector(MenuItemCClicked))
return YES;
else
return NO;
}
Run Code Online (Sandbox Code Playgroud)
查看控制器头文件
#import <UIKit/UIKit.h>
@interface ViewController1 : UIViewController
@end
Run Code Online (Sandbox Code Playgroud)
查看控制器源文件
#import "ViewController1.h"
#import "MenuControllerSupportingView.h"
@interface ViewController1 ()
{
MenuControllerSupportingView *vu;
}
@end
@implementation ViewController1
- (void)viewDidLoad
{
[super viewDidLoad];
vu=[[SGGI_MenuControllerSupportingView alloc]initWithFrame:CGRectMake(0,0,768,1024)];
[self.view addSubview:vu];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(200,200,200,30)];
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[btn setTitle:@"Show" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(SHowMenu) forControlEvents:UIControlEventTouchUpInside];
[vu addSubview:btn];
}
-(void)SHowMenu
{
UIMenuController *menucontroller=[UIMenuController sharedMenuController];
UIMenuItem *MenuitemA=[[UIMenuItem alloc] initWithTitle:@"A" action:@selector(MenuItemAClicked)];
UIMenuItem *MenuitemB=[[UIMenuItem alloc] initWithTitle:@"B" action:@selector(MenuItemBClicked)];
UIMenuItem *MenuitemC=[[UIMenuItem alloc] initWithTitle:@"C" action:@selector(MenuItemCClicked)];
[menucontroller setMenuItems:[NSArray arrayWithObjects:MenuitemA,MenuitemB,MenuitemC,nil]];
//It's mandatory
[vu becomeFirstResponder];
//It's also mandatory ...remeber we've added a mehod on view class
if([vu canBecomeFirstResponder])
{
[menucontroller setTargetRect:CGRectMake(10,10, 0, 200) inView:vu];
[menucontroller setMenuVisible:YES animated:YES];
}
}
-(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Run Code Online (Sandbox Code Playgroud)
在View类中,如果您在canPerformAction中单独写返回YES,您将看到所有默认菜单项,例如摄像机符号,剪切,复制等。
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return YES;
}
Run Code Online (Sandbox Code Playgroud)
如果你想单独显示像照相机这样的东西
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action==@selector(_insertImage:))
return YES;
else
return NO;
}
Run Code Online (Sandbox Code Playgroud)
如果你想知道所有动作,那么
访问链接