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

ios - iOS7 中的 UITextView contentSize 变化和 NSLayoutManager

问题:在某些情况下UITextView默默地改变它。contentSize

最简单的文本视图,带有大文本和键盘。只需添加 UITextView 插座并设置- viewDidLoad为:

现在显示和隐藏键盘在某些情况下会导致文本跳转。

我找到了按 subclass 跳转的原因UITextView。我的子类中唯一的方法是:

它显示contentSize缩小和扩大键盘隐藏。像这样的东西:

看起来UITextViewiOS7 中的行为发生了很大变化。现在有些东西坏了。

进一步发现我发现layoutManager我的 textView 的新属性也发生了变化。现在日志中有一些有趣的信息:

下一行 contentSize = {320, 885}contains Layout tree contents: ..., 2127 laid glyphs, 51 laid line fragments。所以看起来某种自动布局试图在键盘显示上重新布局 textView 并更改 contentSize,即使布局尚未完成。即使我的 textView 在键盘显示/隐藏之间没有变化,它也会运行。

问题是:如何防止 contentSize 发生变化?

0 投票
1 回答
3562 浏览

ios - 在单元格中编辑 UITextView 时,iOS 7 中的 UITableView 无法滚动到正确的位置

我有一个带有静态单元格的表格视图。一个单元格包含 aUITextView并且heightForRowAtIndexPath:是动态计算的,因此单元格总是足够高以容纳文本(实际上,这部分在 iOS 7 下需要一些工作,因为不再可能简单地向 textView 询问它的contentSize)。

当我在文本视图中点击开始编辑时,键盘动画就位,tableView 上的 contentInsets 会自动调整以解决此问题(即,iPhone 纵向方向的底部插图为 216 像素),光标/插入符号变为可见,并且然后表格视图滚动到另一个位置。它最终看起来像一个反弹。

这是模拟器中的视频:https ://www.dropbox.com/s/htdbb0t7985u6n4/textview-bounce.mov

请注意,插入符号在键盘上方有一秒钟。我一直在记录表格视图contentOffset,我可以看到它滚动到一个不错的值,然后突然“转身”并向后滚动。

奇怪的是,如果我在模拟器中打开慢速动画,问题就会消失;contentOffset逆转没有发生,事情按我的预期工作(即 iOS 6 行为)。

这是动画慢的视频:https ://www.dropbox.com/s/nhn7vspx86t4exb/textview-nobounce.mov

实施说明:

  • 文本视图是粉红色的,并且具有 AutoLayout 约束,使其固定在距离为 0 的单元格上(左侧除外,即 10pts)
  • boundingRectWithSize:用来计算表格视图高度,调整 lineFragmentPadding 和任何顶部/底部插图。似乎工作。
  • 我已将 textView 设置为不可滚动,但当scrollEnabled== YES时没有发现任何不同
  • 这是一个表视图控制器,automaticallyAdjustsScrollViewInsets== YES
0 投票
1 回答
943 浏览

ios - 动画 NSLayoutManager 绘图

我有一个NSLayoutManager使用以下代码绘制文本的内容:

在我看来-drawRect:。这非常有效,但我真正想做的是逐个字符地为文本设置动画,就好像它正在被输入一样。

我尝试将字符附加到“可见字符串”变量,然后调用-[self setNeedsDisplay],但是在处理大约 20 个字符以上的文本时,它开始滞后,因为它每次都会重绘所有文本。

回归:我怎样才能为NSLayoutManager's设置动画-drawGlyphsForGlyphRange:atPoint:

0 投票
1 回答
4695 浏览

ios - 为 NSTextStorage 子类设置 viewController 的 layoutManager 时字形索引无效

我的目标是使用 TextKit 斜体,设置某些单词的文本大小等。

首先,我只是想突出显示文本字符串中的一个字符。作为 TextKit 的新手(并且对于一般的编程来说如实说),我正在关注 obc.io 问题 #5 的语法高亮主题。

当使用我创建的 UITextView 内置的 NSLayoutManager 时,我的文本出现在屏幕上,没有抛出异常。当我在视图控制器(如下)中将 UITextView 设置为 NSTextStorage 子类的布局管理器时,我收到无效字形索引异常的错误。

控制台输出如下:

我多次阅读 Apple 的 Text Programming Guide 并认为我了解文本系统是如何建立的,但不知道为什么我的字形数会超过字形数......

我为我的 viewController 和 NSTextStorage 子类创建了要点,分别在这里这里

0 投票
3 回答
5697 浏览

ios - 在我以编程方式实例化的 UITextView(使用 NSTextContainer 初始化)中,.text 属性始终为 nil

[在底部更新了解决方案和工作代码]

在 -viewDidLoad 我分配,initWithFrame:

将 myTextView 添加到子视图

设置一些基本属性(对齐方式、背景颜色、文本颜色等)

设置默认文本

.text 没有出现。myTextView 出现(由背景颜色表示),设置断点,它有一个框架,内存等。一切看起来都正确。myTextView 看起来不错,但 .text 为零。我改变它,设置它,更新它。不管 .text 保持为零。

我一遍又一遍地阅读文档。没有提到我没有做的任何事情。我不知所措。帮助。

在@interface MyController()...

过去一切都是(弱),但我把它调高(强)以防万一。没有骰子。

在 viewDidLoad...

[更新:解决方案]

当使用 NSTextContainer 分配/初始化 UITextView 时,您还需要分别初始化 NSLayoutManager 和 NSTextStorage 以使 .text 粘贴。

这是更新的工作代码

0 投票
1 回答
1311 浏览

ios - 使用核心文本边界矩形

如果我错了,请纠正我。

我尝试使用 Core Text 计算出字符的确切边界矩形。但是我收到的高度总是大于屏幕上绘制字符的实际高度。在这种情况下,实际高度在 20 左右,但无论如何该函数只给我 46。

任何人都可以对此有所了解吗?

谢谢。

这是代码

0 投票
1 回答
2410 浏览

ios - 使用 CALayer 突出显示跨越多行的 UITextView 中的文本

这是为UITextView 中的文本获取 CGRect 的延续,目的是使用 CALayer 突出显示。我无法为每个线段中的范围获取正确的矩形。

这是我目前的尝试。我基本上使用 enumerateLineFragmentsForGlyphRange:usingBlock: 来循环遍历每一行。然后我使用 enumerateEnclosureRectsForGlyphRange:withinSelectedGlyphRange:usingBlock: 来确保当前行上的文本范围与行的范围匹配并且具有相同的 Y 坐标。有时这有效,有时则无效。

似乎如果搜索文本接近返回,它会突出显示。(y坐标)。

高光已关闭。 似乎是关闭的Y坐标

在此屏幕截图中,应该突出显示“返回生成的字符范围”。

如果文本不在返回或空格附近,这似乎可以正常工作:

如果文本周围没有空格,则工作正常

我错过了什么吗?

更新:

我已经将问题缩小了一点,我相信 enumerateLineFragmentsForGlyphRange: usingBlock: 正在跳过有返回的行。

0 投票
2 回答
4381 浏览

ios7 - 替换uitextview的布局管理器

Mac OS X 上的 NSTextContainer 有一个方法 replaceLayoutManager:将 NSTextView 的 NSLayoutManager 替换为 NSLayoutManager 的子类。

不幸的是iOS没有这样的功能。我尝试了这些代码行的组合,但它一直在崩溃。

替换 UITextview 的 NSLayoutManager 的正确程序是什么?

0 投票
0 回答
128 浏览

macos - NSTextView 在打字过程中滞后

我有两个具有共享自定义 NSTextStorage 子类的 NSTextView。文本视图相互镜像。这工作正常,直到我按回车。然后第二个文本视图开始滞后,甚至不显示任何新输入。无论我输入哪个文本视图,都会发生这种情况。

如何强制第二个 textview 与第一个 textview 保持同步?

这是我的 NSTextStorage 子类。

0 投票
1 回答
1130 浏览

macros - NSLayoutManager drawGlyphsForGlyphRange:atPoint:

NSLayoutManager 类中的函数 drawGlyphsForGlyphRange:atPoint: 是如何实现的?我知道它是由 NSTextView 调用的,然后又调用了 fillBackgroundRectArray:count:forCharacterRange:color:

但是它如何确定指定字形的背景颜色(如果有)?