问题标签 [textkit]
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.
ios - TypeKit vs NSAttributedString - 创建样式标签时,我可以使用 TextKit 作为 NSAttributedString 的替代品吗?
我想设计一个标签。没什么疯狂的,只是一些颜色,更改特定单词的字体大小等。我可以使用 NSAttributedString 来做到这一点,但是在 iOS 7 中新引入的 TextKit 中是否可能/更好?
我环顾四周,但 TextKit 还没有大量的教程,似乎也没有解决这个问题。
ios - iOS7 TextKit:项目符号对齐
我正在编写一个仅适用于 iOS 7 的应用程序,并且我正在尝试在不可编辑的 UITextView 中对项目符号点进行适当的格式化。
只需插入一个项目符号字符就很容易了,但当然不会出现左缩进。在 iOS 7 上,在项目符号点后设置左缩进的最简单方法是什么?
提前致谢,
坦率
ios - 为 iOS 7 创建文本编辑器
问题
我需要了解 TextKit 的工作原理以及如何使用它来构建文本编辑器。我需要弄清楚如何仅绘制最终用户与之交互的可见文本,或者确定如何在 processEditing 方法中将属性仅应用于可见文本而不将属性应用于整个更改的文本范围。
背景
iOS 7 推出了 TextKit。我有一个完全实现 TextKit 的标记器和代码(请参阅 Apple 的 TextKitDemo 项目——下面提供了一个链接)......并且它可以工作。但是,它真的很慢。当文本被 NSTextStorage 解析时,它要求您在 processEditing 方法中在同一线程上对已编辑文本的整个范围进行着色。将工作卸载到线程并没有帮助。简直太慢了。我已经到了只能重新归因修改后的范围的地步,但如果范围太大,过程会很慢。在某些情况下,整个文档在进行更改后可能会失效。
以下是我的一些想法。请让我知道这些中的任何一个是否会起作用,或者可能会推动我朝着正确的方向前进。
1) 多个 NSTextContainers
阅读文档,我似乎可以在 NSLayoutManager 中添加多个 NSTextContainers。我假设通过这样做,我不仅应该能够定义可以在 NSTextContainer 中绘制的行数,而且我还应该能够知道最终用户可以看到哪个 NSTextContainer。我知道如果我走这条路,我将需要投入大量时间来看看它是否可行。初步测试表明您只需要一个 NSTextContainer。所以我必须继承 NSLayout 或创建一个包装器,其中布局管理器确定哪些文本进入哪个文本容器。呸。另外,我不知道 TextKit 是如何让我知道是时候绘制一个特定的 NSTextContainer 了……也许这不是它的工作原理!
2) 使用 NSLayoutManager 使范围无效
使用 invalidateLayoutForCharacterRange:actualCharacterRange: 使 layoutManager 无效。但这实际上是做什么的,它将如何减轻文本归因阶段的负担?它什么时候让我知道需要突出显示特定文本?另外,我看到 NSLayoutManager 会懒惰地绘制字形......如何?什么时候?这对我有什么帮助?我如何利用这个调用,以便我可以在它实际布置文本之前归因于支持字符串?
3) 覆盖 NSLayoutManager drawGlyphsForGlyphRange:atPoint: 方法。
我真的不想这样做。话虽如此,在 Mac OS X 中,NSAttributedStrings 具有临时属性的概念,其中样式信息仅用于表示。这大大加快了突出显示的过程!问题是,它在 iOS 7 TextKit 框架中不存在(或者它在那里,我只是不知道)。我相信,通过覆盖此方法,它将为我提供与使用临时属性相同的速度......因为我可以在此方法中回答所有布局、颜色和格式问题,而无需触及 NSTextStorage 属性细绳。唯一的问题是,我不知道这个方法相对于 NSLayoutManager 类中提供的其他方法是如何工作的。它是否保持宽度和高度的状态?当 NSTextContainer 太小时,它会修改它的大小吗?此外,它仅绘制已添加到文本缓冲区中的字符的字形。它不会重新绘制整个屏幕。只有一小部分......这很好。我对如何使用它有一些想法……但我真的不想布置字形。那是太多的工作,我还没有找到一个很好的例子来做到这一点。
我将非常感谢您提供的任何帮助。
作为感谢,我列出了我在过去几年中使用过的所有框架和参考资料,这些框架和参考资料帮助我达到了现在的水平,希望它们对你有所帮助。
语法高亮框架:
- http://colorer.sourceforge.net/
- https://github.com/MikeJ1971/Glint(不支持字符串、注释等)
- https://projects.gnome.org/gtksourceview/features.html(为令牌生成提供了一个不错的库。与 GTK 一起工作,但可能会为不同的布局管理器重写)
- http://parsekit.com/(很好的解析器。但是,当需要修复范围时,您必须包装 API 以创建状态机)
- http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Languages/LanguageKit/
- https://github.com/CodaFi/IDEKit(令人惊叹的工作。这段代码中有很多好主意。我的问题是我完全不知道它是如何修复范围的,或者即使它确实如此)
- http://www.crimsoneditor.com/(一个旧的 Windows 代码编辑器。它有一个非常好的标记器——虽然有点难以阅读。它不使用正则表达式。话虽如此,我的标记逻辑是关闭的这段代码,它比上面列出的任何框架都快得多)
资源:
- http://cocoafactory.com/blog/2012/10/29/how-to-use-custom-nsattributedstring-attributes/
- https://github.com/objcio/issue-5-textkit
- http://alexgorbatchev.com/SyntaxHighlighter/
- http://docs.xamarin.com/samples/TextKitDemo/(苹果的演示)
- http://cocoadev.com/ImplementSyntaxHighlighting(一定要阅读所有的子文章。很棒的东西)
这些框架中的大多数都是相同的。它们要么不考虑范围的上下文切换(或者您必须编写包装器以提供上下文),要么它们不会在用户修改文本(例如字符串、多行注释等)时修复上下文范围。最后一个要求非常重要。因为如果分词器无法确定哪些范围受到更改的影响,您最终将不得不再次解析和属性整个字符串。唯一的例外是 Crimson 编辑器。这个分词器的问题是它在分词时不保存状态。在绘图时,算法使用标记来确定绘图状态。它从文档的顶部开始,直到到达可见的文本范围。不用说,
另一个问题是这些框架没有遵循 Apple 所做的相同 MVC 模式——这是意料之中的。具有完整工作编辑器的框架都使用由它们构建的 API(即 GTK、Windows 等)提供的钩子,这些钩子为它们提供关于何时何地绘制到屏幕哪个部分的信息。就我而言,TextKit 似乎要求您在 processEditing 中归因于整个更改范围。
也许我的观察是错误的。(我希望他们是!!)也许,例如 ParseKit,它将为我需要它做的工作而我根本不明白如何使用它。如果是这样,请告诉我!再次感谢!
ios - NSHTMLTextDocumentType 的项目符号间距和换行符开始位置
随着 iOS 7 的到来NSHTMLTextDocumentType
,我使用下面的代码来解析 html 并将其显示在UITextView
. 它完美地工作,除了要点。
如何更改项目符号每一侧的间距(项目符号与UItextView
左边框之间的空间以及项目符号与其右侧文本之间的空间)?
还有,更重要的是。如果文本在下一行继续,我还需要它在相同的 x 位置继续,就像它上面的项目符号文本开始的行一样。我怎样才能做到这一点?(第二行缩进)
我尝试过使用各种 css,但似乎NSHTMLTextDocumentType
仍然相当有限。我设法改变的只是列表的颜色。
感谢所有帮助。
先感谢您!
代码:
objective-c - characterIndexForPoint 为相同的参数返回不同的结果
我有一个连接到平移手势识别器的 UITextView。当我将手指拖到文本视图上时,我使用 characterIndexForPoint 方法来确定我的手指在哪个字符上方,然后突出显示该点的文本。
在视图中的文本有换行符的某些情况下,即使我传入相同的参数,此方法似乎也会返回不同的结果。连续调用两次touched方法,一次charIndex为167,下一次为270。
我检查了文本视图的 AttributedString ,两种情况下的字体大小相同。
这是一个已知的错误?难道我做错了什么?
ios - 使用 UITextView 和 TextKit 显示 .docx
我正在编写一个应用程序,我希望能够在其中打开、编辑和编写 .docx 文件。我已阅读有关 TextKit 的文档和教程,并了解如何将属性应用于文本,并且我知道 .docx 基本上是一个 .zip,其中包含一些XML
. 但是,我不知道如何在 Objective-C 中读取 .docx 并将其放入 UITextView 中,然后再将其写回。关于如何去做的任何想法?
ios - 使 TextKit 中的字形无效
我正在尝试实现文本折叠效果,以根据文本存储中的属性隐藏 UITextView 中的一些文本,然后在layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange
方法中将这些字形属性设置为 NSGlyphPropertyNull。到目前为止,该部分工作得很好,并且完成了预期的工作。问题是当我尝试强制文本视图的布局管理器重新布局文本时。我试过调用所有的无效方法,但只有一个有效,invalidateGlyphsForCharacterRange: changeInLength: actualCharacterRange:
. 我传入了整个字符范围,changeInLength 为 0,因为我实际上没有更改任何内容,而 actualCharacterRange 为 NULL。每隔一段时间,这工作得很好。但大多数时候我得到这个错误,Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'
. 这有什么问题?这是我的一些代码:
基本上我的目标是当用户点击一个按钮时,文本将因此折叠或展开。在 UILayoutManagerDelegate 方法中layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font: forGlyphRange:
,我将我想要隐藏的字形设置为 NSGlyphPropertyNull 仅self.hidden
当YES
ios - NSAttributedString 相对字体大小自定义属性
在 CSS 中,您有font-size属性,可用于指定相对于文本其余部分的字体大小。
在 iOS中实现自定义相对字体大小属性需要什么(仅需要 iOS 7 兼容性)?是否有任何第三方解决方案已经实现了这一点?
(我希望该解决方案对支持属性文本的所有内容都很有用:UILabel、UITextView、... UIButton 中的 titleLabel 等)
ios - 如何使用 Text Kit (iOS 7) 在 UITextView 中垂直居中文本
概括:
在 iOS 6 中,我通过键值观察文本视图的 contentSize 属性 ( https://stackoverflow.com/a/12591299/1239263 ) 在 UITextView 中垂直居中文本。当我升级到 iOS 7 时,后一种技术的工作不一致。
与其尝试修复 KVO 技术,我更愿意使用 Text Kit 在 UITextView 中垂直居中文本。
我使用 Text Kit 设计了一个解决方案,但它会在设备旋转时中断。
UITextView 是橙色的。
当文本视图最初加载时,文本正确居中:
当设备旋转到横向时,文本仍然正确居中:
但是,当设备旋转回纵向时,文本未正确居中。文本应该在一行,就像上面的第一个屏幕截图一样。
对于后一个屏幕截图,将几何图形记录到控制台会显示文本视图的文本容器宽度太窄。
细节:
我试过的:
我尝试在 centerText 方法中手动设置容器大小。根据我为容器大小设置的值,在某些情况下设置容器大小确实有效。哪些情况?这取决于显示的文本行数。
由于我将 widthTracksTextView 设置为 YES,我不明白为什么我需要设置文本容器大小。如果我确实需要设置文本容器宽度,为什么正确的值似乎取决于显示的行数?
ios - 向多个文本视图添加排除路径
我正在尝试将多个排除路径添加到 a 中UITextView
连续布置的一系列 s 中UIScrollView
,如下所示:
但是,这会导致应用程序冻结,我已将问题追溯到每个NSTextContainer
. 例如,如果我没有设置排除路径,它就可以正常工作。重要的是,如果我只在第一个上设置排除路径NSTextContainer
,那么一切正常 - 但任何超过一个,应用程序都会冻结。我做错了什么,或者这是一个错误?