iOS-学习笔记(4)---UIMenuController

默认支持的控件有

  • UITextField
  • UITextView
  • UIWebView

让其他控件也支持

以UILabel为例演示如何让其他控件支持UIMenuController。

1. 自定义MenuLabel让其继承自UILabel
2. 在初始化方法中设置:允许Label交互,并添加单击手势.
self.userInteractionEnabled = YES;
[self addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick)]];
3. 显示 UIMenuController。
//实现单击方法
- (void)tapClick
{
    //让Label成为第一响应者
    [self becomeFirstResponder];

    UIMenuController *menu = [UIMenuController sharedMenuController];
    /**
     * 参数说明
     * targetRect: UIMenuController 要指向的矩形框
     * targetView: targetRect 会以targetView的左上角为坐标原点
     */
    [menu setTargetRect:self.bounds inView:self];
    [menu setMenuVisible:YES animated:YES];
}

重写canBecomeFirstResponder方法,让label有资格成为第一响应者。

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

为什么要成为第一响应者?因为UIMenuController的显示是需要参考第一响应者的,当一个控件不再是第一响应者的时候,它叫出来的UIMenuController也会随之消失。而且,UIMenuController要实现哪些方法,那些方法的具体实现,都会去询问第一响应者。

到目前为止,还不能正常显示出UIMenuController,因为它还不知道要实现哪些方法。所以需要重写canPerformAction: withSender: 来告诉它。可以顺便打印出来,看它默认支持哪些方法。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
     NSLog(@"%@",NSStringFromSelector(action));
    return YES;
}

效果大概如下

menu_1.png

4. 过滤方法,只保留我们需要的。

如果我们只想要剪切复制粘贴,可以在canPerformAction: withSender:方法中过滤一下。从之前的打印的方法中我们知道剪切、复制、粘贴分别对应cut:copy:paste:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(cut:) || action == @selector(paste:) || action == @selector(copy:)) {
        return YES;
    }
    return NO;
}
5. 最后一步就是实现方法了。如果我们想要实现剪切复制粘贴这几个功能,就需要实现相应的方法。
- (void)cut:(UIMenuController *)menu
{
    // 将自己的文字复制到粘贴板
    [self copy:menu];

    // 清空文字
    self.text = nil;
}

- (void)copy:(UIMenuController *)menu
{
    // 将自己的文字复制到粘贴板
    UIPasteboard *board = [UIPasteboard generalPasteboard];
    board.string = self.text;
}

- (void)paste:(UIMenuController *)menu
{
    // 将粘贴板的文字 复制 到自己身上
    UIPasteboard *board = [UIPasteboard generalPasteboard];
    self.text = board.string;
}

最后效果如下

menu_3.gif

自定义UIMenuController上的item

虽然系统提供的功能挺全的,但不满足怎么办?这个时候我们可以定制我们自己的Item。

- (void)tapClick
{
    [self becomeFirstResponder];

    UIMenuController *menu = [UIMenuController sharedMenuController];

    //在menu显示前添加几个自定义的Item
    UIMenuItem *zanItem = [[UIMenuItem alloc]initWithTitle:@"赞" action:@selector(zan:)];
    UIMenuItem *shareItem = [[UIMenuItem alloc]initWithTitle:@"分享" action:@selector(share:)];
    //设置menuItems
    menu.menuItems = @[zanItem,shareItem];

    [menu setTargetRect:self.bounds inView:self];
    [menu setMenuVisible:YES animated:YES];
}

再实现 zan:share:两个方法。

- (void)zan:(UIMenuController *)menu
{
    NSLog(@"赞");
}

- (void)share:(UIMenuController *)menu
{
    NSLog(@"分享");
}

最后再通过canPerformAction: withSender:方法告诉UIMenuController实现了这两个方法。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(zan:) || action == @selector(share:)) {
        return YES;
    }
    return NO;
}

menu_4.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值