在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栏目设置中添加自定义字段 这个说法以前没有见到到,很少有客户会提出这样的二次要求,今天织梦者在网上转了一下看到了这样的一篇文章转过来与大家分享 鉴于这个教程没人发过,网上搜索的人也比较多 ...
随机推荐
- Oracle 13c OEM 安装手册
1 安装准备工作 以下包已Redhat 为准,其他版的操作系统以官方手册为准. 1.1 Oracle Management Service 依赖如下包 glibc-comm ...
- php与JAVA的RSA加密互通
Java 版本RSA 进行加密解密 在网上查询了好几天,最终找到解决方案,网络上都是通过Cipher.getInstance("RSA"); 而改成Cipher.getInstan ...
- 主窗体上按钮jig画图时,CAD得不到焦点的问题
主窗体上按钮jig画图时,CAD得不到焦点的问题 按钮不要用 Click 事件,用 MouseDown 事件, 可完美解决该问题 1.试过CAD窗体获得焦点,不顶用 2.试用用命令行去执行,可行 ...
- 对象的克隆,Dozer的使用
现在有个复杂对象bean需要在赋值后在另一个地方用,想通过复制的方式拿到这个对象.首选是深度克隆,虽然发现该对象的父类已经实现了Cloneable接口,但父类是通过jar包引入的,而且在clone方法 ...
- (转)编写 DockerFile
这几天在研究怎样制作docker image. 其中使用dockerfile是一种可记录制作image的过程的并且是容易重复使用的一种方式.在园子里看到了一篇好文,于是分享到这里~~ 原文链接: ht ...
- 第13章 Spring框架的设计理念与设计模式分析
13.1 Spring的骨骼架构 最核心的组件是:Core, Context, Bean. 13.1.1 Spring的设计理念 Spring最核心的组件是Bean组件.Spring解决的最关键的问题 ...
- verilog HDL 编码风格
1.有意义且有效的名字. 2.同一信号在不同层次应该保持一致. 3.添加有意义的后缀,使信号的有效性更加明确. 4.模块输出寄存器化,使得输出的驱动强度和输入延时是可以预测的. 5.使用括号表明优先级 ...
- selenium webdriver 的事件处理
package www.zr.com; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; imp ...
- Flask之测试与部署
5.1 蓝图Blueprint 为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题 ...
- MongDB安装使用
4.MongoDB 下载 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.m ...