Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 创建自定义文字工程视图_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 创建自定义文字工程视图

Iphone 创建自定义文字工程视图,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我正在为iPhone创建一个语法高亮显示,为了显示多种格式的文本,我对UIView进行了分类,并修改了drawRect:方法,以便每一行都以正确的语法高亮显示(高亮显示在前面使用RegEx完成,文本使用CGContextShowTextAtPoint()绘制)一次一行)。一切正常,我将每行文本作为NSString存储在NSMutableArray中,我通过隐藏的UITextField及其委托方法处理键盘,光标是一个闪烁的CALayer,可以通过触摸四处移动,我有一个处理滚动的自定义滚动视图。然而

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

  • Word wrap,现在文本一直从屏幕的左端消失。为了加快速度,我仅使用
    setNeedsDisplayInRect:
    重新绘制视图中已更改的部分(通常只是正在编辑的行,但有时也会重画下面的行,例如,如果在文档进行到一半时按return键)。这使得换行变得复杂,因为这样你就必须在屏幕上画多条线,即使它仍然只是数组中的一个对象

  • UIView的最大内容大小为1024x1024,相当于大约64行。我需要展示更多的东西。我正在考虑一个接一个地使用多个Calayer,但在将内容绘制到层时遇到了问题(使用
    drawLayer:inContext:
    drawInContext:

  • 因此,我的问题是:

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

    凯尔


    编辑:滚动问题已基本解决,但我仍然无法使用word wrap。我的问题是一切都是按行进行的:视图一次更新一行,文本存储为一行数组,荧光灯一次高亮显示一行,等等。数组中的单个索引(一行文本)占用屏幕上的多行会引发一些问题,例如,我必须实现自己的可移动光标,当您移动光标时,它需要能够将显示行(通过将touch.x除以行高度)转换为文本行(数组中的索引)。有什么想法吗?

    最好在UIView中托管的CATiledLayer中绘制文本,以绕过1024x1024纹理大小限制(在所有现有设备上看起来实际上是2048x2048)。对于CALayer中的文本绘制示例,我建议您参考框架中的类。该层(继承自同一框架内的CPLayer类)在CALayer中进行跨平台(Mac和iPhone)文本渲染。您可能可以将其扩展为更长文本块的CATiledLayer


    需要注意的一点是,此层中使用的是特定于平台的drawAtPoint:方法,而不是您正在使用的CGContextShowTextAtPoint()函数。原因是CGContextShowTextAtPoint()仅适用于ASCII文本,这意味着您无法使用它进行Unicode文本呈现。有一个使用CGContextShowTextAtPoint()在renderAsVectorInContext:方法底部的“define'd out”部分中绘制文本的示例。

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

    特别是,您应该熟悉行片段生成,这是您试图为word wrap解决的问题,并且您应该了解glyph生成,以便更好地处理富文本。当然,您不需要实现NSTypesetter或NSLayoutManager的所有灵活性,但Mac上的文本系统功能强大得令人难以置信,您应该从它的示例中学习。在iPhone上实现类似NSAttributedString的东西可能对您很有价值,可以提高您的性能


    除非您经常移动东西(这在UIScrollView中最有效),否则我认为您不需要在这里使用CALayers。对于这个问题来说,这似乎有些过分,实际上可能会对UIScrollView已经提供的优化产生负面影响。如果您发现性能问题,首先确保您没有在drawRect:中进行冗余计算。

    请查看中的TTStyledText。不确定它是否符合您的目标,但可以作为一个例子。(该库本身有点臃肿,但它是一个很好的资源。)

    感谢您的回答,您知道drawAtPoint:是否比CGContextShowTextAtPoint()慢很多吗?我认为是这样,因为Obj-C函数通常比C函数慢,但情况并非总是如此。事实上,调用Obj-C方法与调用C函数相比,开销最小,所以我不担心这一点。然而,是的,这些例程要慢得多,因为在iPhone上,它们似乎使用Webkit来进行文本布局。这是否会成为您的问题取决于您重新渲染文本的频率。我在PiCubed中使用了它,它具有非常好的渲染性能:。仅供将来参考,我做了一个简单的基准测试,比较了drawAtPoint和CGContextShowTextAtPoint。我在屏幕上的任意y位置绘制了1000次36个字符串,以下是我得到的结果(在1g iPod touch上):CGContextShowTextAtPoint-99刷新/秒,drawAtPoint-75刷新/秒。所以,CG方法显然要快得多。谢谢Rob,我会看看那些文档。我去美国CALayers的唯一原因是为了避开1024(或2048)像素的视图高度限制。我打算使用多个层来扩展它。关于视图高度限制,而不是渲染整个视图(eati)