九、點擊控制項彈出複製粘貼剪切選擇等(UIMenuController)

来源:http://www.cnblogs.com/hissia/archive/2016/07/13/5668513.html
-Advertisement-
Play Games

預設情況下,有以下控制項已經支持UIMenuController UITextField UITextView UIWedView 以UITable為例,說明點擊後彈出複製剪切粘貼等為例 使用的整體思路:(系統自帶的文字) 1、新建一個UILabel的類,如果想以後storyboard和Xib都可以用 ...


預設情況下,有以下控制項已經支持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 }

 

支持的系統自帶的各類方法:

 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:

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • // 封裝的ajax網路請求函數// obj 是一個對象function AJAX(obj){ //跨域請求 if (obj.dataType == "jsonp") { //在這裡 callback 必須是全局變數 保證函數消失的時候 這個變數不可以被銷毀 //處理一下函數名(防止多個網路請求 函 ...
  • 一、DOM的基本概念 DOM是文檔對象模型,這種模型為樹模型;文檔是指標簽文檔;對象是指文檔中每個元素;模型是指抽象化的東西。 二、Window對象操作 1、屬性和方法: 屬性(值或者子對象): opener:打開當前視窗的源視窗,如果當前視窗是首次啟動瀏覽器打開的,則opener是null。 di ...
  • 源代碼: <!DOCTYPE html><html><head> <title>donghua</title> <meta charset="utf-8"> <style type="text/css"> .beijing{ border: 1px solid black; width: 100%; ...
  • 通常為了減少客戶端從伺服器下載圖片的次數,提高伺服器的性能,現在比較流行的做法是將多張圖片拼合成一張大圖片,然後再利用background-position屬性截取其中的各個小圖標,如菜單,表單或導航的小圖標等這種技術稱為CSS Sprite技術,示例代碼如下:html代碼如下: 1.css代碼如下 ...
  • 這幾天做的項目要求用樹形表格的形式展示一部分數據,於是就想到了使用easyUI的treegrid組件,但幾經翻查各種資料,發現數據類型大多採取標準數據類型,即包含children元素的數據類型,小編查遍各種資料,幾經實驗,小編找到了一種使用簡單數據類型的展示樹形表格的方法。在這裡介紹給大家,僅供參考 ...
  • 關於文件狀態 一般倉庫中的文件可能存在於這4種狀態: 1)Untracked files → 文件未被跟蹤(A) 2)Untracked but not Change → 已跟蹤,但是未修改(B) 3)Changes but not updated → 已跟蹤,文件被修改,但並沒有添加到暫存區(C) ...
  • 問題癥狀: Android Studio 1.2 (Build 141.1890965) 新建工程,自動build完成後,Layout Editor無法預覽Layout文件,報錯內容: Rendering Problems The following classes could not be fou ...
  • 主要練習一下RelativeLayout和LinearLayout ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...