我有一个UITextView,我正在添加一些自定义UI。此自定义UI根据UITextView中文本的位置进行布局。
我在UITextView上使用firstRectForRange
方法(来自UITextInput)。此方法返回textView中指定文本范围的框架。
但是,在设置attributedText后,它无法正常工作。它需要最少的时间才能返回预期值。这段时间很可能是直到第一帧更新文本呈现并显示在屏幕上的时间。
我目前正在将自定义UI的代码包装到dispatch_async(dispatch_get_main_queue(), ...)
块中,这会延迟执行,直到渲染帧为止(大约9毫秒)。
UITextView在设置referencedString和在屏幕上显示下一帧之间做了什么?
是否有更好的地方/方法要求我加入?
我有什么方法可以同步强制执行该操作吗?
我试过的事情: (在设置attributedText之后;在调用firstRectForRange之前)
setNeedsLayout
之前致电layoutIfNeeded
和firstRectForRange
。drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
答案 0 :(得分:0)
您是否尝试从后台线程设置attributedText?我猜这就是问题所在。所有接口更改都应该在主线程上发生。根据个人经验,从背景线程中改变事物偶尔会起作用,通常比较慢,甚至更常不起作用。
如果是这种情况,dispatch_async
正是您想要做的。它使得在后台处理数据变得非常容易,然后快速跳到主线程进行渲染。如果您想在设置字符串并找到firstRectForRange
后进行更多处理,可以使用dispatch_sync
使后台线程等待渲染,或者在渲染后调度回另一个线程。
至于UITextView在渲染attributesString时所做的事情,我真的不确定,但我猜这个细微的延迟来自系统弄清楚属性字符串应该如何看,以及如何它将被渲染。为了进一步理解,您可能需要深入了解CoreText,因为有很多事情发生在幕后。
编辑:
如果你是主线,那么我不认为你可以做的更多。使用dispatch_after
可能比使用dispatch_async稍微清洁。
还有一个想法。您是否尝试过调用setNeedsDisplay
?这通常会说明重绘自己的观点。