今天遇到一個(gè)這樣的需求:
在點(diǎn)擊UILabel的時(shí)候,會(huì)彈出來(lái)一個(gè)類似于下圖的效果:
第一次看到這個(gè)需求的時(shí)候,真的是一臉懵逼,在自己的印象中UILabel從來(lái)沒(méi)有這種屬性,最后經(jīng)過(guò)一天的網(wǎng)上查找資料,發(fā)現(xiàn)之所以能夠彈出這個(gè)框,是因?yàn)檎{(diào)用了UIMenuController,于是乎就開(kāi)始寫Demo來(lái)測(cè)試.
下面介紹一下UIMenuController的用法:
- 默認(rèn)情況下,有一下控件已經(jīng)支持UIMenuController
- UITextField
- UITextView
- UIWebView
但是UILabel不支持UIMenuController,為了讓UILabel也支持,這時(shí)候需要自定義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有資格成為第一響應(yīng)者
*/
- (BOOL)canBecomeFirstResponder {
return YES;
}
/**
* label能執(zhí)行哪些操作(比如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 {
// 將自己的文字復(fù)制到粘貼板
[self copy:menu];
// 清空文字
self.text = nil;
}
- (void)copy:(UIMenuController *)menu {
// 將自己的文字復(fù)制到粘貼板
UIPasteboard *board = [UIPasteboard generalPasteboard];
board.string = self.text;
}
- (void)paste:(UIMenuController *)menu {
// 將粘貼板的文字 復(fù)制 到自己身上
UIPasteboard *board = [UIPasteboard generalPasteboard];
self.text = board.string;
}
- (void)labelClick {
// 1.label要成為第一響應(yīng)者(作用是:告訴UIMenuController支持哪些操作, 這些操作如何處理)
[self becomeFirstResponder];
// 2.顯示MenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// targetRect: MenuController需要指向的矩形框
// targetView: targetRect會(huì)以targetView的左上角為坐標(biāo)原點(diǎn)
[menu setTargetRect:self.bounds inView:self];
// [menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
}
@end
用自定義UILabel以后,顯示出來(lái)的效果圖如下:
但是這還不是需求要的效果:
這和需求要的效果還有一點(diǎn)差距,所以用系統(tǒng)的UIMenuController顯然是不行,所以這時(shí)候要自定義UIMenuController,具體的實(shí)現(xiàn)方法在下一篇文章來(lái)實(shí)現(xiàn), 如果感覺(jué)文章對(duì)大家有幫助,請(qǐng)點(diǎn)個(gè)贊,我會(huì)繼續(xù)努力.......