2014-03-04 26 views
2

我想要在滾動表格上放置文本標籤,但標籤與滾動圖形衝突。在這裏,您可以看到一個測試,我有意將標籤從表格中移出並在表格中向上滾動,這會導致標籤覆蓋部分被拖動到以下,直到它退出窗口。爲什麼NSTextField在表滾動時在NSTableView上留下工件?

scrolling up breaks label overlay

此外,當我去到桌子的另一端,然後向下滾動,有時標籤似乎被重繪,它的塊去了滾動一起:

scrolling down is bad too

scrolling down is bad too

似乎表正在重繪其內容,並且沒有通知視圖對象的其餘部分在重疊時重繪自己。我該如何解決這個問題?事實上,這似乎與How to place an NSButton over an NSTableView高度相關,這似乎有相同的問題,但用按鈕而不是標籤。

回答

1

正確重繪的另一種方法是在Effects Inspector中打開xib根視圖,並將其標記爲使用Core Animation Layer。這避免了需要用重繪鉤子創建自定義類。

0

是的,NSTableView 高速緩存孔表的繪圖,以便滾動視圖不必爲每個像素刷新它。但是,這正是需要的。幸運的是可以做到的,我設法子類NSScrollView以下列方式將屬性和一個鉤子添加到reflectScrolledClipView:

@interface EHScrollView : NSScrollView 

@property (nonatomic, weak) NSView *refreshView; 

@end 

的實施將是:

#import "EHScrollView.h" 

@implementation EHScrollView 

- (void)reflectScrolledClipView:(NSClipView *)aClipView 
{ 
    [super reflectScrolledClipView:aClipView]; 
    [self.refreshView setNeedsDisplay:YES]; 
} 

@end 

那麼唯一需要的是修改用戶界面的xib。在表格嵌入到滾動視圖中的情況下,選擇滾動視圖並將其修改爲繼承自定義類EHScrollView。然後,在視圖控制器初始化中,通過refreshView屬性將出口同時用於滾動視圖和表視圖以將後者鏈接到前者。

現在,每一個滾動將自動調用setNeedsDisplay:refreshView,這意味着表和頂部重疊的任何東西都將被重繪。當然,這比不刷新表的性能更強,所以只能在有意義的地方使用。

+0

所有這些,或只是使用myScrollView.contentView.copiesOnScroll = NO; –

1

不這樣做,因爲你會失去很多的性能和增加能源的使用。

嘗試NSScrollView方法 - (void)addFloatingSubview:(NSView *)view forAxis:(NSEventGestureAxis)axis

+0

該方法只存在於10.9上,我需要對早期版本的支持。 –

1

這是因爲滾動視圖設置滾動時複製其內容,只重畫新覆蓋的部分作爲一個性能優化。把它們關掉,用

myScrollView.contentView.copiesOnScroll = NO; 

儘管這將使滾動使用多個CPU(你也可以做到這一點在廈門國際銀行,找一個複選框「上滾動副本」)。

可能是一個更好的辦法是切換滾動視圖和按鈕是層支持:

myTableView.enclosingScrollView.wantsLayer = YES; 
myTextView.wantsLayer = YES; 

(同樣,你可以在「圖層」的XIB文件,其中的檢查器中設置此你可以點擊每個視圖旁邊的複選框給它一個圖層)現在,滾動視圖將只從其自己的圖層(不再包括文本視圖)複製東西。此外,現在文本視圖的所有合成都將在顯卡中使用。但是,如果您將文本置於透明背景上,則會失去亞像素抗鋸齒功能。但是,如果它是任何其他類型的視圖(或者文本背後有一個固定的背景),這看起來會很好。

+0

支持圖層的NSTableView以生成各種問題而聞名 –

+0

@RaduSimionescu您能提供關於哪些問題的更多信息嗎?任何來源?文章? 「這是已知的」有點模糊:-) – uliwitness

+0

http://www.cocoabuilder.com/archive/cocoa/231301-nstableview-and-ca-backed-views.html http://stackoverflow.com/questions/ 11976540/view-based-nstableview-renders-blank-rows-after-inserted-new-rows-with-animatio http://stackoverflow.com/questions/15591676/layer-backed-nsview-animation http:// stackoverflow。 com/questions/8500565 /基於視圖的nstableview-with-core-animation ...並且您可以找到許多其他類似的報告。如果可能,最好避免層支持的NSTableView。只有在真正需要的時候才能進入它,併爲意想不到的行爲和挫折做好準備 –

相關問題