iOS開發(fā)之-UIMenuController

在iOS應(yīng)用中,我們經(jīng)常會(huì)做一些跟輸入內(nèi)容相關(guān)的操作,由于對(duì)絕大多數(shù)用戶來說打字都是一件比較痛苦的事情,因此有沒有一種可以讓我們的用戶以偷懶的方式完成內(nèi)容的輸入呢???

非常幸運(yùn)的是,apple給我們提供了這種偷懶的功能,讓用戶可以通過"command+c","command+v"的方式來完成內(nèi)容的輸入,完成這種偷懶功能的主角就是UIMenuController.

Paste_Image.png

在iOS的控件中,如下的控件已經(jīng)默認(rèn)支持UIMenuViewController:
1.UITextFild

Paste_Image.png

2.UITextView

Paste_Image.png

3.UIWebView...

Paste_Image.png

這么好用的功能只有這三個(gè)控件能玩兒么?? 我們自定義的控件可以實(shí)現(xiàn)這樣的功能么??
經(jīng)研究發(fā)現(xiàn),答案是YES的,現(xiàn)在我將以UILabel為例子進(jìn)行說明

要使用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.讓菜單顯示出來

[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;
}
Paste_Image.png
#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í)際的開發(fā)中,系統(tǒng)默認(rèn)的菜單項(xiàng)就夠了嗎??
肯定是不夠的,我們往往要根據(jù)項(xiàng)目的實(shí)際需求去定制菜單項(xiàng),比如:

Paste_Image.png

定制菜單項(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");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我能理解你,但我不會(huì)放棄。喜不喜歡你,喜歡到什么程度,對(duì)你什么態(tài)度,那是我的事。所以你不要有壓力。
    熊貓掰棒子閱讀 238評(píng)論 0 0
  • transpires:(秘密或未知事實(shí))暴露,公開,為人所知 / 發(fā)生 / (人體或植物)蒸騰,水分蒸發(fā) aide...
    大立柜閱讀 417評(píng)論 0 0
  • 有人說,社會(huì)日益浮躁,精神失焦。一言以蔽之,自然是偏頗的。可于某些領(lǐng)域之中,依然還是能窺見浮躁之端倪,或許,都已不...
    傀儡宋饹馇閱讀 231評(píng)論 0 1
  • 今天是開始寫作的第25天,對(duì)于5,10這樣的數(shù)字,總是有了里程碑式的感覺,像是跑馬拉松跑到了一個(gè)標(biāo)志性的地點(diǎn),可以...
    燦燦_e560閱讀 292評(píng)論 6 7
  • 長期究竟是多長? 聽文章的時(shí)候,看文章的時(shí)候講的頭頭是道,感覺都是正確的,當(dāng)關(guān)閉語音的時(shí)候,才發(fā)現(xiàn)就給自己的有以下...
    忠良162閱讀 335評(píng)論 0 0

友情鏈接更多精彩內(nèi)容