基於系統的UIMenuController的使用及自定義UIMenuItem


1、前言

  • 在開發中 UIMenuController 用得較少,偶爾遇到了,一時竟想不起來,因此做個回顧

2、系統默認支持 UIMenuController 的UI控件

  • UITextField

  • UITextView

  • UIWebView

  • ...

3、讓 UILabel 擁有系統的 UIMenuController

  • 自定義 UILabel 內部


// 1、讓自定義的 UILabel 有資格成為第一響應者
- (BOOL)canBecomeFirstResponder {
    return YES;
}
// 2、自定義的 UILabel 的 Menu 能執行哪些操作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    // cut:剪切 / copy:復制 / paste:粘貼
    if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) {
        return  YES;
    }
    return NO;
}
// 3、那這些方法怎么實現呢
- (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;
}
// 4、系統的 menuController 方法還有 selector: / selectAll: /delete: 等
  • 外部控制器里, 給 label 添加點擊手勢,在手勢方法里


- (void)labelClick {
    // 讓 自定義的label 成為第一響應者
    [self.label becomeFirstResponder];
    // 創建 UIMenuController
    UIMenuController *menu = [UIMenuController sharedMenuController];
    // 設置 UIMenuController 的顯示區域,targetRect 為指向的矩形框,inView 為以該 view 的左上角為原點
    [menu setTargetRect:self.view.bounds inView:self.view];
    // 設置可見
    [menu setMenuVisible:YES animated:YES];
}

4、讓 UILabel 擁有自定義的 UIMenuController

  • 自定義 UILabel 內部

// 1、讓自定義的 UILabel 有資格成為第一響應者
- (BOOL)canBecomeFirstResponder {
    return YES;
}
// 2、自定義的 UILabel 的 Menu 能執行哪些操作 , 自定義返回 NO
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    return NO;
}
  • 外部控制器里, 給 label 添加點擊手勢,在手勢方法里

    • 自定義的 UIMenuItem 及 UIMenuItem 對應的方法寫在外部(控制器)里


- (void)labelClick {
    UIMenuController *menu = [UIMenuController sharedMenuController];
    // 先處理之前的
    if (menu.menuVisible) {
        [menu setMenuVisible:NO animated:YES];
    } else {
        [self.label becomeFirstResponder];
        // 創建自定義的 UIMenuItem
        UIMenuItem *item1 = [[UIMenuItem alloc]initWithTitle:@"zhang1" action:@selector(item1Click)];
        UIMenuItem *item2 = [[UIMenuItem alloc]initWithTitle:@"zhang2" action:@selector(item2Click)];
        // 設置 MenuItem
        [menu setMenuItems:@[item1, item2]];
        [menu setTargetRect:self.view.bounds inView:self.view];
        [menu setMenuVisible:YES animated:YES];
    }
}
// 實現 UIMenuItem 對應的方法
- (void)item1Click {
}
- (void)item2Click {
}
  • 自定義了 UIMenuItem 后,若其他地方用 UIMenuController,不用這些item ,需要把 menuItems = nil 或 @[ ]

5、讓 UITableCell 點擊擁有自定義的 UIMenuController

  • 自定義 cell 內部


// 1、讓自定義的 cell 有資格成為第一響應者
- (BOOL)canBecomeFirstResponder {
    return YES;
}
// 2、自定義的 cell 的 Menu 能執行哪些操作, 自定義返回 NO
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    return NO;
}
  • 在外部(控制器里),在 cell 點擊方法里


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIMenuController *menu = [UIMenuController sharedMenuController];
    // 先處理之前的
    if (menu.menuVisible) {
        [menu setMenuVisible:NO animated:YES];
    } else {
        DIYCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        [cell becomeFirstResponder];
        UIMenuItem *item1 = [[UIMenuItem alloc]initWithTitle:@"zhang1" action:@selector(item1Click)];
        UIMenuItem *item2 = [[UIMenuItem alloc]initWithTitle:@"zhang2" action:@selector(item2Click)];
        [menu setMenuItems:@[item1, item2]];
        // 設置 menu 的指向的矩形框
        CGRect rect = CGRectMake(0, cell.diy_height * 0.5, cell.diy_width, cell.diy_height * 0.5);
        [menu setTargetRect:rect inView:cell];
        [menu setMenuVisible:YES animated:YES];
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM