关于iPhone的UIView刷新(转)
大家應該都比較清楚如果想要刷新一個UIView的話,調用它的setNeedsDisplay即可。
問題是,當你調用了一個UIView的setNeedsDisplay之后,該UIView何時才得到刷新?
經過調研發現,應該是在一個runloop的最后階段刷新。
什么是一個runloop呢?個人認為可以簡單的理解為了一個事件的處理過程。
例如用戶點擊屏幕是兩個runloop。
當用戶按下的時候,...一系列處理->UIView的touchesBegan函數->一系列處理 ?這里是一個runloop
當用戶抬起的時候,...一系列處理->UIView的touchesEnd函數->一系列處理 ?這里是另一個runloop
通常情況下,在UIView的touches事件處理函數中調用setNeedsDisplay能保證在下一次touches事件之前界面被刷新(不過不管你在一個touches事件處理函數中調用多少次setNeedsDisplay,界面只會被刷新一次)。
?
但是也有一些例外。例如UIScrollView。
因為UIScrollView要判定當前的用戶操作是不是拖動,因此它會延遲回調touches處理函數。可能出現在一個runloop中同時回調多次touches處理函數。
如果你在UIScrollView?touchesBegan里面做了一些改變界面的事情,然后在touchesEnd里面復原界面。
很可能的情況就是出現界面沒有做任何改變,你不會看到界面改變再復原的一個過程。
如果你非要顯示界面的變化該怎么辦呢?
一個可行的辦法是在其他線程中等待界面被改變之后再調用setNeedsDisplay.
NSCondition可能比較適合于這種情況。
?
另外關于setNeedDisplayInRect函數如果是一個runloop中調用不同的區域刷新多次,只會調用drawRect一次,調用的時候會將多個區域組合起來(drawRect的參數為組合后的區域)。
組合的原則好像是用一個最小的矩形將你要刷新的多個區域裝起來。
如果你連續調用一個左下角和右上角區域的刷新,那么實際調用drawRect時候的參數很可能就是你整個UIView的frame。
?
轉自:?http://www.cnblogs.com/ydhliphonedev/archive/2011/08/12/2135627.html
轉載于:https://www.cnblogs.com/lzjsky/archive/2013/03/18/2966203.html
總結
以上是生活随笔為你收集整理的关于iPhone的UIView刷新(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uml 类图聚合与组合
- 下一篇: SQL调优:带函数的谓词导致CBO Ca