2012-04-03 47 views
0

我正在繪製一個UIView的數據網格與drawRect,其中我不會知道創建UIView時的最終大小,因爲列和行的數量是動態的。當然我可以在創建UIView之前進行計算,但這並沒有什麼意義,因爲我也將在UIView子類中進行這些計算,而不必提取它。直到drawRect之後才知道UIView的最終幀大小?

那麼我該如何處理呢?我是否初始化一個非常大的框架並在drawRect完成後調整它?

我也將這個視圖設置爲UIScrollView的內容,以防在其分配給它的區域中太大以至於無法查看它。

我將要繪製視圖看起來是這樣的:Pricing Grid

+0

看到我對這個問題的回答:http://stackoverflow.com/a/20131528/143225 – Brenden 2013-11-21 20:49:52

回答

-1
  • 在您的視圖中添加一個方法,根據其數據確定它應該有多大。這需要與drawRect:分開。
  • 在您的視圖控制器中,當您設置視圖時,請調用該方法來獲取該大小。
  • 然後將視圖的邊界和/或幀設置爲該大小。
  • 並且還將滾動視圖的contentSize設置爲該大小。

關鍵概念是:分開「確定我的視圖的東西是多大」和「畫我的視圖的東西」的想法。現在,您在繪製時正在進行大小計算,但您需要能夠儘早完成。

如果你想變得很花哨,你可以在視圖的超級視圖中查看覆蓋layoutSubviews - 這將是一個很好的檢查視圖的期望大小是否已經改變的地方,然後更新視圖的大小和滾動查看contentSize。但是沒有必要這樣做。

+0

我只是想到了同樣的事情,但你確認它讓我覺得它是正確的。 :) 謝謝! – 2012-04-04 05:33:40

+0

'layoutSubviews'被多次調用。請參閱:http://stackoverflow.com/a/20131528/143225 – Brenden 2013-11-21 20:50:28

+0

是的,您需要在-layoutSubviews中小心,並且只在需要時才做這項工作。這就是爲什麼我說「檢查視圖的期望大小是否發生了變化」。如果再次調用-layoutSubviews,但沒有任何更改,則不需要執行任何操作。 – 2013-11-22 00:48:19

0

也許其他人有另一種解決方案,但我認爲,你的情況我會覆蓋SETFRAME:並呼籲setNeedsDisplay,這樣的drawRect之後將被稱爲你的框架改變了。你已經嘗試過這種方法嗎?

+0

嗯..這似乎有點哈克。我會稍微等一下,看看還有什麼其他的建議。謝謝! – 2012-04-03 22:31:06

+0

也許...但我相信你期望它更像layoutSubviews,每次框架改變時都會調用它。只有在具體要求重新繪製視圖時纔會調用drawRect。 – clstroud 2012-04-03 22:35:11

+0

但是,另一件事是,你使用init或initWithFrame:初始化你的自定義UIView? – clstroud 2012-04-03 22:36:17