在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栏目设置中添加自定义字段 这个说法以前没有见到到,很少有客户会提出这样的二次要求,今天织梦者在网上转了一下看到了这样的一篇文章转过来与大家分享 鉴于这个教程没人发过,网上搜索的人也比较多 ...
随机推荐
- Eclipse自动生成 get/set
步骤一:在声明的数据域中按Ctrl+1: 步骤二:点击最后一个选项Create getter and setter,在弹出的对话框中点击确定: 在介绍另外一个方法: 步骤一:声明完类的数据域之后,输入 ...
- Apache CXF使用Jetty发布WebService
一.概述 Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构.它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于Spring的轻量级容器中,也可以部署在更高级的 ...
- 字节序(byte order)和位序(bit order)
字节序(byte order)和位序(bit order) 在网络编程中经常会提到网络字节序和主机序,也就是说当一个对象由多个字节组成的时候需要注意对象的多个字节在内存中的顺序. 以前我也基本只了 ...
- mysql实战优化之二:limit优化(大表翻页查询时) sql优化
mysql的表test中有20105119行数据.建立索引:data_status,place_cargo_status 场景1: SELECT id, resource_id, resource_t ...
- Spring启动后获取所有拥有特定注解的Bean,注解的属性值
最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...
- Netty Client 重连实现
当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连.Netty Client有两种情况下需要重连: Netty Client启动的时候需要重连 在程序 ...
- WIN10运行软件,窗口不显示(移动到屏幕外无法复原)的解决办法 Lebal:bug10解决方案
双显示器切换回单显示器的时候,可能会遇到窗口移动到屏幕外不显示的情况 像这样虽然有缩略图但是点击无反应,并且平铺窗口也不管用,这个时候单击该窗口,Alt+space 执行最小化以及最大化操作即可复原
- Java中计算对象的大小
一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...
- oracle 查询中实现分页
那么Oracle如何实现分页呢?--Oracle分页查询SELECT * FROM ( SELECT ROWNUM R,YANGCQ_ID,YANGCQ_BRANCHI ...
- Flask之性能
5.5 性能 一.不同角度的网站性能 普通用户认为的网站性能 网站性能对于普通用户来说,最直接的体现就是响应时间.用户在浏览器上直观感受到的网站响应速度,即从客户端发送请求,到服务器返回响应内容的时间 ...