前言
先看一篇文章中的文字(原文出处:iOS 7系列译文:认识 TextKit):
iOS 4:iOS 3.2 发布仅仅几个月后就发布了,文本方面没有一丁点新功能。(个人经历:在 WWDC,我走近工程师们,告诉他们我想要一个完善的 iOS 文本布局系统。回答是:“哦…提交个请求。”不出所料…)
iOS 5:文本方面没啥变化。(个人经历:在 WWDC,我和工程师们谈及 iOS 上文本系统。回答是:“我们没有看到太多的请求…” 靠!)
iOS 6:有些动作了:属性文本编辑被加入了UITextView。很不幸的是,它很难定制。默认的UI有粗体、斜体和下划线。用户可以设置字体大小和颜色。粗看起来相当不错,但还是没法控制布局或者提供一个便利的途径来定制文本属性。然而对于(文本编辑)开发者,有一个大的新功能:可以继承 UITextView 了,这样的话,除了以前版本提供的键盘输入外,开发者可以“免费”获得文本选择功能。必须实现一个完全自定义的文本选择功能,可能是很多对非纯文本工具开发的尝试半途而废的原因。(个人经历:我,WWDC,工程师们。我想要一个 iOS 的文本系统。回答:“嗯。吖。是的。也许?看,它只是不执行…” 所以毕竟还是有希望,对吧?)
iOS 7:终于来了,TextKit。
很久之前就写了关于本文所说的两个功能的Demo,现在才有空总结下,清下草稿箱里的笔记。
看了以上文字才知道原来定制选中文字菜单和选择文字是iOS 6才能获取的特性,以上文字出处的作者绝对是个元老级iOS开发者了,从iOS 2玩到了iOS 7。
Anyway,定制UITextView绝对是件好玩的事。
继承UITextView
1.定制选中文字的菜单
首先新建一个类,继承自UITextView,假设类名为MyTextView,关键代码如下:
[objc]
view plain
copy
-
- -
(BOOL)canBecameFirstResponder { -
return YES; - }
-
-
- -
(BOOL)canPerformAction:(SEL)action withSender :(id)sender{ -
if (action @selector(copy:))== { //菜单不能响应copy项 -
return NO; -
} -
else if (action @selector(selectAll:))== { //菜单不能响应select all项 -
return NO; -
} -
-
// 事实上一个return NO就可以将系统的所有菜单项全部关闭了 -
return NO; - }
以上第一个方法用来确保我们选中文字后的菜单可以弹出,第二个方法用来关闭菜单中所有系统的菜单项,如copy, select, select all等。
然后使用UIMenuController定制菜单:
[objc]
view plain
copy
- //
自定义text view选中文字后的菜单 - UIMenuItem
*selectItem = [[UIMenuItem alloc ]initWithTitle :@"选择文字"action :