我試圖創建一個網格樣式視圖(類似於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];
}
這很簡單,它只是檢查,看看新的高度是否大於滾動視圖的內容大小,並設置視圖框架上,新的高度。
這在一定程度上起作用。當視圖調整大小時,它會正確調整視圖的框架大小,因爲它應該封裝內容的整個高度,從而使滾動條出現。問題:當視圖的滾動條可見時調整大小時,網格層抖動的子層。下面是顯示問題視頻:
正如你所看到的,有沒有問題,當滾動條是不可見的(換句話說,當內容的高度的範圍內配合滾動視圖)。我可以確認這不是佈局管理器和處理單列的問題,因爲我在沒有滾動視圖的情況下測試了相同的東西,並且沒有抖動。
任何意見非常感謝。
你能提供一個你如何實際做到的例子嗎? – 2012-04-29 06:44:16