我正在使用 UIKit 构建一个跨平台 UI 库的 iOS 实现,该库的主要功能之一是允许用户自由更改子控件的大小,并且父控件的大小会自动适应。
由于每次更改孩子的大小时都刷新父级的大小是低效且不必要的,因此我设计了 UI 系统以在实际设备绘制/渲染发生之前刷新所有“脏”控件的位置、大小和很多事情。在 iOS 上,我使用 CADisplayLink 调用刷新方法,然后我发现在所有内容都显示在屏幕上之后调用了该事件,这导致了以下问题:
- 用户将首先看到“崩溃”的布局。(渲染首先发生)
- 短时间后(CADisplayLink 的事件触发),一切都会恢复正常。
一开始我以为我使用CADisplayLink的方式是错误的,但是在任何地方都找不到解决方案,所以我现在很绝望(我要上吊了!!)
或者也许我根本不应该使用 CADisplayLink?
请帮我!
PS。由于我正在构建一个跨平台的东西,我实际上使用的是 MonoTouch,但我相信基本概念是相同的。
PS2。而且由于我使用的是C#的MonoTouch,所以上面的描述可能不适合Objective-C的世界(比如“事件”这个词,我认为与Obj-C相关的是选择器,或者什么^_^)
PS3。另外请原谅我的英语不好,如果我的描述不够清楚,请随时问我。
这里的代码:
CADisplayLink _displayLink = CADisplayLink.Create(Update); //Update is my refresh method
_displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
应该很容易理解^_^