gpt4 book ai didi

ios - UITextView 在设置了属性文本之后做了什么?

转载 作者:行者123 更新时间:2023-12-01 16:30:06 26 4
gpt4 key购买 nike

我有一个 UITextView,我正在向其中添加一些自定义 UI。此自定义 UI 的布局基于 UITextView 中文本的位置。

我正在使用 firstRectForRange UITextView 上的方法(来自 UITextInput)。该方法返回 textView 中指定文本范围的框架。

但是,它在设置属性文本后无法正常工作。在返回预期值之前需要最少的时间。这段时间很可能是直到带有更新文本的第一帧被渲染并显示在屏幕上的时间。

我目前正在将布置自定义 UI 的代码包装到 dispatch_async(dispatch_get_main_queue(), ...) 中。 block ,它会延迟执行,直到帧被渲染(大约 9 毫秒)。

UITextView 在设置属性字符串和在屏幕上显示下一帧之间做了什么?
有没有更好的地方/方法调用让我 Hook ?
我有什么办法可以强制同步运行该操作?

我试过打电话的事情:
(设置属性文本之后;调用 firstRectForRange 之前)

  • 调用setNeedsLayoutlayoutIfNeeded之前 firstRectForRange .
  • 调用drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
  • 最佳答案

    您是否尝试从后台线程设置属性文本?我猜这就是问题所在。所有界面更改都应该发生在主线程上。从个人经验来看,从后台线程更改内容偶尔会起作用,通常会更慢,甚至更多时候根本不起作用。

    如果是这种情况,dispatch_async正是您想要做的。它使在后台处理数据变得非常容易,然后快速跳到主线程进行渲染。如果您想在设置字符串并找到 firstRectForRange 后进行更多处理你可以使用 dispatch_sync让您的后台线程等待渲染,或在渲染后分派(dispatch)回另一个线程。

    至于 UITextView 在渲染属性字符串时做了什么,我真的不确定,但我猜这个轻微的延迟来自于系统弄清楚属性字符串应该是什么样子,以及它将如何渲染。为了进一步了解,您可能需要深入研究 CoreText,因为幕后发生了很多事情。

    编辑:
    如果您在主线程上,那么我认为您无能为力。使用 dispatch_after可能比使用 dispatch_async 稍微干净一些。

    又一想。你试过调用setNeedsDisplay吗? ?这通常会告诉 View 重绘自身。

    关于ios - UITextView 在设置了属性文本之后做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252962/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com