九、點擊控制項彈出複製粘貼剪下選擇等(UIMenuController),複製粘貼剪下快速鍵
預設情況下,有以下控制項已經支援UIMenuController
UITextField
UITextView
UIWedView
以UITable為例,說明點擊後彈出複製剪下粘貼等為例
使用的整體思路:(系統內建的文字)
1、建立一個UILabel的類,如果想以後storyboard和Xib都可以用,就可以調用awakeFromNib和initWithFrame方法,同時進行初始化操作
2、使UILabel成為第一響應者作用:
提供兩種方法canBecomeFirstResponder和canPerformAction(兩種必寫)
同時告訴UIMenuController支援哪些操作,這些操作如何處理。
3、建立UIMenuController對象,設定兩個條件
首先:設定彈出的對象顯示的範圍
然後:讓對象能夠顯現出來,且動畫方式出現
4、UIMenuController對象的各類方法操作的實現(copy,paste,cut等)
1 #import "ZWLabel.h" 2 3 @implementation ZWLabel 4 5 - (void)awakeFromNib 6 { 7 [self setup]; 8 } 9 - (instancetype)initWithFrame:(CGRect)frame10 {11 if (self = [super initWithFrame:frame]) {12 [self setup];13 }14 return self;15 }16 /**17 * 初始化操作18 */19 - (void)setup20 {21 self.userInteractionEnabled = YES;22 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)];23 [self addGestureRecognizer:tap];24 }25 /**26 * 點擊後操作27 */28 - (void)labelClick29 {30 //使之成為第一響應者,成為之後會提供兩種方法becomeFirstResponder和canPerformAction31 //同時告訴UIMenuController支援哪些操作,這些操作如何處理32 [self becomeFirstResponder];33 34 //建立menu控制器35 UIMenuController *menu = [UIMenuController sharedMenuController];36 //彈出的menu顯示在哪個地區(兩種方式)37 // [menu setTargetRect:self.frame inView:self.superview];38 [menu setTargetRect:self.bounds inView:self];39 //使menu可見40 [menu setMenuVisible:YES animated:YES];41 }42 43 /**44 * 是label能成為第一響應者45 */46 - (BOOL)canBecomeFirstResponder47 {48 return YES;49 }50 51 /**52 * label能執行哪些操作(比如copy,paste)53 */54 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender55 {56 NSLog(@"%@",NSStringFromSelector(action));//此處可以列印出支援哪些操作(比如copy,cut,paste等,詳情見最底部的列印結果)57 if (action == @selector(copy:) || action == @selector(cut:) || action == @selector(paste:)) return YES;58 return NO;59 }60 61 - (void)copy:(UIMenuController *)menu62 {63 //將自己的文字複製到粘貼板64 UIPasteboard *board = [UIPasteboard generalPasteboard];65 board.string = self.text;66 }67 - (void)cut:(UIMenuController *)menu68 {69 //將自己的文字複製到粘貼板70 [self copy:menu];71 //清空文字72 self.text = nil;73 }74 - (void)paste:(UIMenuController *)menu75 {76 UIPasteboard *board = [UIPasteboard generalPasteboard];77 self.text = board.string;78 }
使用自訂文字
整體都需要移動到viewController中,否則雖然都在UILabel中,能正確運行,但是會提示一堆警告。
即不用重新建立一個繼承自UILabel的類,只需要添加了一個UIMenuItem對象,去除掉canPerformAction以及相關的方法即可,代碼如下:
注意:需要在label中勾上userInteractionEnabled
1 #import "ViewController.h" 2 @interface ViewController () 3 @property (weak, nonatomic) IBOutlet UILabel *textLabel; 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad {10 [super viewDidLoad];11 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)];12 [self.textLabel addGestureRecognizer:tap];13 }14 15 /**16 * 點擊後操作17 */18 - (void)labelClick19 {20 //使之成為第一響應者,成為之後會提供兩種方法becomeFirstResponder和canPerformAction21 //同時告訴UIMenuController支援哪些操作,這些操作如何處理22 [self.textLabel becomeFirstResponder];23 24 //建立menu控制器25 UIMenuController *menu = [UIMenuController sharedMenuController];26 27 //彈出的menu顯示在哪個地區28 // [menu setTargetRect:self.frame inView:self.superview];29 [menu setTargetRect:self.textLabel.bounds inView:self.textLabel];30 //使menu可見31 [menu setMenuVisible:YES animated:YES];32 33 //自訂menuItem34 UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"頂" action:@selector(ding:)];35 UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回複" action:@selector(replay:)];36 UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"舉報" action:@selector(report:)];37 menu.menuItems = @[ding,replay,report];38 }39 40 - (void)ding:(UIMenuController *)menu41 {42 NSLog(@"%s %@",__func__,menu);43 }44 - (void)replay:(UIMenuController *)menu45 {46 NSLog(@"%s %@",__func__,menu);47 }48 - (void)report:(UIMenuController *)menu49 {50 NSLog(@"%s %@",__func__,menu);51 }52 - (BOOL)canBecomeFirstResponder53 {54 return YES;55 }
註: 碰到一個比較奇怪的問題,當使用自訂類型的時候,如果加一個條件:當再次點擊label的時候,彈出的menu消失,加入判斷
1 if (menu.isMenuVisible) {2 [menu setMenuVisible:NO animated:YES];3 } else {...}
需要把- (void)canBecomeFirstResponder{}這個剪下到ZWLabel中才能實現,否則第二行一直不會執行,menu.isMenuVisible一直是處於無值狀態!!
支援的系統內建的各類方法:
1 2016-07-13 22:34:35.099 UIMenuController[16825:1745455] cut: 2 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] copy: 3 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] select: 4 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] selectAll: 5 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] paste: 6 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] delete: 7 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] _promptForReplace: 8 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] _transliterateChinese: 9 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _showTextStyleOptions:10 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _define:11 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _addShortcut:12 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilitySpeak:13 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilitySpeakLanguageSelection:14 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilityPauseSpeaking:15 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] _share:16 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] makeTextWritingDirectionRightToLeft:17 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] makeTextWritingDirectionLeftToRight: