今天遇到一个这样的需求:
在点击UILabel的时候,会弹出来一个类似于下图的效果:
第一次看到这个需求的时候,真的是一脸懵逼,在自己的印象中UILabel从来没有这种属性,最后经过一天的网上查找资料,发现之所以能够弹出这个框,是因为调用了UIMenuController,于是乎就开始写Demo来测试.
下面介绍一下UIMenuController的用法:
- 默认情况下,有一下控件已经支持UIMenuController
- UITextField
- UITextView
- UIWebView
但是UILabel不支持UIMenuController,为了让UILabel也支持,这时候需要自定义UILabel;
- 在.h文件
#import <UIKit/UIKit.h>
@interface XJLabel : UILabel
@end
- 在.m文件
#import "XJLabel.h"
@implementation XJLabel
- (void)awakeFromNib {
[super awakeFromNib];
[self setup];
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
- (void)setup {
self.userInteractionEnabled = YES;
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
}
/**
* 让label有资格成为第一响应者
*/
- (BOOL)canBecomeFirstResponder {
return YES;
}
/**
* label能执行哪些操作(比如copy, paste等等)
* @return YES:支持这种操作
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;
return NO;
}
- (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;
}
- (void)labelClick {
// 1.label要成为第一响应者(作用是:告诉UIMenuController支持哪些操作, 这些操作如何处理)
[self becomeFirstResponder];
// 2.显示MenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// targetRect: MenuController需要指向的矩形框
// targetView: targetRect会以targetView的左上角为坐标原点
[menu setTargetRect:self.bounds inView:self];
// [menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
}
@end
用自定义UILabel以后,显示出来的效果图如下:
但是这还不是需求要的效果:
这和需求要的效果还有一点差距,所以用系统的UIMenuController显然是不行,所以这时候要自定义UIMenuController,具体的实现方法在下一篇文章来实现, 如果感觉文章对大家有帮助,请点个赞,我会继续努力.......