你见过却不知道的UIMenuController

前言:最近一段时间都在做项目,写博客很少,这几天会把项目中遇到的一些小知识点总结分享给大家.

先看一下图,苹果自带的UIMenuController都在什么地方
  • UITextFiled
UITextFiled.png
  • UITextView
UITextView.png
  • UIWebView
UIWebView.png
  • 由以上3张图可以看出UITextFiled,UITextView,UIWebView,在这几个控件上点击时都能够弹出UIMenuController,以便我们实现拷贝,粘贴等功能, 但我们在实际开发过程中有可能有这样的需求,如下图
cell.png
  • 大家都知道, cell不具备以上功能的,需要我们自己实现这种需求,下面为了方便演示,我对前三张图片中的UILable实现上述功能.

  • 要让UILable实现上述功能我们需要对UILable进行重写,代码如下;

#import "ZHLable.h"

@implementation ZHLable

- (void)awakeFromNib
{
    // 给lable添加手势
    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
}

/**
 *  label可以成为第一响应者
 */
- (BOOL)canBecomeFirstResponder
{
    return YES;
}

/**
 *  监听label点击
 */
- (void)labelClick
{
    // 成为第一响应者
    [self becomeFirstResponder];
    
    // 弹出MenuController
    UIMenuController *menu = [UIMenuController sharedMenuController];
    // 设置显示的范围
    //    [menu setTargetRect:self.bounds inView:self];
    [menu setTargetRect:self.frame inView:self.superview];
    [menu setMenuVisible:YES animated:YES];
}

/**
 *  这个方法决定了MenuController的菜单项内容
 *  返回YES,就代表MenuController会有action菜单项
 */
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(cut:)
        || action == @selector(copy:)
        || action == @selector(paste:)) return YES;
    return NO;
}

#pragma mark - 菜单点击处理
- (void)cut:(UIMenuController *)menu
{
    // 将当前label的文字设置到粘贴板
    [UIPasteboard generalPasteboard].string = self.text;
    
    // 清空文字
    self.text = nil;
}

- (void)copy:(UIMenuController *)menu
{
    // 将当前label的文字设置到粘贴板
    [UIPasteboard generalPasteboard].string = self.text;
}

- (void)paste:(UIMenuController *)menu
{
    // 将粘贴板的文字设置到当前label上
    self.text = [UIPasteboard generalPasteboard].string;
}

@end


  • OK,这样我们实现了上述功能, 如下图:
lable.png
上述实现过程也不是很难,关键是大家需要知道有这个功能,当项目有这样的需求知道怎么做就行

注: 上面整个示例过程可能对于初学者可能还存在以下问题

  • (一)语言问题:
语言问题.png

解决方法:

语言解决.png
  • (二)UILable默认不能与用户交互
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;  // default is NO

解决方法:
1⃣️
lable.userInteractionEnabled = YES;
2⃣️

交互.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容