iphone - 创建自定义文本绘图 View

标签 iphone objective-c cocoa-touch

我正在为 iPhone 创建一个语法荧光笔,为了显示多种格式的文本,我对 UIView 进行了子类化并修改了 drawRect: 方法,以便每一行都以正确的方式显示语法高亮(高亮是在前面用 RegEx 完成的,文本是用 CGContextShowTextAtPoint() 一次一行绘制的)。一切正常,我将每行文本作为 NSString 存储在 NSMutableArray 中,我通过隐藏的 UITextField 及其委托(delegate)方法处理键盘,光标是一个闪烁的 CALayer,可以通过触摸来移动,我有一个自定义 ScrollView 处理滚动。但是,我有两个问题似乎无法解决:

  1. 自动换行,现在文本一直超出屏幕的左端。为了保持快速,我只重绘 View 中已更改的部分(通常只是正在编辑的行,但有时也包括下面的行,例如,如果您在文档中途按 return),使用 setNeedsDisplayInRect: .这使得自动换行变得复杂,因为您必须在屏幕上绘制不止一条线,即使它仍然只是数组中的一个对象。

  2. UIView 的最大内容大小为 1024x1024,相当于大约 64 行。我需要显示更多的能力。我正在考虑一个接一个地使用多个 CALayer,但我无法将内容绘制到图层(使用 drawLayer:inContext:drawInContext:)。

所以我的问题是:

  • 对于如何完成这两点中的任何一点,有没有人有任何建议,甚至是一般性建议。或者,
  • 是否有人已经编写了一个自定义文本绘图 View 来处理我可以使用的这些东西。

谢谢,

凯尔

编辑: 滚动问题已基本解决,但我仍然遇到自动换行问题。我的麻烦是一切都是按行完成的: View 一次更新一行,文本存储为行数组,荧光笔一次突出显示一行,等等,并且在数组中有一个索引(一个文本行)在屏幕上占用多行会引发一些问题,例如,我必须实现自己的可移动光标,当您移动光标时,它需要能够转动显示行(通过将 touch.x 除以行高)转换为文本行(数组中的索引)。有什么想法吗?

最佳答案

您应该首先花一些时间了解这个问题在 Mac 上是如何解决的:

http://developer.apple.com/documentation/Cocoa/Conceptual/TextArchitecture/Tasks/AssembleSysByHand.html

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/

相关文章:

objective-c - 将@interface 放在.m 文件中的逻辑是什么?

ios - 我如何在一个类中使用另一个类中的 NSMutablearray?

iphone - 在 View IOS 中禁用用户交互

ios - 如何在 iOS 中限制 float 值

iphone - UIActivityViewController - 检测发送错误与取消错误

iphone - 如何在 viewDidLoad 上启动 iPhone 相机?

iphone - uidatepicker 变得扭曲,需要帮助

ios - 不兼容的操作数类型 ('NSUInteger'(又名 'unsigned long')和 'id _Nullable')

ios - 从右到左语言中基于百分比的自动布局布局

iphone - 我是否正确使用 CNCopyCurrentNetworkInfo?