2013-01-16 26 views
0

我正在使用UIKit構建跨平臺UI庫的iOS實現,其中一個庫的主要功能是允許用戶自由更改子控件的大小,並且父控件的大小將自動適應。因爲每次當孩子的大小改變時效率低下並且不必要,所以我設計了UI系統來刷新所有「髒」控件的位置,大小和很多事情,因爲在實際的設備繪製/渲染髮生之前,每次刷新父級的大小時都是如此。在iOS上,我用CADisplayLink調用刷新方法,然後我發現該事件被調用後,一切都呈現到屏幕上,導致以下問題:iOS:如何使CADisplayLink的事件稱爲BEFORE實際屏幕繪製?

  1. 用戶會看到一個「崩潰」佈局第一。 (渲染首先發生)
  2. 經過一段時間(觸發CADisplayLink的事件)後,一切都將恢復正常。

起初我還以爲我的使用CADisplayLink是錯誤的方式,但解不了隨處可見,所以我現在很絕望(我要掛我自己!)

或者,也許我不應該使用CADisplayLink?

請幫幫我!


PS。由於我正在構建一個跨平臺的東西,我實際上使用的是MonoTouch,但我相信基本概念是一樣的。

PS2。因爲我使用的是MonoTouch,它是C#,所以上面的描述可能不適合Objective-C世界(比如單詞「event」,我認爲Obj-C相關的是選擇器,或者某個^ _ ^)

PS3。請原諒我可憐的英語,如果我的描述不夠清楚,請隨時問我任何問題。

代碼在這裏:

CADisplayLink _displayLink = CADisplayLink.Create(Update); //Update is my refresh method 
_displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode); 

應該很容易理解^ _^

+0

您能否在'CADisplayLink'發生第一次回調之前調用您的第一次刷新?你能發佈更多的代碼嗎?很難看到你的控件是如何設置的以及CADisplayLink與它們的交互方式。 – jonathanpeppers

+0

控制設置代碼太複雜,不能發佈到這裏,但我可以給你一個大概的想法:我的控件是UIControl的包裝,每個控件將它的位置/大小/可見性數據存儲在緩衝區中,而不是立即將它們應用於UIControl 。這些數據應用於Update()方法中,該方法用於按照上面的代碼創建CADisplayLink。 – horeaper

+0

由於控件的位置/大小/可見性可能隨時間而改變,所以我需要確保Update()在UIControl渲染到屏幕上之前調用,這是問題所在! – horeaper

回答

0

從我可以收集所有信息,是basiclly沒有這樣做的方式。所以我修改了我的佈局代碼,現在在設置值之後立即應用這些屬性。仍然需要一些優化,但不再需要依賴CADisplayLink。

無論如何,謝謝!