在iOS應(yīng)用中,我們經(jīng)常會(huì)做一些跟輸入內(nèi)容相關(guān)的操作,由于對(duì)絕大多數(shù)用戶來(lái)說(shuō)打字都是一件比較痛苦的事情,因此有沒(méi)有一種可以讓我們的用戶以偷懶的方式完成內(nèi)容的輸入呢???
非常幸運(yùn)的是,apple給我們提供了這種偷懶的功能,讓用戶可以通過(guò)"command+c","command+v"的方式來(lái)完成內(nèi)容的輸入,完成這種偷懶功能的主角就是UIMenuController.
在iOS的控件中,如下的控件已經(jīng)默認(rèn)支持UIMenuViewController:
1.UITextFild
2.UITextView
3.UIWebView...
這么好用的功能只有這三個(gè)控件能玩兒么?? 我們自定義的控件可以實(shí)現(xiàn)這樣的功能么??
經(jīng)研究發(fā)現(xiàn),答案是YES的,現(xiàn)在我將以UILabel為例子進(jìn)行說(shuō)明
要使用UIMenuController指向某一個(gè)控件,就必須讓該控件成為第一響應(yīng)者
1.讓該控件成為第一響應(yīng)者
[self becomeFirstResponder];
2.注意:并不是調(diào)用了上面一句代碼的所有控件都能成為第一響應(yīng)者
因此我們還得在這個(gè)控件中添加:
- (BOOL)canBecomeFirstResponder
{
return YES;
}
3.控制菜單上顯示什么樣的菜單項(xiàng)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:) || action == @selector(paste:) || action == @selector(cut:)) {
return YES;
}
return NO;
}
4.讓菜單顯示出來(lái)
[menuVc setTargetRect:self.frame inView:self.superview];
[menuVc setMenuVisible:YES animated:YES];
5.處理菜單上菜單項(xiàng)的點(diǎn)擊事件
- (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)cut:(UIMenuController *)menu
{
[self copy:menu];
self.text = nil;
}
#import "LXBLabel.h"
@implementation LXBLabel
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)awakeFromNib
{
[self setup];
}
- (void)setup
{
self.userInteractionEnabled = YES;
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickLabel)]];
}
- (void)clickLabel
{
[self becomeFirstResponder];
UIMenuController *menuVc = [UIMenuController sharedMenuController];
// 控制好menu的顯示與隱藏
UIMenuController *menuVc = [UIMenuController sharedMenuController];
if (menuVc.isMenuVisible) {
[menuVc setMenuVisible:NO animated:YES];
}
[menuVc setTargetRect:self.frame inView:self.superview];
[menuVc setMenuVisible:YES animated:YES];
}
- (BOOL)canBecomeFirstResponder
{
// 明確該控件可以成為第一響應(yīng)者
return YES;
}
// 該控件可以執(zhí)行哪些動(dòng)作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:) || action == @selector(paste:) || action == @selector(cut:)) {
return YES;
}
return NO;
}
- (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)cut:(UIMenuController *)menu
{
[self copy:menu];
self.text = nil;
}
@end
在實(shí)際的開(kāi)發(fā)中,系統(tǒng)默認(rèn)的菜單項(xiàng)就夠了嗎??
肯定是不夠的,我們往往要根據(jù)項(xiàng)目的實(shí)際需求去定制菜單項(xiàng),比如:
定制菜單項(xiàng):
UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle:@"item1" action:@selector(item1Click:)];
UIMenuItem *item2 = [[UIMenuItem alloc] initWithTitle:@"item2" action:@selector(item2Click:)];
menuVc.menuItems = @[item1,item2];
// 處理菜單項(xiàng)的點(diǎn)擊事件
- (void)item1Click:(UIMenuController *)menu
{
NSLog(@"item1Click");
}
- (void)item2Click:(UIMenuController *)menu
{
NSLog(@"item2Click");
}