iOS UIMenuController简介


一点小知识,有必要总结一下。

1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES
2. Menu所处的View必须实现 – (BOOL)canPerformAction:withSender, 并根据需求返回YES或NO
3. 使Menu所处的View成为First Responder (becomeFirstResponder)
4. 定位Menu (- setTargetRect:inView:)
5. 展示Menu (- setMenuVisible:animated:)


UIMenuController *popMenu = [UIMenuController sharedMenuController];

  

UIMenuItem *item1 = [[UIMenuItem allocinitWithTitle:@”1″ action:@selector(menuItem1Pressed:)];

UIMenuItem *item2 = [[UIMenuItem allocinitWithTitle:@”2″ action:@selector(menuItem2Pressed:)];

UIMenuItem *item3 = [[UIMenuItem allocinitWithTitle:@”3″ action:@selector(menuItem3Pressed:)];

UIMenuItem *item4 = [[UIMenuItem allocinitWithTitle:@”4″ action:@selector(menuItem4Pressed:)];

NSArray *menuItems = [NSArray arrayWithObjects:item1,item2,item3,item4,nil];

[popMenu setMenuItems:menuItems];

[popMenu setArrowDirection:UIMenuControllerArrowDown];

  

[item4 release];

[item3 release];

[item2 release];

[item1 release];

[popMenu setTargetRect:CGRectMake(162,195,0,0inView:self.dialView];

[popMenu setMenuVisible:YES animated:YES];

后来在StackOverFlow上看到这个问题,同时也在cocoachina上找到相应的方法,原来要想显示弹出菜单,必须实现3个方法,缺一不可:

 

  1. becomFirstResponder方法,使view或者viewController的self成为第一响应者,可以在相应文件的任意地方调用实现该方法,不过建议与UIMenuController放在一起。

    [self becomeFirstResponder];

  2. 设置-(BOOL) canBecomeFirstResponder的返回值为YES,原因不言而喻。

    -(BOOL) canBecomeFirstResponder{

    return YES;

    }

  3. 重载函数-(BOOL) canPerfomAction:(SEL)action withSender:(id)sender,设置要显示的菜单项,返回值为YES。若不进行任何限制,则将显示系统自带的所有菜单项(很多的,自己可以试一下),在此,只显示自定义的4项,即:

    -(BOOL) canPerformAction:(SEL)action withSender:(id)sender{

    if (action == @selector(menuItem1Pressed:) || action == @selector(menuItem2Pressed:) ||

    action == @selector(menuItem3Pressed:) || action == @selector(menuItem4Pressed:)) {

    return YES;

    }

    return NO; //隐藏系统默认的菜单项

    }

    至于相应的菜单响应通过各selector函数来实现,如:

    - (IBAction) menuItem1Pressed:(id)sender{

    txtInputLabel.text = @”1″;

    [[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];

    }

    如果将系统默认的菜单也显示出来,那么自定义的菜单将作为第二菜单,调用菜单时默认显示的是第一菜单,如果要直接显示第二菜单,根据cocoachina上一位同行总结出来的经验,先设置菜单可见性为NO即可:

    [popMenu setMenuVisible:NO animated:YES];


 
        
UIMenuItem* miCustom1 = [[[UIMenuItem alloc] initWithTitle: @"MENU1" action:@selector( onCustom1: )] autorelease];
 
UIMenuItem* miCustom2 = [[[UIMenuItem alloc] initWithTitle: @"MENU2" action:@selector( onCustom2: )] autorelease];
 
UIMenuController* mc = [UIMenuController sharedMenuController];
mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2,nil];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值