iOS之UIMenuController的简单使用

2023-12-08 04:48

本文主要是介绍iOS之UIMenuController的简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UIMenuController的示例


UIMenuController须知

  • 默认情况下, 有以下控件已经支持UIMenuController
    • UITextField
    • UITextView
    • UIWebView

让其他控件也支持UIMenuController(比如UILabel)

  1. 自定义UILabel
- (void)setUp { // 1.设置label可以交互 self.userInteractionEnabled = YES;  // 2.添加点击手势 [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lableClick)]];
}
- (void)lableClick { // 3.设置label为第一响应者,只有成为响应者才能够将MenuController显示在其上面 [self becomeFirstResponder]; // 4.初始化UIMenuController UIMenuController *menuController = [UIMenuController sharedMenuController];  // 5.设置UIMenuController显示的位置 // targetRect : 将要显示所在label的frame; // view : targetRect所在的坐标系参照物(父view或self)[menuController setTargetRect:self.frame inView:self.superview];// [menuController setTargetRect:self.bounds inView:self];作用同上  // 6.显示UIMenuController [menuController setMenuVisible:YES animated:YES];
}
  1. 在UILable内重写2个方法
/*** 让label有资格成为第一响应者*/
- (BOOL)canBecomeFirstResponder
{return YES;
}
/*** label能执行哪些操作(比如copy, paste等等)* @return  YES:支持这种操作*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;return NO;
}

3.实现各种操作方法

- (void)cut:(UIMenuController *)menu
{// 将自己的文字复制到粘贴板UIPasteboard *board = [UIPasteboard generalPasteboard];// 清空文字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;
}

自定义UIMenuController内部的Item(在cell中)

  • 由于手动添加的MenuItem默认触发控制器中的方法,所以将MenuController的显示/隐藏,添加MenuItem写到控制器

  • 添加item

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 点击cell弹出UIMenuController // 1.如果menuController已经在显示,就隐藏他// 注意,如果有一个cell正在显示menuController,这时再点击另外一个cell,上一个cell的menuController会消失,当前点击cell会显示,这是因为上一个cell不再是第一响应者了,menuController会自动释放 UIMenuController *menuController = [UIMenuController sharedMenuController]; if (menuController.isMenuVisible) { [menuController setMenuVisible:NO animated:YES];  }else { // 2.显示MenuController // 先设置cell为第一响应者,同时不要忘记在cell中重写canBecomeFirstResponder和canPerformAction:withSender: JCMTopicCommentCell *cell = [tableView cellForRowAtIndexPath:indexPath]; [cell becomeFirstResponder]; // 添加menuItem UIMenuItem *item01 = [[UIMenuItem alloc]initWithTitle:@"赞" action:@selector(zanClick:)]; UIMenuItem *item02 = [[UIMenuItem alloc]initWithTitle:@"回复" action:@selector(responseClick:)]; UIMenuItem *item03 = [[UIMenuItem alloc]initWithTitle:@"举报" action:@selector(reportClick:)]; menuController.menuItems = @[item01,item02,item03]; // 设置menuControoler显示位置 CGRect showRect = CGRectMake(cell.x, cell.y + cell.height/2, cell.width, cell.height); [menuController setTargetRect:showRect inView:cell.superview]; // 显示menuController [menuController setMenuVisible:YES animated:YES];  }
}
  1. cell中实现两个方法
/*** 让label有资格成为第一响应者*/
- (BOOL)canBecomeFirstResponder
{return YES;
}
/*** label能执行哪些操作(比如copy, paste等等)* @return  YES:支持这种操作*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;return NO;
}
  1. 处理方法的实现
#pragma mark - MenuControllerClick
// MenuController手动添加的item的方法实现必须放在controller中
- (void)zanClick:(UIMenuController *)menu { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; NSLog(@"%s %@", __func__, [self commentInIndexPath:indexPath].content);
}
- (void)responseClick:(UIMenuController *)menu { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; NSLog(@"%s %@", __func__, [self commentInIndexPath:indexPath].content);
}
- (void)reportClick:(UIMenuController *)menu { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; NSLog(@"%s %@", __func__, [self commentInIndexPath:indexPath].content);
}

这篇关于iOS之UIMenuController的简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468574

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3