iOS-基础控件--UIPasteboard、UIMenuController使用总结
2020-07-15 05:16
495 查看
枝上柳绵吹又少,天涯何处无芳草!<暖暖猪>
UIPasteboard简单介绍
<u>这个类是用来管理粘贴板的,粘贴板就是用来存放我们复制、剪切内容的,iOS 中有3 个控件自带剪切板操作UITextField、UITextView、UIWebView长按手势就可以展现出系统剪切板,然后就可以进行复制、粘贴,剪切等操作。大体上可分为两个级别的粘贴板 </u>
- 整个系统级别的,在整个硬件设备(手机)上共享
- (只要APP 向系统的粘贴板写入了数据,那么就可以在其他任何可以访问粘贴板地方使用,同时不会再去管从哪里来的数据了,即使复制数据源 APP 删除了也不影响使用。)
- 应用级别的,数据在属于自己的应用内部共享;
- (默认情况下是不会把数据写进沙盒的,也就是说(复制、剪切)粘贴内容会因为应用的退出而销毁掉,我们可以设置相关属性`persistent值为 YES`让其进行数据的持久化存储起来)
创建方法,获取对象 | 方法 |
---|---|
得到系统粘贴板 | + (UIPasteboard *)generalPasteboard; |
自定义的粘贴板 | + (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create; |
获取应用内的粘贴板 | + (UIPasteboard *)pasteboardWithUniqueName; |
Ps:方法2 中参数 Name为粘贴板的名字(我们就可以依照名字得到到想要的对象),参数create 为 YES 时候表示粘贴板不存在时候,就去创建一个以此为名粘贴板;方法3是应用内的粘贴板与方法2一样只是名字为空,只能在同一个应用里面使用;
-
观察
UIPasteboard
属性我们可以轻松知道它可以直接传递的数据类型有四类
直接可以进行内容转移的数据类型 |
---|
NSString *string和 NSArray<NSString *> *strings |
NSURL *URL和 NSArray<NSURL *> *URLs |
UIImage *image和 NSArray<UIImage *> *images |
UIColor *color和 NSArray<UIColor *> *colors |
Ps:其他的一些属性,我们可以点进去观察一下基本可以理解例如
persistent 是否进行数据持久化还有
changeCount 改变次数(剪切板)系统重启方才重新计数
UIMenuController简单介绍
<u>弹出菜单栏,是UIKit中的基础控件,主要是为了方便交互后弹出一个选择的菜单。比如:我们长按发送的QQ消息弹出的一些操作选项的菜单,也可给某个控件添加一些操作选项 ,比如点击图片弹出菜单选择放大、裁剪、缩小等选项都是可以</u>
UIMenuController实际效果展示- 展示弹出菜单需要的相关方法
展示弹出菜单栏的控件或者控制器方法 | 代码 |
---|---|
必须调用方法 | - becomeFirstResponder |
必须实现的方法 |
- (BOOL)canBecomeFirstResponder//返回 YES 成为第一响应者 |
必须实现的方法 |
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender// 根据 Action 判断,显示还是隐藏响应的 item |
实际小例子:
系统级别的粘贴板演示.gif- 上代码
1:自定义一个UILabel初始化方法中添加长按手势
- (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.userInteractionEnabled = YES; // 添加长按手势 UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longAction:)]; [self addGestureRecognizer:longGesture]; } return self; }
2:在长按手势实现事件中,添加相关弹出菜单和展示 item
- (void)longAction:(UILongPressGestureRecognizer *)senser { if (senser.state == UIGestureRecognizerStateBegan) { NSLog(@"------------->手势已经触发了"); # 一定要调用这个方法 [self becomeFirstResponder]; // 创建 菜单控制器 UIMenuController *menu = [UIMenuController sharedMenuController]; // 创建仨条 Item 每一个起一个名字 UIMenuItem *menuItem1 = [[UIMenuItem alloc] initWithTitle:@"①Item复制" action:@selector(firstItemAction:)]; UIMenuItem *menuItem2 = [[UIMenuItem alloc] initWithTitle:@"②Item粘贴" action:@selector(secondItemAction:)]; UIMenuItem *menuItem3 = [[UIMenuItem alloc] initWithTitle:@"③Item删除" action:@selector(thirdItemAction:)]; // 设置菜单显示 每条 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:设置每一个 item 的点击事件
// ①Item 的点击方法 实现 复制 - (void)firstItemAction:(UIMenuItem *)item { NSLog(@"%s--->%@",__func__,item); // 通过系统的粘贴板 记录下需要传递的数据 [UIPasteboard generalPasteboard].string = @"我就是复制的内容"; } // 第二个处理粘贴 - (void)secondItemAction:(UIMenuItem *)item { NSLog(@"%s--->%@",__func__,item); // 从系统的粘贴板获取复制的数据 NSString *str = [UIPasteboard generalPasteboard].string; if (str) { self.text = str; } } // 第三个处理删除 - (void)thirdItemAction:(UIMenuItem *)item { NSLog(@"%s--->%@",__func__,item); self.text = @""; }
4:关键方法必须实现
/ 是自己能成为第一响应者 - (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补充:
tableView中自带的长安弹出菜单实现简单举例:
tableView 的长按菜单.gif// 允许长按菜单 - (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,我们可以再这里进行条件判断展示几个 Action if (action == @selector(copy:) || action == @selector(paste:) || action == @selector(cut:)|| action == @selector(cut:)) { return YES; } return NO; } // 具体去实现每一个 Action 的操作代码 - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender { if (action == @selector(copy:)) { NSLog(@"复制"); UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; // 获取系统的粘贴板 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; } }
相关文章推荐
- UITableView---iOS开发的常用控件使用总结
- [iOS基础控件 - 4.3] APP列表 xib的使用
- [iOS基础控件 - 6.6.1] 展示团购数据代码[iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)
- IOS学习总结,基础控件+简单逻辑+简单功能+GCD。
- android基础知识点总结:Android部分基础控件使用总结(111页word下载)
- IOS学习四:基础控件Label,textfield,button等使用
- [iOS基础控件 - 6.11.2] - UINavigationController 多控制器 简单使用
- iOS开发UI基础—19UITableview控件基本使用
- [IOS]UIKit控件使用总结
- IOS开发笔记(五)---基础控件的使用(Text Filed ,Image View,Slider等)
- iOS--基础控件总结一
- Objective-C ,ios,iphone开发基础:picker控件详解与使用,(实现省市的二级联动)
- iOS开发UI基础—25UITableview控件使用小结
- IOS(一) 基础控件的介绍以及使用
- RDVTabBarController--可自由定制的iOS底部导航控件的使用总结
- iOS UIStepper(步进控件)使用总结
- Objective-C ,ios,iphone开发基础:picker控件详解与使用,(实现省市的二级联动)
- iOS入门-基础控件总结(一)
- iOS 开发基础常用控件介绍总结
- Xamarin.iOS 基础控件基本用法总结