问题标签 [nslayoutmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
855 浏览

swift - Swift UITextView LayoutManager 子类

我正在尝试将 a 子类UITextViewlayoutManager

但不断出现崩溃。我一直在看的例子是在Objective C中,所以我对我应该如何更改layoutManager有点困惑

这是我的代码...

}

使用...

编译但在下一行崩溃。

子类 UITextView 的 LayoutManager 的正确方法是什么?

谢谢

0 投票
2 回答
1635 浏览

ios - NSLayoutManager:如何在只有可渲染字形的地方填充背景颜色

默认布局管理器填充没有文本(最后一行除外)的背景颜色(通过 NSAttributedString .backgroundColor 属性指定)。

在此处输入图像描述

我已经通过子类化 NSLayoutManager 并覆盖func drawBackground(forGlyphRange glyphsToShow: NSRange, at origin: CGPoint)如下实现了我想要的效果:

在此处输入图像描述

但是,这不能处理属性字符串中由范围指定的多种颜色的可能性。我怎样才能做到这一点?我看过fillBackgroundRectArray,收效甚微。

0 投票
0 回答
149 浏览

cocoa - TextEdit/NSTextView:在内联图像后键入时行高发生变化

我有一个带有嵌入式富文本的 Mac 应用程序NSTextView,但同样的问题可以用 TextEdit 重现:

  • 当一行只包含一个图像而没有文本时,在图像之后键入会导致下面的文本向下移动。

文本编辑

  1. 打开一个新的TextEdit文档并输入“test”,[return]
  2. Cmd-Shift-Ctrl-4截取某物的屏幕截图
  3. 将图像粘贴到下一行
  4. [返回],输入“测试”
  5. 现在在图像后面输入一些东西

为了在我的应用程序中调试它,我添加了一些代码来突出显示每个行片段矩形NSLayoutManager

带有 NSTextView 的自定义应用程序

第 2 行的高度从 14pt 开始,只要我输入一个字母,它就会变为 18pt。

这是 TextKit 中的错误还是我的代码中不正确/缺少 NSAttributedString 属性的问题?

我尝试为我的内联图像设置段落样式和字体,以及为 NSTextView 设置默认段落样式,但问题仍然存在。

0 投票
1 回答
223 浏览

swift - NSLayoutManager 在 NSTextView 中为 mousePosition 返回不正确的 glyphIndex

我有一个NSTextView子类作为 中的右侧项目NSSplitViewController,左侧​​面板是NSOutlineView. 为了在文本视图中按下命令键时处理鼠标单击,我添加了以下内容以查找鼠标下方的字形:

但是,这会导致索引大约 10 太高,从而选择了错误的字形。我的文本视图只有等宽字符,所以偏移不是由额外的字形引起的。

有趣的是,如果我折叠左侧面板(在代码或情节提要中),我会得到正确的索引。但是 x 方向的偏移量大于左侧面板的宽度。

我在这里遗漏了什么,上面的代码有错误吗?

0 投票
1 回答
150 浏览

objective-c - NSTextView 和确定字形位置

我正在尝试为某些行定义 y 轴位置,并在 NSTextView 中在它们旁边放置标签。我正在使用 glyphRangeForCharacterRange。

它有点工作,但文本视图可以有很多文本(甚至〜4000-5000行)并且用插图包裹。当我滚动到看不见的东西时,结果是错误的。它似乎在没有包装的情况下返回值,或者我认为。如果我在滚动到相应文本时对位置进行更新,则它们的计算正确。

这是没有额外偏移的代码:

如果我在文档唤醒后尝试设置标签位置,也会出现同样的问题,所以我在第一次按键时计算标签,这不太好。

解决这个问题的最好方法是什么?

0 投票
0 回答
432 浏览

ios - 如何使用 NSLayoutManager 用自定义绘图替换文本附件?

我的最终目标是让用户能够将文本拆分为一个NSTextViewUITextView多个部分,其中两个后续部分在视觉上由自定义视图分隔符分隔(可能,但不一定是水平规则 - 我希望能够调整分离器的视觉外观没有麻烦)。

分节分隔符的示例屏幕截图

我需要一个适用于两个平台的解决方案:macOS 和 iOS

(我的相关问题集中在 macOS 的解决方案上,其中一个使用了NSTextAttachmentCelliOS 上不可用的 s 。)

我目前解决这个问题的方法如下:

  1. 我在窗口的工具栏中有一个按钮来插入分节符。
  2. 当用户点击该按钮时,我会创建一个没有文本但带有文本附件的新属性字符串:

    SectionChangeTextAttachment是我创建的自定义子类,NSTextAttachment以便能够将此分节符附件与其他可能的附件区分开来。)

  3. 我将其插入attachmentString到当前光标位置的文本存储中:

    /li>
  4. 我创建了一个自定义NSLayoutManager子类。它的任务是找到类的所有附件,SectionChangeTextAttachment并用分隔图(或字形?)替换所有出现的地方。这就是问题所在:由于 Apple 的文档有限且部分过时,我无法弄清楚如何做到这一点。

所以我的问题是:

如何让我的布局管理器使用比字符/字形占用更多空间的自定义绘图(分隔符)替换附件字符(带有特定附件)?

(我猜附件字符没有字形,因此布局管理器没有为它提供任何空间。)

为了使这项工作,我需要覆盖哪些方法?

(这种方法一开始是否有意义?)

0 投票
3 回答
372 浏览

ios - 将文本视图的属性字符串细分为(可参考的)部分

我正在尝试实现一个非常简单的文本编辑器,它应该可以NSTextView在 macOS 和UITextViewiOS 上使用。这个文本编辑器有一个工具栏按钮“ Section Break ”,每次点击它都会在当前光标位置插入一个新的部分。一个部分应该是:

  1. 在视觉上可识别为一个部分(通过在两个后续部分之间添加视觉分隔符并可能添加一些垂直空格),

  2. 可参考。用户应该能够在编辑器中看到所有部分的列表,并且通过单击该列表中的项目,文本视图应该立即滚动到该部分的开头。

另一个问题中,我问如何解决第一个问题,不幸的是,我还没有找到关于这部分的答案(即使有一个适用于 macOS 的解决方案)。

然而,这个问题集中在第二个方面:
如何在我的文本视图中维护所有部分的列表,其中每个部分都保持对相关文本的准确引用?

此任务的复杂性在于用户可以随时复制和粘贴或简单地编辑文本的任何部分。因此,我不能保留一个简单的段落编号数组或类似的东西。

文本视图中几个部分的屏幕截图


我尝试过的以及为什么这似乎是一项艰巨的任务:

  1. 我的一个想法是子类NSTextStorage化并使用一组可变属性字符串作为其内部存储。然后我会使用一个特殊的子类,NSTextAttachment并将其用作我的文本存储中的分节指示符。问题在于文本视图仅在用户编辑文本时调用以下方法

    第一种方法只传递没有任何属性的纯字符串,第二种方法只获取属性。这意味着在第一种方法中,我无法判断替换字符是否实际上应该是分节符,因此我无法决定在我的内部文本存储数组中的哪个位置创建新元素。

    在第二种方法中,我不知道用户是否实际添加了新文本(在这种情况下,我必须在我的文本存储数组中为每个分节符属性添加一个新元素),或者用户是否只是更改了现有的某些属性文本(在这种情况下,之前已经创建了新的数组元素)。

  2. 我还考虑过在表格视图或堆栈视图中使用多个文本视图的想法。但是,这不起作用,因为它会阻止用户在多个后续部分中选择(和删除)文本。

  3. 最后,我尝试了 subclassing NSLayoutManager,但是关于它的文档真的很薄,对我来说似乎是错误的地方。(毕竟布局管理器的职责是文本的布局,而不是跟踪它的结构。)

有任何想法吗?

0 投票
0 回答
119 浏览

ios - 根据自定义 NSAttributedString 属性调整生成的字形矩形

我创建了一个自定义,以便在找到自定义属性NSLayoutManager时在字符串中的某些字符周围呈现边框。NSAttributedString该框应该大于字形的标准边界框,这并不难。我遇到的问题是,如果字形位于文本视图的边缘,则两侧会被剪裁。我想要的是将盒子(或盒子的足够填充)包含在布局计算中。

这是一个没有适当填充的盒子的例子:

填充不当的字符串

这是具有适当填充的框的示例:

具有适当填充的字符串

0 投票
0 回答
162 浏览

ios - 如何使用 NSTextStorage 获取最大行数的字符串高度?

我正在尝试获取属性字符串的高度(对于任何字体、任何语言、任何奇怪的 utf8 字符等)。

我在 Badoo Chatto 上发现了这个关于不同解决方案的有趣话题:https ://github.com/badoo/Chatto/issues/129

我正在使用的解决方案是他们的:

如何修改此逻辑以便它可以考虑最大行号?

我尝试添加container.maximumNumberOfLines = 2,但它不会改变任何东西,因为 NSTextContainer 设置为无限高。

理想情况下,我想避免使用任何 UIView 或子视图,因为此处理必须在后台线程中完成。此外,任何基于 UIKit 的解决方案似乎都不是 100% 可靠的(参见 Badoo Chatto 链接)。

0 投票
2 回答
1213 浏览

ios - 在 UILabel 的 draw#rect 中获取字形 boundingRect

使用 Swift,我想在 UILabel 中的 draw#rect 中获取字形的 boundingRect。

UILabel 已经具有大小(例如示例中的 300x300)和质量,例如居中的文本。

在此处输入图像描述

绿色方块不正确——它应该更像这些红色方块!

在此处输入图像描述

似乎有很多问题:

  • 当然,我制作的 layoutManager 应该具有 UILabel 的品质,例如“居中文本”?(不过,我相信您实际上不能直接访问 UILabel 的 layoutManager 吗?)

  • 我们应该使用 CTLineGetOffsetForStringIndex 之类的东西吗?在draw#rect中甚至可能吗

  • 请注意,除了没有正确的偏移量外,绿框似乎还是错误的高度。(它看起来更像是一个普通的旧的 intrinsicContentSize 而不是字形边界框。)

如何?

作为记录,我的总体目标是根据实际的字形框移动字形(对于“y”、“X”等当然是不同的)。但总的来说,有很多有用的理由来了解字形的框。