问题标签 [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 投票
0 回答
173 浏览

ios - NSLayoutManager:调用 setLocation(_:forStartOfGlyphRange:) 禁用整个字符串中的字距调整?

我创建了简单的NSLayoutManager子类,允许为定义的子字符串设置自定义布局位置:

现在,我可以像这样定义任何字符范围的自定义位置:

它工作正常,唯一的问题是任何以这种方式重新定位的字形范围都是在没有字距调整的情况下布局和绘制的。这是一个例子:

在此处输入图像描述

在绿色框中有使用 my PositionableLayoutManagerwith 没有字距绘制的文本,在粉红色框中有相同的文本,使用 kering 绘制UILabel用于比较。

我怎样才能做同样的事情,但有适当的字距调整?

0 投票
2 回答
1669 浏览

ios - 具有多个 NSTextContainers 的 NSLayoutManager 导致 UITextViews 不可选择/不可编辑

我正在尝试实现多页文本编辑布局,如 Pages、MS Word、...。在 OS XI 上,可以通过为多个 NSTextView 创建一个 NSLayoutManager 和一个 NSTextStorage 来实现这一点。每个 NSTextView 都有自己的 NSTextContainer。请参阅下面的 OS X 代码。一个在两个 NSTextView 之间传播文本的简单示例:

这行得通。

但是,当我尝试在 iOS 上使用 UITextView 执行相同操作时,UITextViews 变得不可选择或不可编辑。请参阅我的 iOS 代码:

文本从一个 UITextView 流向另一个,但不可编辑。我将非常感谢任何建议。我用谷歌搜索了这个问题,发现其他人也遇到了同样的问题,但没有找到解决方案。

0 投票
1 回答
1490 浏览

ios - 在 NSLayoutManager 中控制自定义文本属性周围的间距

我有一个自定义NSLayoutManager子类,用于绘制药丸形标记。我为具有自定义属性 ( TokenAttribute) 的子字符串绘制这些标记。我可以画没有问题。

但是,我需要在我的范围周围添加一点“填充” TokenAttribute(以便令牌的圆角矩形背景不会与文本相交)。

在此处输入图像描述

在上图中,我用橙色绘制了令牌的背景,但我需要额外的填充,469这样背景就不会正好与文本相对。

我不确定该怎么做。我尝试覆盖-boundingRectForGlyphRange:inTextContainer:以返回具有更多水平填充的边界矩形,但看起来字形的布局实际上并不受此影响。

如何在某些字形/字形范围内提供更多间距?


这是我用来绘制背景的代码,在我的布局管理器子类中:

0 投票
1 回答
91 浏览

nsstring - NSLayoutManager 行为?

我有一个 NSLayoutManager、两个 NSTextContainer 和一个 NSTextStorage 对象。

我将字符串一个接一个地添加到 textStorage 对象,直到第一个 textContainer 已满,然后我使用添加到该 textContainer 的文本量在我的图书应用程序中绘制一个页面。

99% 的情况下,didCompleteLayoutForTextContainer 中的 isAtEnd 标志会告诉我第一个文本容器何时已满。

但是,在极少数情况下,如果我向 textStorage 添加一个字符串,它实际上会从第一个文本容器中删除文本!

例如,当第一个文本容器中包含此字符串时(并且几乎已满):

如果我将此字符串添加到 textStorage:

layoutManager 将从第一个 textContainer 中移动单词“Greece”并将其移动到第二个 textContainer。

在我尝试添加新字符串并让它执行这种意外行为之前,我宁愿让 layoutManager 告诉我第一个 textContainer 已满。

谁能告诉我为什么会这样?或者告诉我如何判断这种情况何时会再次发生,以便我可以确定第一个 textContainer 何时真正满了?

谢谢!

0 投票
1 回答
405 浏览

ios - 如何计算 NSLayoutManager 中的字形数量

如何获得其中的字形总数NSLayoutManager

我正在制作一个光标层以覆盖在这样的自定义文本视图上:

但是,我想确保这glyphIndex没有超出范围。像这样的东西:

但是,我无法通过反复试验找到合适的房产,并且在线搜索没有显示任何 SO 答案。

我终于在文档中找到了它(现在看起来很明显),但由于花了很长时间,我决定在这里添加一个问答。

0 投票
1 回答
480 浏览

ios - 将 NSTextContainer/NSLayoutManager 与 UITextView 一起使用时文本出现乱码

我正在实现分页文本,因此我使用 NSLayoutManager 和 NSTextContainer 为每个页面创建 UITextViews。分页工作正常,但文本乱码。在香草 UITextView 上设置相同的 NSTextStorage 时,它​​看起来是正确的:

好文 错误的文本

0 投票
2 回答
1157 浏览

ios - Why do I fail to get textContainer's rect by using "usedRectForTextContainer"

I learned the answer by NAlexN in this Question (Create tap-able "links" in the NSAttributedString of a UILabel?), and write a demo by myself. However, it is unluck for me to work the demo out. Here is my code: (everyone can copy following code to a new project directly to make a test)

The result of running is:

2016-03-11 10:58:04.457 [13451:1007618] textContainer.size={350, 300}

2016-03-11 10:58:07.968 [13451:1007618] Tap received

2016-03-11 10:58:07.969 [13451:1007618] textBoundingBox={{0, 0}, {0, 0}}

From the running result, the layoutManager seem doesn't work. I don't figour out why, maybe I used the layoutManager in a wrong way. Could any body help with this issue. Thank you so Much!

P.S: This demo is designed to create a tap-able url-link in the NSAttributedText of a UILabel.

0 投票
8 回答
59462 浏览

ios - 点击UILabel的部分文本

我有一个boundingRectForGlyphRange总是返回CGRect.zero“0.0、0.0、0.0、0.0”的问题。

例如,我正在为触摸UILabel特征文本的一部分进行编码。我的文字第一部分是任何文字,第二部分是READ MORE

我希望点击识别器仅在我触摸READ MORE时工作。如果我触摸 上的任何一点UILabelCGRectContainsPoint总是返回true,然后调用该动作。

这是我的代码:

0 投票
1 回答
932 浏览

ios - 如何定义一个自定义的 NSUnderlineStyle

查看文档NSLayoutManager,特别是drawUnderlineForGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:方法,我注意到以下内容(强调我的):

underlineVal
绘制下划线的样式。该值是从值派生的掩码,NSUnderlineStyleAttributeName例如 ( NSUnderlinePatternDash| NSUnderlineStyleThick)。子类可以定义自定义的下划线样式

我的问题是:这到底是怎么做的?

NSUnderlineStyle是一个枚举,你不能扩展或覆盖它。您当然可以Int为属性提供随机原始值,枚举案例未涵盖:

self.addAttribute(NSUnderlineStyleAttributeName, value: 100022, range: lastUpdatedWordRange)

underlineType这将为布局管理器提供“无效”但可用:

调试器截图

但这几乎让人感觉不安全,而且绝对不雅。

我无法在网上找到任何示例,也无法在 Apple 文档中找到有关这些神话般的自定义下划线样式类型的进一步线索。我很想知道我是否遗漏了一些明显的东西。

0 投票
0 回答
350 浏览

ios - 如何在 NSLayoutManager 中正确绘制下划线

我目前已将 NSLayoutManager 与 UITextView 架构中的其他类一起子类化,以实现我自己的文字处理器,如 UITextView。我目前在尝试在字形范围下布局下划线(以实现超链接之类的东西)时遇到问题。为了布局下划线,我在 NSLayoutManager 中覆盖了以下方法。

在上述方法中,我通过字形范围计算从下划线起点到下划线终点的点的下划线距离。查看以下方法:

如您所见,我得到了 startLocation,然后通过对 glyphRange 中每个字形的进展求和来得到 endLocation。这种计算似乎工作得相当好,但它似乎会导致某些字符序列的线条过度绘制或绘制不足。我最近注意到 CTFontGetAdvancesForGlyphs 不考虑字体字距调整。任何人都可以帮我处理这段代码吗?我怎样才能有效地将字体字距调整到我的计算中?我曾尝试在给定位置查询我的 NSTextStorage 中的 NSKernAttribute,但我不断返回 nil 值。我已经尝试获取 attributeAtIndex 并尝试在一个范围内枚举属性。

我也知道 NSAttributedString 有下划线选项,但出于各种原因,例如支持自定义样式、颜色等,我想自己绘制下划线。