基於系統的UIMenuController的使用及自定義UIMenuItem

来源:http://www.cnblogs.com/howie-ch/archive/2016/08/27/5813761.html
-Advertisement-
Play Games

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

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

-Advertisement-
Play Games
更多相關文章
  • 一、PackageManager的resolveActivity 返回能夠匹配的Intent,如果不能匹配就返回NULL, 二、PackageManager的queryIntentActivities 返回所有成功匹配的Activity信息 三、Intent的resolveActivity 第一個參 ...
  • Android 事件分發機制 ViewGroup dispatchTouchEvent 返回true ViewGroup自己在dispatchTouchEvent中消費這個事件 dispatchTouchEvent 返回false 回傳到Activity中onTouchEvent消費事件 dispa ...
  • 我們在《Android學習之Handler消息傳遞機制》(http://www.cnblogs.com/zhouhb/p/5812447.html)已提到過,Android只允許UI線程修改Activity里的UI組件,這樣會導致新啟動的線程無法動態改變界面組件的屬性值。為瞭解決新線程不能更新UI組 ...
  • 這裡用了 MainActivity佈局 主要代碼 源碼: https://github.com/ln0491/RadioButtonAndFragment ...
  • Swift - 從字典(或者Alamofire)直接創建Model文件的工具 效果 1. 常規生成model的方式 2. 通過debug創建model的方式 特性 1. 可以處理JSON格式的字典數據 2. 可以處理本地的json數據 3. 可以處理Alamofire生成的json格式返回數據 4. ...
  • 以下內容是分析安卓源碼所得: 1: 使用預設樣式創建View的方式, 源碼文件 Button.Java 註:此文參考http://www.linzenews.com/ 中的內容所寫,如侵刪! 2: 需要聲明預設樣式的屬性, 源碼文件 attrs.xml 3:創建預設樣式, 源碼文件 styles.x ...
  • 使用Xcode創建一個傳說中的HelloWorld,剖析項目組成並真機測試。 ...
  • 設備信息: 設備名稱:OnePlus One(一加1) OS:ColorOS 1.2 設備型號:A0001 目標: 在OnePlus One(一加1)上將 ColorOS 1.2 刷機為 Kali NetHunter 3.1.0 操作流程: (1)下載相關資源 a)TWRP——第三方Recovery ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...