點擊控件彈出復制粘貼剪切選擇等(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)frame
10 {
11     if (self = [super initWithFrame:frame]) {
12         [self setup];
13     }
14     return self;
15 }
16 /**
17  *  初始化操作
18  */
19 - (void)setup
20 {
21     self.userInteractionEnabled = YES;
22     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)];
23     [self addGestureRecognizer:tap];
24 }
25 /**
26  *  點擊后操作
27  */
28 - (void)labelClick
29 {
30     //使之成為第一響應者,成為之后會提供兩種方法becomeFirstResponder和canPerformAction
31     //同時告訴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)canBecomeFirstResponder
47 {
48     return YES;
49 }
50 
51 /**
52  *  label能執行哪些操作(比如copy,paste)
53  */
54 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
55 {
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 *)menu
62 {
63     //將自己的文字復制到粘貼板
64     UIPasteboard *board = [UIPasteboard generalPasteboard];
65     board.string = self.text;
66 }
67 - (void)cut:(UIMenuController *)menu
68 {
69     //將自己的文字復制到粘貼板
70     [self copy:menu];
71     //清空文字
72     self.text = nil;
73 }
74 - (void)paste:(UIMenuController *)menu
75 {
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)labelClick
19 {
20     //使之成為第一響應者,成為之后會提供兩種方法becomeFirstResponder和canPerformAction
21     //同時告訴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     //自定義menuItem
34     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 *)menu
41 {
42     NSLog(@"%s  %@",__func__,menu);
43 }
44 - (void)replay:(UIMenuController *)menu
45 {
46     NSLog(@"%s  %@",__func__,menu);
47 }
48 - (void)report:(UIMenuController *)menu
49 {
50     NSLog(@"%s  %@",__func__,menu);
51 }
52 - (BOOL)canBecomeFirstResponder
53 {
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:


免責聲明!

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



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