【问题标题】:Phantom characters with the Cocoa text system带有 Cocoa 文本系统的幻影字符
【发布时间】:2012-04-28 20:59:59
【问题描述】:

我正处于 Mac OS X 纯文本编辑器应用程序的规划阶段,我需要确定我需要在什么级别自定义文本系统以实现以下目标。这和语法高亮的问题有些关系,但有一件事让它变得非常不同。

这个纯文本编辑器的行为会很特别。它会在用户编辑文档的同时异步解析文本,并在文本中的某些位置在用户键入时在文本中插入结构指示标记。这些幻象标记看起来像常规(可能颜色不同)字符,但它们不是实际文本的一部分。

例如,想想一个教孩子算术运算顺序的文本编辑器。用户将输入一个数学表达式,如 3+8*3/9,而用户将在文本视图中看到 3+((8*9)/9);括号会在她输入的同时出现。括号将是幻影标记并且不能选择,并且复制文本也不会包括它们。使用左右箭头键会跳过它们(例如,插入符号永远不能位于“(”的左侧或“)”的右侧。)。尝试删除它们会导致删除它之前的下一个字符。简而言之,它们将处于应用解析器的完全控制之下。

因此,从概念上讲,数据模型是用户编辑的纯文本字符串以及解析器计算和重新生成的幻象字符位置列表。问题是将这两个组件组合成一个文本视图,其行为与上例相同。

我一般不熟悉 Cocoa 编程。根据您的经验,如果不求助于 Core Text,实现上述内容的实用性如何?是否可以通过替换一些委托或子类化 NSTextLayout 或其他什么?

我不希望我的文本视图做出奇怪的形状或任何东西。我只是希望它们显示不属于实际文本的字符。

【问题讨论】:

    标签: macos cocoa text view


    【解决方案1】:

    我实际上有一个应用程序可以做一些非常相似的事情。

    我继承了NSTextView 并覆盖了-drawRect:,使用NSLayoutManager 和这段代码...

    NSRect rectOfChars = [[textView layoutManager]boundingRectForGlyphRange: [[textView layoutManager]glyphRangeForCharacterRange:arange actualCharacterRange:NULL] inTextContainer:[textView textContainer]];
    

    ...让NSRect(s) 来绘制我的标记。

    然后我在我的文本视图的委托中实现了-textView:shouldChangeTextInRange:replacementString:,以便在用户编辑文本时适当地调整标记。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      看看 NSLayoutManager,特别是-drawGlyphsForGlyphRange:atPoint:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 2014-03-20
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多