带有语法高亮的UITextView

可能重复:
UITextView w /语法高亮

我已经发现了一个问题,但它没有一个完整的答案。

是否有一个框架或库,可以在UITextView进行语法高亮显示,特别是iPhone上的Objective-C 语法高亮 (和检测 )。

我的一些想法如何做到这一点:

  • NSAttributedString 。 现在在iOS 3.2和更高版本中可用。 但是,我怎么会把一个NSAttributedString到一个UITextView?
  • UIWebView 。 当用户完成编辑并使用CSS样式表对文本着色时,覆盖它。 但是,我将如何在UIWebView做到这一点,给它的文字,然后着色呢?

更新:自iOS 7和TextKit以来,语法突出显示变得非常容易。 (在我看来) 没有比这更进一步的介绍了。


假设你想要一个可编辑的组件,没有太多的希望。 给出一个快速的概述,只是为了确保我涵盖了一切:

  • UITextView纯文本只,没有(公共)的方式。 但可编辑 。 没有机会改变任何东西,没有机会得到几何等内部使用Web视图。 每个段落都是一个<div> ,由编辑引擎改变。 你可以在那里改变DOm,但这都是私有的API。 所有的私人,因此没有select。
  • UIWebViewhtml ,所以它可以被设置样式,embedded图像等。我猜(这不是看着它),这是前面提到的三个20用户界面使用。 问题: 无法编辑 。 没有(公共)的方式。 你无法获得select,访问DOM等没有私人API和很多头痛。 编辑工作就像在UITextView,但需要一个全新的头痛水平。 仍然:私人。
  • CoreText框架:自iOS 3.2以来,一个非常非常好的渲染引擎。 但就是这样。 可以直接布局和渲染NSAttributesString 。 但是,没有用户交互。 没有文字select,没有文字input,没有拼写检查,没有replace,没有亮点,不不不,不不不不。 只是渲染。 在使用长文本的旧设备上快速完成相当多的工作。
  • UITextInput协议:允许与键盘交互和抓取文本input 。 还具有基本的文本replace。 问题:仅文本input,logging不当。 没有文字select等(见上文)。

所以我们在这里 缺less中心function的两个function完整的组件和缺less缺失环节的两个部分解决scheme。 以下是我可以想到的所有可行的方法:

  • 让用户编辑UITextView并显示UIWebView的内容。 对于后者,你可以使用Three20的东西。
  • 构buildCoreTextUITextInput之间缺失的链接。 这包括但不限于文本select,突出显示,背景颜色,文本存储和pipe理,效率,拼写检查等。其中一些由系统框架提供,但仍然需要大量的集成。
  • 提出一个错误,等待一个好的公共API来(我个人的方法)。
  • 说服苹果再次允许私人API,并UItextView的DOM。

Omni Group采取了第二种方法,并创build了一个可编辑的文本视图。 你可以在OmniUI框架中find它。 但是,这个实现还远远不够完美。 (至less是几个月前我上次检查的时候)。 他们努力的努力,但仍然没有达到苹果完美的用户交互。 苹果公司必须投入至less几年的时间才能完成文本select和编辑的界面互动。 没有什么可以在家里完成的,而且即使是作为omni集团的公司,也是如此。

所有这一切都有一个有趣的方面:​​iWork。 苹果声称不使用任何私人API。 但是文本select和OS一样。 所以他们必须将框架源复制到应用程序中。 非常诚实的方法;)

自iOS 5以来,您可以使用UIWebView,并在其中的div上设置contenteditable="true" 。 这使得UIWebView打开一个键盘,允许用户直接input文本到DOM中。 然后,你可以编写一个Web应用程序,语法突出显示。 你可以使用自定义URL与cocoa应用程序进行通信。

我唯一的问题是你似乎没有得到拼写检查。

我subclassed UITextView和overrode drawRect来实现语法高亮。

源代码http://github.com/sakrist/SUITextView

下面是一个使用UITextView和自定义CoreText渲染的编辑function的实现: http ://www.a-coding.com/2012/03/syntax-highlighting-in-ios.html

JTextView是支持NSAttributedString文本存储的UITextView替代品。 它允许显示丰富的文本,但不完整。

我不太了解语法检测,但是如果你想在同一个UITextView中有多个样式,那么Three 20 UI是你应该看的东西

下面是可能与您有关的另一个问题: 在Cocoa中实现源代码语法突出显示的最佳方法是什么? 我不确定它是Mac还是iPhone,但是我认为如果你将这个和Three20结合起来,那么你可以在iPhone中拥有你自己的。 祝你好运

如果有人仍然在寻找一个完整的解决scheme,我知道有两个库提供了这个:

  • Highlightr :用于语法高亮的Swift库,支持数百种语言,但使用JS作为后端。 不过,实时编辑速度已经够快了。 ( 免责声明 :我是这个库的创build者)。
  • SyntaxKit :由Sam Soffes提供的本地解决scheme,但在开发的早期阶段。 在将来应该支持任何TextMate语法。 这应该是图书馆足够成熟的路要走。

我正在研究自己如何做到这一点,做了一些谷歌search,发现了这个不错的cocoa豆:

https://cocoapods.org/?q=Highlightr

祝你好运! 🙂