在UIWebView中添加自定义编辑菜单
如何在UIWebView中添加自定义的编辑菜单困扰了很久。没想到意外的简单!
现在很多的内容提供类应用中,长按内容页会选中按的单词并且显示一个编辑菜单。如图:

独乐乐不如众乐乐。一篇好文章是需要大家一起欣赏的。一篇八卦文也是需要大家一起八卦的。
TabBar的一个分享按钮毕竟没法把这篇文章的亮点附带上。所以让用户通过长按,然后可以选择需要
分享的内容。最后再在弹出的菜单中选择“分享”去分享给好友。这样用户可以把打动他,的一句话分享出去。
用户选择的这句话不一定是文章的什么重点啊,中心啊(额,想到小时候语文课上的总结文章中心思想什么的了)。
但是肯定是能引起用户或者用户的这个圈子注意的一句话。这个选择权一定要给用户。
如何实现呢?简单!上代码:
1. 继承UIWebView
@interface HBRWebView : UIWebView
3
4 @end
2. 在构造函数中添加自定义菜单项
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@"分享" action:@selector(flag:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:flag, nil]];
[flag release];
}
return self;
}
看到UIMenuItem了吗,这个就是自定义菜单项。Title设定为“分享”显示出来后就是“分享”。呵呵,说了句废话。
当这个菜单项被点击时执行的方法为 - (void)flag:(id)sender.
3. 添加菜单事件
- (void)flag:(id)sender{
[self copy:nil];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
if (pasteBoard.string != nil) {
// DLog(@"%@", pasteBoard.string);
}
}
当我们的自定义菜单项被点击的时候,这个方法就会被执行。
在代码中的这句:
[self copy:nil];
把用户选定的文本内容拷贝到了剪切板中。下一句:
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
if (pasteBoard.string != nil) {
// DLog(@"%@", pasteBoard.string);
}
访问剪切板中复制的内容。这时你就可以把用户选定的内容拿到手里了。
到这里,我们需要实现的功能其实已经可以实现了。但是美中不足的是,如果系统自带的菜单不是你想要的呢?
所以还要看这里:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(_define:)) {
return NO;
}
if (action == @selector(selectAll:)) {
return YES;
}
if (action == @selector(flag:)) {
return YES;
}
return [super canPerformAction:action withSender:sender];
}
这个方法是重写了基类UIWebView中的实现。
if (action == @selector(_define:)) {
return NO;
}
直接屏蔽掉了系统自带的定义菜单项。在上面的上面的代码中selectAll:对应的返回了YES,如果返回NO,则全选这一项也不再显示。
知其然,也要知其所以然。对于自定义编辑菜单来说,UIWebView实现了UIResponder的canPerformAction:(SEL)action withSender:(id)sender
方法,默认的提供如下的菜单项对应的selector:
cut:剪切选中文字到剪贴版。copy:拷贝/复制选中文字到剪贴版。select:当处于文本编辑模式时,选中光标当前位置的一个单词。selectAll:选中当前页所有文字。paste:粘贴剪贴版中的文本到当前光标位置。delete:处于文本编辑模式时,删除选中的文本。(since iOS 3.2)_promptForReplace:即为上面Google+图片中显示的“替换为...”菜单,点击之后会给出与当前选中单词相近的其他单词。_showTextStyleOptions:处于文本编辑模式时,用于编辑字体风格属性,如粗体/斜体等。_define:调用iOS系统内置的英语词典,解释选中的单词。如果内置词典中找不到所选单词,则该项不予显示。_accessibilitySpeak:朗读当前选中的文本。_accessibilityPauseSpeak:暂停朗读文本。makeTextWritingDirectionRightToLeft:调整选中文本的书写格式为从右至左。阿拉伯语会用到。(since iOS 5.0)makeTextWritingDirectionLeftToRight:调整选中文本的书写格式为从左至右。(since iOS 5.0
加下划线的就是所谓的私有方法了。开发者无权访问。所以前面去掉定义菜单项可能会有问题。写此文的时候我的应用还没发布,所以各位慎重权衡。
因为是在原型开发阶段,菜单项的国际化什么的各位自己把握。
下面是全部代码:
header
@interface MyWebView : UIWebView @end
source
//
// MyWebView.m
// Created by Bruce on 13-8-5.
//
#import "MyWebView.h" @implementation MyWebView - (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@"定义" action:@selector(flag:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:flag, nil]];
[flag release];
}
return self;
} - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(_define:)) {
return NO;
}
if (action == @selector(selectAll:)) {
return YES;
}
if (action == @selector(flag:)) {
return YES;
} return [super canPerformAction:action withSender:sender];
} - (void)flag:(id)sender{
[self copy:nil];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
if (pasteBoard.string != nil) {
// DLog(@"%@", pasteBoard.string);
}
} @end
全文完。谢谢各位!
在UIWebView中添加自定义编辑菜单的更多相关文章
- charles 编辑菜单总结
本文参考:charles 编辑菜单总结 charles中proxy菜单的介绍:我的是4.1.2版本,mac系统下的菜单大同小异: 如下图: 这里其实都是常用的功能: 大概可以分为5个大块,看下分割线就 ...
- 资源在windows编程中的应用----菜单
资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...
- odoo13之在odoo中添加自定义页面
注: 本博文是阅读Ruter博客 在odoo中添加自定义页面 后所做的个人总结,以及博文搬迁,主要是便于自己的后期理解:大部分内容为搬运,当然也包括自己的一些总结和流程优化. 前言 首先展示效果:进入 ...
- 前端开发css实战:使用css制作网页中的多级菜单
前端开发css实战:使用css制作网页中的多级菜单 在日常工作中,大家都会遇到一些显示隐藏类菜单,比如页头导航.二维码显示隐藏.文本提示等等......而这些效果都是可以使用纯css实现的(而且非常简 ...
- 仅在TabControl中的Tab中添加右键菜单
若想实现仅在TabControl中的Tab中添加右键菜单,可在XAML中通过使用样式得到: <TabControl> <TabControl.ItemContainerStyle&g ...
- iOS UIWebView中javascript与Objective-C交互、获取摄像头
UIWebView是iOS开发中常用的一个视图控件,多数情况下,它被用来显示HTML格式的内容. 支持的文档格式 除了HTML以外,UIWebView还支持iWork, Office等文档格式: Ex ...
- 在ECSHOP后台左侧导航中增加新菜单
在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2011-11-08 有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...
- Xamarin iOS开发中的编辑、连接、运行
Xamarin iOS开发中的编辑.连接.运行 创建好工程后,就可以单击Xamarin Studio上方的运行按钮,如图1.37所示,对HelloWorld项目进行编辑.连接以及运行了.运行效果如图1 ...
- 如何在dede栏目设置中添加自定义字段(dede二次开发-纯抄贴)
如何在dede栏目设置中添加自定义字段 这个说法以前没有见到到,很少有客户会提出这样的二次要求,今天织梦者在网上转了一下看到了这样的一篇文章转过来与大家分享 鉴于这个教程没人发过,网上搜索的人也比较多 ...
随机推荐
- 如何注册java程序为windows服务
如何注册java 程序为windows 服务 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件.由于我想编写的关机程序是运行在别人机器上,只能让该机器在 ...
- 三种实现Ajax的方式
本文主要是比较三种实现Ajax的方式 1. prototype.js 2. jquery1.3.2.min.js 3. json2.js Java代码 收藏代码 后台处理程序(Servlet),访问路 ...
- Spring BeanPostProcessor与动态加载数据源配置
前言: 本文旨在介绍Spring动态配置数据源的方式,即对一个DataSource的配置诸如jdbcUrl,user,password,driverClass都通过运行时指定,而非由xml静态配置定死 ...
- gitlab的本地搭建和部署使用
公司现在的代码管理是在公司的服务器上部署了gitlab,这样既方便协同开发,有可以很好的保护代码的安全性. 那么我们就来研究一下 如何给自己的服务器上部署gitlab吧! 学习源头:https://w ...
- 【linux】查看进程使用的端口和端口使用情况
netstat -a 查看所有服务端口 netstat -tln 查看当前使用的端口 ps命令查看进程的id: ps aux | grep ftp 或者 pidof Name netstat命 ...
- python's twenty-seventh day for me 模
time模块: 1,计算执行代码的时间 time.time() 2,让程序停这里一段时间 time.sleep(时间(s)) 时间戳时间: import time print(time.time()) ...
- HTTP协议头域详解
HTTP协议头域详解 Requests部分 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编 ...
- 16-EasyNetQ之自动订阅者
EasyNetQ v0.7.1.30版本有了一个简单AutoSubscriber.你能够使用它很容易的去扫描指定程序集中实现了IConsume 或 IConsumeAsync接口的类,然后这个自动订阅 ...
- linux进行Java开发环境的部署
一.前言: 今天正式向linux开发进攻了,其中遇到一些问题简单的记录一下,为之后的再次部署提供方便. 二.linux的Java8安装的两种方法: 1.源安装很简单,一个命令搞定. sudo apt- ...
- POJ1657
1.题目链接地址 http://poj.org/problem?id=1657 2.源代码 #include<iostream> using namespace std; int main ...