九、點擊控制項彈出複製粘貼剪下選擇等(UIMenuController),複製粘貼剪下快速鍵

來源:互聯網
上載者:User

九、點擊控制項彈出複製粘貼剪下選擇等(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:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.