iOS-基礎(chǔ)控件--UIPasteboard饮寞、UIMenuController使用總結(jié)

枝上柳綿吹又少,天涯何處無芳草列吼!<暖暖豬>

代碼參考:GitHub

  • UIPasteboard簡(jiǎn)單介紹

<u>這個(gè)類是用來管理粘貼板的幽崩,粘貼板就是用來存放我們復(fù)制、剪切內(nèi)容的冈欢,iOS 中有3 個(gè)控件自帶剪切板操作UITextField歉铝、UITextView、UIWebView長(zhǎng)按手勢(shì)就可以展現(xiàn)出系統(tǒng)剪切板凑耻,然后就可以進(jìn)行復(fù)制太示、粘貼,剪切等操作香浩。大體上可分為兩個(gè)級(jí)別的粘貼板 </u>

  • 整個(gè)系統(tǒng)級(jí)別的类缤,在整個(gè)硬件設(shè)備(手機(jī))上共享
  • (只要APP 向系統(tǒng)的粘貼板寫入了數(shù)據(jù),那么就可以在其他任何可以訪問粘貼板地方使用邻吭,同時(shí)不會(huì)再去管從哪里來的數(shù)據(jù)了餐弱,即使復(fù)制數(shù)據(jù)源 APP 刪除了也不影響使用。)
  • 應(yīng)用級(jí)別的,數(shù)據(jù)在屬于自己的應(yīng)用內(nèi)部共享膏蚓;
- (默認(rèn)情況下是不會(huì)把數(shù)據(jù)寫進(jìn)沙盒的瓢谢,也就是說(復(fù)制、剪切)粘貼內(nèi)容會(huì)因?yàn)閼?yīng)用的退出而銷毀掉驮瞧,我們可以設(shè)置相關(guān)屬性`persistent值為 YES`讓其進(jìn)行數(shù)據(jù)的持久化存儲(chǔ)起來)
創(chuàng)建方法氓扛,獲取對(duì)象 方法
得到系統(tǒng)粘貼板 + (UIPasteboard *)generalPasteboard;
自定義的粘貼板 + (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;
獲取應(yīng)用內(nèi)的粘貼板 + (UIPasteboard *)pasteboardWithUniqueName;

Ps:方法2 中參數(shù) Name為粘貼板的名字(我們就可以依照名字得到到想要的對(duì)象),參數(shù)create 為 YES 時(shí)候表示粘貼板不存在時(shí)候论笔,就去創(chuàng)建一個(gè)以此為名粘貼板采郎;方法3是應(yīng)用內(nèi)的粘貼板與方法2一樣只是名字為空,只能在同一個(gè)應(yīng)用里面使用狂魔;

  • 觀察UIPasteboard屬性我們可以輕松知道它可以直接傳遞的數(shù)據(jù)類型有四類
直接可以進(jìn)行內(nèi)容轉(zhuǎn)移的數(shù)據(jù)類型
NSString *stringNSArray<NSString *> *strings
NSURL *URLNSArray<NSURL *> *URLs
UIImage *imageNSArray<UIImage *> *images
UIColor *colorNSArray<UIColor *> *colors

Ps:其他的一些屬性蒜埋,我們可以點(diǎn)進(jìn)去觀察一下基本可以理解例如persistent 是否進(jìn)行數(shù)據(jù)持久化還有changeCount 改變次數(shù)(剪切板)系統(tǒng)重啟方才重新計(jì)數(shù)


  • UIMenuController簡(jiǎn)單介紹

<u>彈出菜單欄,是UIKit中的基礎(chǔ)控件最楷,主要是為了方便交互后彈出一個(gè)選擇的菜單整份。比如:我們長(zhǎng)按發(fā)送的QQ消息彈出的一些操作選項(xiàng)的菜單,也可給某個(gè)控件添加一些操作選項(xiàng) 籽孙,比如點(diǎn)擊圖片彈出菜單選擇放大皂林、裁剪、縮小等選項(xiàng)都是可以</u>

UIMenuController實(shí)際效果展示
  • 展示彈出菜單需要的相關(guān)方法
展示彈出菜單欄的控件或者控制器方法 代碼
必須調(diào)用方法 - becomeFirstResponder
必須實(shí)現(xiàn)的方法 - (BOOL)canBecomeFirstResponder//返回 YES 成為第一響應(yīng)者
必須實(shí)現(xiàn)的方法 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender// 根據(jù) Action 判斷蚯撩,顯示還是隱藏響應(yīng)的 item

實(shí)際小例子:
系統(tǒng)級(jí)別的粘貼板演示.gif
  • 上代碼
    1:自定義一個(gè)UILabel初始化方法中添加長(zhǎng)按手勢(shì)
 - (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        self.userInteractionEnabled = YES;
// 添加長(zhǎng)按手勢(shì)
        UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longAction:)];
        [self addGestureRecognizer:longGesture];
    }
    return self;
}

2:在長(zhǎng)按手勢(shì)實(shí)現(xiàn)事件中,添加相關(guān)彈出菜單和展示 item

 - (void)longAction:(UILongPressGestureRecognizer *)senser
{
    if (senser.state == UIGestureRecognizerStateBegan)
    {
        NSLog(@"------------->手勢(shì)已經(jīng)觸發(fā)了");
  #     一定要調(diào)用這個(gè)方法
        [self becomeFirstResponder];
        // 創(chuàng)建 菜單控制器
        UIMenuController *menu = [UIMenuController sharedMenuController];
        // 創(chuàng)建仨?xiàng)l Item 每一個(gè)起一個(gè)名字
        UIMenuItem *menuItem1 = [[UIMenuItem alloc] initWithTitle:@"①Item復(fù)制" action:@selector(firstItemAction:)];
        UIMenuItem *menuItem2 = [[UIMenuItem alloc] initWithTitle:@"②Item粘貼" action:@selector(secondItemAction:)];
        UIMenuItem *menuItem3 = [[UIMenuItem alloc] initWithTitle:@"③Item刪除" action:@selector(thirdItemAction:)];
        
        // 設(shè)置菜單顯示 每條 Item
        menu.menuItems = @[menuItem1,menuItem2,menuItem3];
        // 彈出菜單展示的位置  箭頭指向的地方為 origin
        [menu setTargetRect:CGRectMake(self.bounds.size.width / 2 , self.bounds.size.height / 2, 0, 0) inView:self]
        // 顯示
        [menu setMenuVisible:YES animated:YES];
        
    }
}

3:設(shè)置每一個(gè) item 的點(diǎn)擊事件

 // ①Item 的點(diǎn)擊方法 實(shí)現(xiàn) 復(fù)制
 - (void)firstItemAction:(UIMenuItem *)item
{
     NSLog(@"%s--->%@",__func__,item);
    // 通過系統(tǒng)的粘貼板 記錄下需要傳遞的數(shù)據(jù)
    [UIPasteboard generalPasteboard].string = @"我就是復(fù)制的內(nèi)容";
    
 }
   // 第二個(gè)處理粘貼
   - (void)secondItemAction:(UIMenuItem *)item
 {
    NSLog(@"%s--->%@",__func__,item);
   // 從系統(tǒng)的粘貼板獲取復(fù)制的數(shù)據(jù)
    NSString *str = [UIPasteboard generalPasteboard].string;
    if (str)
    {
        self.text = str;
    }
    
 }
  // 第三個(gè)處理刪除
 - (void)thirdItemAction:(UIMenuItem *)item
 {
    NSLog(@"%s--->%@",__func__,item);
     self.text = @"";
 }

4:關(guān)鍵方法必須實(shí)現(xiàn)

/ 是自己能成為第一響應(yīng)者
 - (BOOL)canBecomeFirstResponder
 {
    return YES;
 }
 // 能處理 Action 事件
 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
 {
    if (action == @selector(firstItemAction:) || action == @selector(secondItemAction:))
    {
        return YES;
    }
    return [super canPerformAction:action withSender:sender];
}

2016-10-29補(bǔ)充:

tableView中自帶的長(zhǎng)安彈出菜單實(shí)現(xiàn)簡(jiǎn)單舉例:
tableView 的長(zhǎng)按菜單.gif
 // 允許長(zhǎng)按菜單
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    return YES;
 }


// 選擇需要展示的 Action 按鈕:

- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender

{
    return YES;
    // 可以支持所有Action烛占,也可以只支持其中一種或者兩種Action胎挎,我們可以再這里進(jìn)行條件判斷展示幾個(gè) Action
    
    if (action == @selector(copy:) || action == @selector(paste:) || action == @selector(cut:)|| action == @selector(cut:))
    {
        
        return YES;
        
    }
    
    return NO;
    
}


//  具體去實(shí)現(xiàn)每一個(gè) Action 的操作代碼

- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender

{
    
    if (action == @selector(copy:)) {
        
        NSLog(@"復(fù)制");
        
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        
        // 獲取系統(tǒng)的粘貼板
        UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
        
        [pasteBoard setString:cell.textLabel.text];
        
    } else if (action == @selector(paste:)) {
        

        UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
        
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        
        cell.textLabel.text = pasteBoard.string;     
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忆家,隨后出現(xiàn)的幾起案子犹菇,更是在濱河造成了極大的恐慌,老刑警劉巖芽卿,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭芍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卸例,警方通過查閱死者的電腦和手機(jī)称杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筷转,“玉大人姑原,你說我怎么就攤上這事∥厥妫” “怎么了锭汛?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我唤殴,道長(zhǎng)般婆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任朵逝,我火速辦了婚禮蔚袍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廉侧。我一直安慰自己页响,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布段誊。 她就那樣靜靜地躺著闰蚕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪连舍。 梳的紋絲不亂的頭發(fā)上没陡,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音索赏,去河邊找鬼盼玄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛潜腻,可吹牛的內(nèi)容都是我干的埃儿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼融涣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼童番!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起威鹿,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤剃斧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后忽你,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幼东,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年科雳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了根蟹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糟秘,死狀恐怖娜亿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚌堵,我是刑警寧澤买决,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布沛婴,位于F島的核電站,受9級(jí)特大地震影響督赤,放射性物質(zhì)發(fā)生泄漏嘁灯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一躲舌、第九天 我趴在偏房一處隱蔽的房頂上張望丑婿。 院中可真熱鬧,春花似錦没卸、人聲如沸羹奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诀拭。三九已至,卻和暖如春煤蚌,著一層夾襖步出監(jiān)牢的瞬間耕挨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工尉桩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筒占,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓蜘犁,卻偏偏與公主長(zhǎng)得像翰苫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子这橙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)容來自于 iOS文檔中 About Text Handling in iOS 部分 ios平臺(tái)提供了顯示及編輯文...
    縱橫而樂閱讀 6,735評(píng)論 2 21
  • 1革骨、禁止手機(jī)睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,116評(píng)論 1 6
  • 復(fù)制,剪切析恋,粘貼操作 用戶可以復(fù)制某個(gè)應(yīng)用中的文本,圖片盛卡,或者其他數(shù)據(jù)到另外一個(gè)地方助隧,到該應(yīng)用內(nèi)或者另一個(gè)應(yīng)用都可...
    卓小土閱讀 378評(píng)論 0 2
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1滑沧,想要解決就用__block...
    炙冰閱讀 2,473評(píng)論 1 14
  • { 11并村、核心動(dòng)畫 需要簽協(xié)議,但是系統(tǒng)幫簽好 一滓技、CABasicAnimation 1哩牍、創(chuàng)建基礎(chǔ)動(dòng)畫對(duì)象 CAB...
    CYC666閱讀 1,528評(píng)論 2 4