2010-11-19 70 views
3

我試圖創建一個網格樣式視圖(類似於NSCollectionView),除了使用核心動畫。我非常瞭解它,最後要做的最重要的事情就是實現滾動。使用NSScrollView與CALayer

我到目前爲止的設置是我有一個NSView子類(支持層),初始化時創建並添加網格層作爲主視圖層的子圖層。我爲網格層創建了一個自定義的CALayoutManager,它將子視圖排列成網格狀。正如所料,當我將子圖層添加到網格圖層時,會調用佈局管理器並自動定位圖層。到目前爲止,所有事情都應該如此。

當我嘗試使用NSScrollView作爲自定義視圖的父級來實現滾動時,問題出現了。我按如下設置:我在Interface Builder中將我的自定義視圖創建爲NSScrollView的子視圖。然後,在我的佈局管理器類中,我添加了一個delegate屬性,並且在初始化期間,我的視圖子類將自己設置爲佈局管理器的代表。在佈局管理器的layoutSublayersForLayer:方法結束時,我使用委託方法layoutManager:contentHeightChanged:來請求其代表。下面是該方法在我NSView子類實現:

- (void)layoutManager:(MyLayoutManager*)manager contentHeightChanged:(CGFloat)height; 
{ 
    CGFloat newHeight = [[self enclosingScrollView] contentSize].height; 
    if (height > newHeight) { 
     newHeight = height; 
    } 
    NSRect newFrame = [self frame]; 
    newFrame.size.height = newHeight; 
    [self setFrame:newFrame]; 
} 

這很簡單,它只是檢查,看看新的高度是否大於滾動視圖的內容大小,並設置視圖框架上,新的高度。

這在一定程度上起作用。當視圖調整大小時,它會正確調整視圖的框架大小,因爲它應該封裝內容的整個高度,從而使滾動條出現。問題:當視圖的滾動條可見時調整大小時,網格層抖動的子層。下面是顯示問題視頻:

http://vimeo.com/16987653

正如你所看到的,有沒有問題,當滾動條是不可見的(換句話說,當內容的高度的範圍內配合滾動視圖)。我可以確認這不是佈局管理器和處理單列的問題,因爲我在沒有滾動視圖的情況下測試了相同的東西,並且沒有抖動。

任何意見非常感謝。

回答

1

通過翻轉圖層和視圖(左上角的原點)的座標系解決了此問題。

+8

你能提供一個你如何實際做到的例子嗎? – 2012-04-29 06:44:16