iOS开发——项目总结OC篇&iOS 长按事件菜单的实现(剪切版)

iOS 长按事件菜单的实现(剪切版)

一:简单实现菜单

添加长按手势

    [self.label addGestureRecognizer:[[UILongPressGestureRecognizer alloc] 

initWithTarget:self action:@selector(labelClick)]];

实现手势方法

 1 - (void)labelClick
 2 {
 3     // 获得菜单
 4     UIMenuController *menu = [UIMenuController sharedMenuController];
 5
 6     // 菜单最终显示的位置
 7     CGRect rect = CGRectMake(100, 100, 100, 100);
 8     [menu setTargetRect:rect inView:self.label];
 9     /*
10      targetRect:menuController指向的矩形框
11      targetView:targetRect以targetView的左上角为坐标原点
12      */
13
14     // 显示菜单
15     [menu setMenuVisible:YES animated:YES];
16
17     /*
18      得通过第一响应者,来告诉MenuController它内部应该显示什么内容
19      */
20 }
21  

以下两个方法是必须实现的,用来设置第一响应者和菜单显示的内容

 1 #pragma mark - 第一响应者 + UIMenuController
 2 /**
 3  * 说明控制器可以成为第一响应者
 4  */
 5 - (BOOL)canBecomeFirstResponder
 6 {
 7     return YES;
 8 }
 9
10 /**
11  * 通过这个方法告诉UIMenuController它内部应该显示什么内容
12  * 返回YES,就代表支持action这个操作
13  */
14 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
15 {
16     if (action == @selector(cut:)
17         || action == @selector(copy:)
18         || action == @selector(paste:)) {
19         return YES;
20     }
21
22     return NO;
23 }

最后实现菜单按钮点击方法

 1 - (void)cut:(UIMenuController *)menu
 2 {
 3     NSLog(@"%s %@", __func__, menu);
 4 }
 5
 6 - (void)copy:(UIMenuController *)menu
 7 {
 8     NSLog(@"%s %@", __func__, menu);
 9 }
10
11 - (void)paste:(UIMenuController *)menu
12 {
13     NSLog(@"%s %@", __func__, menu);
14 }

二:自定义菜单

同样添加手势

    [self addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
 

实现手势方法,这里注意里面添加Item的代码

 1 - (void)labelClick
 2 {
 3     // 让label成为第一响应者
 4     [self becomeFirstResponder];
 5
 6     // 获得菜单
 7     UIMenuController *menu = [UIMenuController sharedMenuController];
 8
 9     // 设置菜单内容
10     menu.menuItems = @[
11                        [[UIMenuItem alloc] initWithTitle:@"顶" action:@selector(ding:)],
12                        [[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(reply:)],
13                        [[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(warn:)]
14                        ];
15
16     // 菜单最终显示的位置
17     [menu setTargetRect:self.bounds inView:self];
18
19     // 显示菜单
20     [menu setMenuVisible:YES animated:YES];
21 }
22 实现设置第一响应者方法和设置菜单项的方法
23 #pragma mark - UIMenuController相关
24 /**
25  * 让Label具备成为第一响应者的资格
26  */
27 - (BOOL)canBecomeFirstResponder
28 {
29     return YES;
30 }
31
32 /**
33  * 通过第一响应者的这个方法告诉UIMenuController可以显示什么内容
34  */
35 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
36 {
37     if ( (action == @selector(copy:) && self.text) // 需要有文字才能支持复制
38         || (action == @selector(cut:) && self.text) // 需要有文字才能支持剪切
39         || action == @selector(paste:)
40         || action == @selector(ding:)
41         || action == @selector(reply:)
42         || action == @selector(warn:)) return YES;
43
44     return NO;
45 }

实现按钮点击方法

 1 #pragma mark - 监听MenuItem的点击事件
 2 - (void)cut:(UIMenuController *)menu
 3 {
 4     // 将label的文字存储到粘贴板
 5     [UIPasteboard generalPasteboard].string = self.text;
 6     // 清空文字
 7     self.text = nil;
 8 }
 9
10 - (void)copy:(UIMenuController *)menu
11 {
12     // 将label的文字存储到粘贴板
13     [UIPasteboard generalPasteboard].string = self.text;
14 }
15
16 - (void)paste:(UIMenuController *)menu
17 {
18     // 将粘贴板的文字赋值给label
19     self.text = [UIPasteboard generalPasteboard].string;
20 }
21
22 - (void)ding:(UIMenuController *)menu
23 {
24     NSLog(@"%s %@", __func__, menu);
25 }
26
27 - (void)reply:(UIMenuController *)menu
28 {
29     NSLog(@"%s %@", __func__, menu);
30 }
31
32 - (void)warn:(UIMenuController *)menu
33 {
34     NSLog(@"%s %@", __func__, menu);
35 }
36
37  

三:cell中的实战

在点击Cell方法中实现菜单的创建

 1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 2 {
 3     // 取出cell
 4     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
 5
 6     UIMenuController *menu = [UIMenuController sharedMenuController];
 7
 8     // 设置菜单内容
 9     menu.menuItems = @[
10                        [[UIMenuItem alloc] initWithTitle:@"顶" action:@selector(ding:)],
11                        [[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(reply:)],
12                        [[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(warn:)]
13                        ];
14
15     // 显示位置
16     CGRect rect = CGRectMake(0, cell.height * 0.5, cell.width, 1);
17     [menu setTargetRect:rect inView:cell];
18
19     // 显示出来
20     [menu setMenuVisible:YES animated:YES];
21 }

获得选中的项

 1 #pragma mark - 获得当前选中的评论
 2 - (XMGComment *)selectedComment
 3 {
 4     // 获得被选中的cell的行号
 5     NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;
 6     NSInteger row = indexPath.row;
 7
 8     // 获得评论数据
 9     NSArray *comments = self.latestComments;
10     if (indexPath.section == 0 && self.hotComments.count) {
11         comments = self.hotComments;
12     }
13
14     return comments[row];
15 }
16
17  

同上实现必须实现的饿方法

 1 #pragma mark - UIMenuController处理
 2 - (BOOL)canBecomeFirstResponder
 3 {
 4     return YES;
 5 }
 6
 7 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
 8 {
 9     if (!self.isFirstResponder) { // 文本框弹出键盘, 文本框才是第一响应者
10         if (action == @selector(ding:)
11             || action == @selector(reply:)
12             || action == @selector(warn:)) return NO;
13     }
14
15     return [super canPerformAction:action withSender:sender];
16 }
17  

最后实现按钮的点击方法

 1 - (void)ding:(UIMenuController *)menu
 2 {
 3     XMGLog(@"ding - %@ %@",
 4            self.selectedComment.user.username,
 5            self.selectedComment.content);
 6 }
 7
 8 - (void)reply:(UIMenuController *)menu
 9 {
10     XMGLog(@"reply - %@ %@",
11            self.selectedComment.user.username,
12            self.selectedComment.content);
13 }
14
15 - (void)warn:(UIMenuController *)menu
16 {
17     XMGLog(@"warn - %@ %@",
18            self.selectedComment.user.username,
19            self.selectedComment.content);
20 } 

问题:点击Cell可以实现弹出菜单,但是点击控制器的其他地方,比如其他文本框或者问题也出现

1:点击Cell位置做一个标记,判断是否标记是否设置,如果有责是点击Cell进来的,

时间: 2024-12-14 06:11:13

iOS开发——项目总结OC篇&iOS 长按事件菜单的实现(剪切版)的相关文章

ios开发——实用技术篇OC篇&iOS的主要框架

iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core Graphics框架帮助你创建图形 Core Animation允许你创建高级的动画和虚拟效果 OpenGL ES 框架提供2D和3D绘图工具 将别的框架添加到工程里 本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码

iOS开发——项目实战OC篇&amp;类QQ黏性按钮(封装)

类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中心点和它的中心点的距离去等比例变化自己的半径,越远半径酒越小,最后就会消失,而我们这里吗最难的就是在变化的过程中去计算并且设置他们两个之间的区域并且填充.这里需要计算六个点的位置(根据勾股定理),然后根据两个控件同一边的位置的两个点去绘制一条曲线.拖动距离到达一定的时候就会使用动画(序列帧)去清楚界

iOS开发——项目实用技术OC篇&amp;将Block作为代理来使用,实现传值

将Block作为代理来使用,实现传值 在这里http://www.cnblogs.com/iCocos/p/4659878.html,笔者已经将代理,Block,通知传值的方式总结了一下,今天使用的不一样,我们这里使用的是在一个方法中将一个block代码保存起来,再回到blcok内部去执行. 这里使用的是在地图中,,,,好了不多说,开干 1:首先,定义一个blcok typedef void(^ResultBlock)(CLLocation *currentLoc, CLPlacemark *p

iOS 开发——版本适配OC篇&amp;项目开发之系统适配问题(关于后台)

项目开发之系统适配问题 关于后台 在之前iOS 开发中,我们精彩遇到关于app适配问题,有屏幕适配,系统适配,但是由于苹果新设备(iphone 6/6p)技新术(sizeClass)的推出在屏幕适配上变的非常简单,而且之前关于app在系统适配上还是比较多的,可能是由于ios7的大改革,后面字啊iOS7盒iOS8上面的api并没有太大的差别,所以关于系统适配,我们并没有考虑太多. 但是,作为一个合格的开发者,不管是实际项目开发中,还是平时我们都要注意系统的视频,毕竟ios9又出来了,虽然常用api

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用青花瓷抓取网络数据

网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截

iOS开发——UI精选OC篇&amp;UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道,单例在应用程序的整个生命周期中只有一个对象). App的启动过程 打开程序之后-> 1:Main函数 2:UIapplicationMain函数 3:初始化UIApplication(创建) 4:设置UIApplication代理和相应的代理属性 5:开启事件循环,监听系统事件 6监测info.p

iOS开发——数据持久化OC篇&amp;(三)对象归档

归档 iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 /

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据

网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取 由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求

iOS开发——使用技术OC篇&amp;保存(获取)图片到(自定义)相册

保存(获取)图片到(自定义)相册 最近在学 iOS相关技术(绘图篇实现画板功能)的时候设计到了两个常用的知识点,那就是保存图片到相册和葱相册中获取图片. 只是个人比较好奇拓展一些技术,说的难听点叫做装牛角尖,好听点就是为了装逼而已,所以在保存相册的时候使用真及测试发现不能保存到我iPhone里 main的自定义相册里面,就查看文档和资料,也借鉴别人的分享实现了想要的功能,就把他给记录下来,这个虽然没有直接保存和获取常用但是也是一项很好的实用技术. 一:首先来看看怎么获取相册的图片: 1 // 弹