我正在为 iPhone 创建一个语法荧光笔,为了显示多种格式的文本,我对 UIView 进行了子类化并修改了 drawRect:
方法,以便每一行都以正确的方式显示语法高亮(高亮是在前面用 RegEx 完成的,文本是用 CGContextShowTextAtPoint()
一次一行绘制的)。一切正常,我将每行文本作为 NSString 存储在 NSMutableArray 中,我通过隐藏的 UITextField 及其委托(delegate)方法处理键盘,光标是一个闪烁的 CALayer,可以通过触摸来移动,我有一个自定义 ScrollView 处理滚动。但是,我有两个问题似乎无法解决:
自动换行,现在文本一直超出屏幕的左端。为了保持快速,我只重绘 View 中已更改的部分(通常只是正在编辑的行,但有时也包括下面的行,例如,如果您在文档中途按 return),使用
setNeedsDisplayInRect:
.这使得自动换行变得复杂,因为您必须在屏幕上绘制不止一条线,即使它仍然只是数组中的一个对象。UIView 的最大内容大小为 1024x1024,相当于大约 64 行。我需要显示更多的能力。我正在考虑一个接一个地使用多个 CALayer,但我无法将内容绘制到图层(使用
drawLayer:inContext:
和drawInContext:
)。
所以我的问题是:
- 对于如何完成这两点中的任何一点,有没有人有任何建议,甚至是一般性建议。或者,
- 是否有人已经编写了一个自定义文本绘图 View 来处理我可以使用的这些东西。
谢谢,
凯尔
编辑: 滚动问题已基本解决,但我仍然遇到自动换行问题。我的麻烦是一切都是按行完成的: View 一次更新一行,文本存储为行数组,荧光笔一次突出显示一行,等等,并且在数组中有一个索引(一个文本行)在屏幕上占用多行会引发一些问题,例如,我必须实现自己的可移动光标,当您移动光标时,它需要能够转动显示行(通过将 touch.x 除以行高)转换为文本行(数组中的索引)。有什么想法吗?
最佳答案
您应该首先花一些时间了解这个问题在 Mac 上是如何解决的:
http://developer.apple.com/documentation/Cocoa/Conceptual/TextLayout/TextLayout.html
特别是,您应该熟悉行片段生成,这是您要为自动换行解决的问题,并且您应该了解字形生成以便做好富文本。当然,你不需要实现 NSTypesetter 或 NSLayoutManager 的所有灵 active ,但 Mac 上的文本系统非常强大,你应该从它的例子中学习。为 iPhone 实现类似于 NSAttributedString 的东西可能对你很有值(value)并提高你的表现。
除非你经常移动东西(这最好在 UIScrollView 中工作),否则我认为你不需要在这里使用 CALayers。对于这个问题来说,这似乎有点矫枉过正,而且实际上可能会对 UIScrollView 已经提供的优化产生不利影响。如果您遇到性能问题,请首先确保您没有在 drawRect: 中进行冗余计算。
关于iphone - 创建自定义文本绘图 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844829/