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];
}
}