Ios UITextView在设置AttributeText后做什么?

Ios UITextView在设置AttributeText后做什么?,ios,uitextview,uitextinput,Ios,Uitextview,Uitextinput,我有一个UITextView,我正在向其中添加一些自定义UI。此自定义UI根据文本在UITextView中的位置进行布局 我在UITextView上使用的是firstRectForRange方法(来自uitextPut)。此方法返回textView中指定文本范围的帧 但是,设置attributedText后,它不能立即正常工作。返回预期值所需的时间最短。这段时间很可能是在屏幕上呈现并显示带有更新文本的第一帧之前的时间 我目前正在将用于布置自定义UI的代码包装到一个dispatch\u async

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

我在UITextView上使用的是
firstRectForRange
方法(来自uitextPut)。此方法返回textView中指定文本范围的帧

但是,设置attributedText后,它不能立即正常工作。返回预期值所需的时间最短。这段时间很可能是在屏幕上呈现并显示带有更新文本的第一帧之前的时间

我目前正在将用于布置自定义UI的代码包装到一个
dispatch\u async(dispatch\u get\u main\u queue(),…)
块中,该块将其执行延迟到渲染帧之后(大约9毫秒)

UITextView在设置attributedString和在屏幕上显示下一帧之间做什么? 有更好的地方/方法调用供我使用吗?
我有没有办法强制同步运行该操作

我试过打电话的事情:
(在设置AttributeText之后;在调用firstRectForRange之前)

  • firstRectForRange
    之前调用
    setNeedsLayout
    layoutifneed
  • 调用
    drawViewHierarchyInRect(self.bounds,AfterScreenUpdate:true)

是否尝试从后台线程设置AttributeText?我想这就是问题所在。所有接口更改都应该发生在主线程上。从个人经验来看,从后台线程更改内容有时会起作用,但速度往往较慢,更常见的是根本不起作用

如果是这样的话,
dispatch\u async
正是您想要做的。它使在后台处理数据变得非常容易,然后快速跳转到主线程进行渲染。如果要在设置字符串并查找
firstRectForRange
后执行更多处理,可以使用
dispatch\u sync
使背景线程等待渲染,或在渲染后将其分派回另一个线程

至于UITextView在呈现attributedString时做了什么,我真的不确定,但我猜稍微有点延迟来自于系统计算属性字符串的外观以及呈现方式。为了进一步理解,您可能需要深入研究CoreText,因为在引擎盖下会发生很多事情

编辑: 如果你是在主线上,那么我认为你能做的就不多了。使用
dispatch\u after
可能比使用dispatch\u async稍微干净一些


再想一想。您是否尝试过调用
setNeedsDisplay
?这通常会告诉视图重新绘制自身。

不,一切都发生在主线程上。我只是使用dispatch_async来将执行延迟最短的时间。嘿@TimBodeit,我用了更多的案例更新了我的答案。希望这能帮助更多人。