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 *string 和NSArray<NSString *> *strings
|
NSURL *URL 和NSArray<NSURL *> *URLs
|
UIImage *image 和NSArray<UIImage *> *images
|
UIColor *color 和NSArray<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>
-
展示彈出菜單需要的相關(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í)際小例子:
- 上代碼
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)單舉例:
// 允許長(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;
}
}