如何强制位于UITextView垂直边界之外的字形布局?

问题描述 投票:0回答:1

这里不需要代码。我需要一些关于如何布局很长的多行字符串的所有字形的指导,以便在启用了滚动的UITextView中显示。了解情况的一些背景信息。

背景:我有一个非常长的多字符串文本,需要在启用滚动的UITextView中显示。我创建了一个函数,用于在多行字符串中标识搜索字符串匹配的CGRect位置,然后将用户设置为匹配的CGRect位置。这是通过将匹配文本的CGRect传递给contentOffset来实现的,CGRect将滚动动画到该位置。传递给contentOffsetlayoutmanager是使用CGRect生成的,以确保准确性。换句话说,文本的CGRect基于匹配字符串的字形的位置。

但是,如果匹配的搜索字符串的bounds.height垂直放置在远离UITextView CGRect的位置,则动画实际上会失败。没有任何滚动。就好像滚动动画不知道在哪里可以找到CGRect位置来滚动到匹配的字符串。如果我首先手动滚动到UITextView的最底部,然后将动画执行到匹配的搜索字符串的CGRect位置,我可以解决问题。在这种情况下,就好像UITextView具有文本布局的完整图片,并且可以在多行字符串中准确地找到匹配的搜索字符串的UITextView的位置。

基于前述内容,我很清楚UITextView不会一次布局多行字符串的所有字形。视图可能会以表格视图创建单元格的方式绘制块中的字形。在我看来,当我手动滚动视图的边界到内容垂直大小的最底部时,UITextView能够保留所有字形布局信息。

是否有任何代码可以有效地列出UITextView的整个内容大小,即使字形远远超出UITextView的垂直边界?看来我需要首先布局所有字形以防止上面的错误。

swift uiscrollview uitextview cgrect
1个回答
1
投票

出于性能原因,UIKit的整个内容布局不一定在您预期的时候确定。

例如,如果文本视图中有足够的文本跨越可见区域的10倍,NSLayoutManager可能会“推迟”布置文本。毕竟,仅仅因为文本并不意味着用户将滚动到它。

https://developer.apple.com/documentation/uikit/nslayoutmanager提供了多种功能,可以确保在您想要访问文本视图时完整的内容(请参阅func ensureGlyphs(forCharacterRange: NSRange) func ensureGlyphs(forGlyphRange: NSRange) func ensureLayout(forBoundingRect: CGRect, in: NSTextContainer) func ensureLayout(forCharacterRange: NSRange) func ensureLayout(forGlyphRange: NSRange) func ensureLayout(for: NSTextContainer) ):

.ensureLayout

根据OP的评论,在viewDidLayoutSubviews()中调用qazxswpoi解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.