2012-07-04 46 views
15

這個問題真的很基礎。從視圖層次中刪除UIView和隱藏UIView之間的性能差異是什麼?UIView的性能:removeFromSuperview VS隱藏

我已閱讀不需要的視圖應從視圖層次結構中刪除。我目前有這樣的情況,UIButton有時應該是可見的。我何時隱藏UIButton以及何時將其從超級視圖中移除?

更改視圖層次結構是否昂貴?

回答

1

如果您需要在顯示和隱藏子視圖之間切換,最好的方法肯定是隱藏它。對於UIButton,內存的影響並不是那麼好。而且,如果您只需切換hidden屬性,代碼就更簡單了。

此外,您還可以獲得hidden屬性具有動畫效果的額外優勢!

+0

那麼渲染一個隱藏的UIView和不在視圖層次結構中具有該視圖有什麼區別?有區別嗎? – bas

+0

是的。如果它已被刪除,你基本上是從頭開始重新創建它。這可能對內存管理很有用,但它可能會對性能造成不利影響,並且不會使您的動作變得更加動人。 – Mundi

+0

那麼如果你保留對視圖的引用,它不必被重新創建。我對改變視圖層次結構的開銷感興趣。這種改變觸發了什麼。我認爲它基本上改變了UIKit作爲視圖層次表示的管理結構。你認爲這是準確的嗎? – bas

7

我已經在iOS6 iPad mini上做了一個實驗,它有大量豐富內容的滾動視圖(包括圖像,陰影,漸變圖層,圖案化背景圖像,以及設計師:))和我發現view.hidden = YES≠[view removeFromSuperview]。

我原本以爲隱藏設置爲YES會使視圖不被渲染/繪製,因此隱藏很多視圖對效率沒有影響。但實際結果是: 1)如果我將大滾動視圖中的離屏視圖設置爲隱藏(並且在它們返回到可見區域時取消隱藏),則滾動根本不平滑/連續。當它自然減速時,它看起來非常跳躍。 2)如果我從滾動視圖中刪除離屏視圖(但仍然保留在跟蹤數組的內存中,所以當它們回來時,它們可以立即添加),滾動顯然更加平滑。

+2

實際上,對我而言,重申將UIView設置爲「隱藏」的事實可以避免它被渲染並可能以某種方式提高性能。當然,這種跳躍是因爲「不隱藏」,這可能會迫使一個setNeedsDisplay和一個setNeedsLayout(不確定後者),這會導致減速。對於tableview來說,這可能是一個壞主意,但是對於其他視圖背後的更大視圖,隱藏它可能是個好主意,這樣在不需要時不會不必要地重繪。 – strange