问题标签 [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 回答
77952 浏览

cocoa - Swift 协议:方法不会覆盖其超类中的任何方法

由于 Xcode 6 仍然有很多 Swift 的错误,我不确定是它还是我错过了一些东西。我的班级采用协议 NSLayoutManagerDelegate。但似乎不可能覆盖我需要的方法。我按照文档描述的那样做:

但是我在这里遇到错误:方法不会覆盖其超类中的任何方法。我该怎么办?

0 投票
2 回答
1149 浏览

uitextview - 将多个 NSTextContainers 添加到 NSLayoutManager

我注意到您可以使用选择器将多个文本容器添加到 Objective-C 中的布局管理addTextContainer:(NSTextContainer *)textContainer器。使用 TextKit,我只需要添加一个文本容器,当使用多个文本容器时,所有的 textviews 都会从链接到布局管理器的文本存储中填充相同的文本。我只是好奇,但我什么时候需要将多个文本容器添加到一个布局管理器?

0 投票
0 回答
119 浏览

ios - iOS 检测被敲击的字符

你好,我给了一个字符串:

我已将 TapGestureRecognizer 添加到字符串中,并想检测用户点击了哪个字符,这是我的代码:

总是返回最后一个字符的索引(在这种情况下 = 14) - 为什么?

0 投票
1 回答
1353 浏览

ios - 使用 NSLayoutManager 计算文本大小

我正在开发一个视图,它使用 TextKit 框架来排版这样的列中的文本: 列文本布局

我使用UIView带有边缘插图(黑色矩形)的边界来计算 10 CGRects,然后将其转换为NSTextContainers(红色矩形)。在drawRect:我将这些传递给NSLayoutManagerwhich 为我排版和绘制字形。

我的问题是:如何计算所需的列数?我可以绘制恒定数量的列,但文本长度不同,我需要以编程方式调整列数。

[NSLayoutManager glyphRangeForTextContainer:]当文本容器为空时,我找到了返回长度范围为 0 的方法。因此,我可以循环创建文本容器并使用此方法来确定是否需要更多容器。但是,据说这种方法效率低下,因为它会触发布局计算,而且我不乐意将它循环运行数百次。

一定有更好的方法!

谢谢你的回答,皮特。

0 投票
2 回答
2589 浏览

ios7 - 是什么导致 iOS 8 中带有 UITextView 的不需要的内容插入(iOS 7 中没有)?

我一直在UITextView以编程方式创建 s,在 iOS 7 中使用自动布局。像这样:

除了我创建的其他约束之外,我在文本视图的底部还有一个:

这样我就可以在键盘显示时更改约束:

这一切都很好......

问题

我刚刚切换到 Xcode 6 和 iOS 8(我知道晚了) -UITextView现在里面的文本在顶部有一个插图。例如(文本视图背景为黄色):

在此处输入图像描述

是什么导致了插入?它与NSTextContainer和相连textContainerInset吗?

  • 从 iOS 7 及更高版本开始使用NSTextContainer正确textContainerInset的使用方式?UITextView
  • 在 iOS 8 中是否必须这样做?

如果是的话,我将不胜感激以编程方式创建 aUITextView以及必要的NSTextContainerand的一些指导NSLayoutManager;然后设置textContainerInset. (我将以编程方式使用自动布局)。

谢谢。

0 投票
1 回答
585 浏览

ios - enumerateLineFragmentsForGlyphRange:withBlock: 返回单词片段

我正在使用 aUITextView来显示一些文本。在布置文本时,我使用该enumerateLineFragmentsForGlyphRange:withBlock:方法枚举文本行。

但是,我遇到了一个奇怪的错误:通常,在 textview 中显示的文本与我在appendString.

例如,文本字段中的文本可能会这样说:

...但是看看我的 NSLog 语句,那些 appendStrings 类似于:

我已经尝试了很多东西——玩hyphenationFactor,确保它们textContainerInsets是正确的,等等——但我无法弄清楚。是什么导致方法中的无效换行符enumerateLineFragmentsForGlyphRange:withBlock:

0 投票
1 回答
575 浏览

ios - 在 NSTextContainer 中获取文本

我有一个带有 NSString 内容的 NSOrderedSet 段落。遍历所有内容,创建一个大字符串并赋予 NSTextStorage。但是所有的段落都丢失了。

下面的代码允许我计算页面并在页面中显示内容。但我想将内容分成段落并知道用户何时点击特定段落。

如何使用 NSTextStorage 将内容不显示为单个大字符串,而是显示为一组较小的文本块?注意:我使用 UIPageViewController 来显示内容,所以我还需要知道每页的段落数。

谢谢。

0 投票
0 回答
656 浏览

ios - 如何替换 NSLayoutManager 的文本存储

我正在尝试构建一个具有 UITextView 的表格视图单元格。为了重用这个表格视图单元格,我为布局管理器设置了一个新的文本存储。但是将布局管理器添加到新的文本存储中并不会改变文本视图的文本存储。

布局管理器、文本容器、文本视图设置如下:

当我“配置”表格视图单元格时,我将布局管理器添加到新的文本存储中:

到目前为止,这有效,新文本将正确显示。但是当我重用单元格(将布局管理器添加到另一个文本存储)并获取文本视图的大小时,通过...</p>

… 尺寸错误。在查看了文本视图的属性后,我发现它仍然指向错误的文本存储。

这感觉真的很奇怪。我是否需要重新设置整个堆栈(布局管理器、文本容器、文本视图)?

如果是,我将需要启动一个新的文本视图并更新布局约束,这将非常昂贵。

0 投票
0 回答
963 浏览

ios - 确保 NSLayoutManager 中的布局

我有一个包含大量文本的 UITextView。iPhone 4、5 和 6 上的滚动大部分都很流畅,但在 6 Plus 上却有很多卡顿。(我相信这是因为 6 Plus 对于它必须推动的像素数量而言动力不足)。我注意到,一旦我滚动过一个区域,如果我在它上面滚动,滚动就会很流畅;该区域已经进行了布局,处理器不需要做太多事情。我想在到达该地区之前强制进行布局。这是我尝试过的:

这似乎根本没有做任何事情。在第一次通过区域时滚动仍然不平滑,并且前后日志语句的差异为 0.00014 秒。为了确保我真的得到了正确的文本容器,我还尝试了:

这也没什么区别。

我需要做什么来强制布局文本容器中的所有文本?

任何帮助将不胜感激。

谢谢。

编辑添加:回答 TheCodingArt 的问题:就布局管理器而言,我没有做任何异国情调的事情。这是我的设置代码:

显式实例化和添加文本容器和文本存储是我从这个问题的第一个答案中学到的: Scroll to bottom of UITextView erratic in iOS 7 ...这确实有所帮助,但对于 6 Plus 来说还不够。

后来,我向其中添加了文本:

0 投票
0 回答
1100 浏览

ios - 以编程方式在 UITextView 中选择文本,在具有多个文本容器的布局管理器中

如果布局管理器中只有一个 TextContainer,则操作系统将处理用户交互。但是有了多个文本容器,我在某处读到它不是开箱即用的。

这里有一些我已经用过但没有运气的东西。

如果只有一个 TextContainer,我可以让它工作,但我希望它有多个容器。

这就是我想以编程方式实现的目标

更新:添加了我正在处理的代码

谢谢。