2010-08-06 51 views
1

我有一個自定義繪製UIView(即使用drawView來呈現自己)。要顯示的數據通常會比屏幕顯示的大,所以我想在視圖中包含滾動視圖功能,以便類的客戶端不必處理它,所以自定義視圖可以處理延遲加載數據在滾動時顯示。創建一個處理自己滾動的自定義UIView

但是,我該如何設計一個這樣的視圖? UITableView採用從UIScrollView繼承的方法。我試着做同樣的事情,但滾動條不再對所顯示的內容產生影響(drawView並沒有被當作欄移動)。如果我有我的自定義視圖包含滾動視圖,那麼我需要兩個單獨的類(外部視圖類和滾動視圖內的自定義繪製視圖),這是不理想的。

回答

1

你絕對應該把你的視圖放在滾動視圖中,不要過分複雜的事情!

(!如果你這樣做,首先嚐試與當你堅持一個具體的問題來這裏)

+1

同意,我打算這樣做。試圖弄清楚如何將滾動封裝到自定義類中,以便外部用戶不必自己創建滾動視圖並自行更新內容大小。 – Bill 2010-08-07 00:08:00

+1

然後爲他們提供完整的軟件包,包括滾動視圖。只是子類uiscrollview。這比重新發明輪子的工作要少。 – mvds 2010-08-07 00:10:38

+0

對,但如果我繼承UIScrollView,drawView不會在滾動上調用。 – Bill 2010-08-07 00:19:27

1

基本上有兩種方式:

- >使您的視圖的一個子視圖NSScrollView,這當然是最簡單的方法。

- >子類NSScrollView和切換在你做一個-init上重繪每一個變化

某處:

[self addObserver:self forKeyPath:@"contentOffset" withOptions:0 context:@"redraw"]; 

然後覆蓋此方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == @"redraw") { 
     [self setNeedsDisplay]; 
    } else { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

這需要你的看法每次更新它的顯示。 drawRect:將被調用,你所需要做的就是繪製這部分視圖。

如果可能,應該堅持第一種方法,因爲它不會每次都重繪,而只是在顯卡上移動預渲染紋理(視圖的CALayer)。但是,如果您的視圖比屏幕大很多,第一種方法會變慢。並且有一個最大尺寸的意見。如果您的內容非常大,則該應用可能會因第一種方法而崩潰。