2011-02-18 50 views
3

我我的大綱視圖,我加入了自定義單元格,繪製自定義單元格,我指的示例代碼,目前可可文檔NSOutlineView更改公開圖片

http://www.martinkahr.com/2007/05/04/nscell-image-and-text-sample/

我想改變公開的圖像中我的自定義圖像單元格的,我已經嘗試下面的東西

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 
    { 
     if([item isKindOfClass:[NSValue class]]) 
     { 
      MyData *pDt = (MyData *)[item pointerValue]; 
      if(pDt->isGroupElement()) 
      { 
       [cell setImage:pGroupImage]; 
      } 
     } 
} 

,但同樣沒有工作,有沒有其他的辦法來改變形象披露, 還我怎樣才能找出willDispla yCell項目是否展開或摺疊,所以我可以相應地設置圖像,

這只是改變披露圖像的地方嗎?

+0

出於某種原因,我的大綱:willDisplayOutlineCell ....永遠不會被調用。有什麼建議麼? – Tony 2012-01-02 05:09:25

+0

有關完整的自定義示例 - 請查看https://github.com/johndpope/TreeTest – johndpope 2015-02-19 05:56:55

回答

1

你有基本的想法,但你需要做的是自己畫圖像。下面的代碼我使用:

- (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSString *theImageName; 
    NSInteger theCellValue = [cell integerValue]; 
    if (theCellValue==1) { 
     theImageName = @"PMOutlineCellOn"; 
    } else if (theCellValue==0) { 
     theImageName = @"PMOutlineCellOff"; 
    } else { 
     theImageName = @"PMOutlineCellMixed"; 
    } 

    NSImage *theImage = [NSImage imageNamed: theImageName]; 
    NSRect theFrame = [outlineView frameOfOutlineCellAtRow:[outlineView rowForItem: item]]; 
    theFrame.origin.y = theFrame.origin.y +17; 
    // adjust theFrame here to position your image 
    [theImage compositeToPoint: theFrame.origin operation:NSCompositeSourceOver]; 
    [cell setImagePosition: NSNoImage]; 
} 

您將需要3幅不同的圖像,你可以看到,一個是ON狀態,一個用於OFF狀態,還一個是MIXED狀態,這應該是介於兩個之間。混合狀態確保您仍然可以獲得開幕式和閉幕式動畫。

+0

已完成您的建議,但出現一些問題,無論項目是展開還是摺疊,始終爲cellvalue == 1,此代碼爲繪製圖像在披露圖片上,如果我的圖片是透明的,那麼它會顯示披露圖片 – Amitg2k12 2011-02-18 10:42:10

0

這是我曾嘗試和迄今爲止的工作,

/*,因爲我們顯示我們自己透露,擴大按鈕*/

- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row { 

    return NSZeroRect; 
} 
- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row { 
    NSRect superFrame = [super frameOfCellAtColumn:column row:row]; 

    if ((column == 0) && ([self isGroupItem:[self itemAtRow:row]])) { 
     return NSMakeRect(0, superFrame.origin.y, [self bounds].size.width, superFrame.size.height); 
    } 
    return superFrame; 
} 

我有子類NSOutlineView類,並且覆蓋這些方法,

[self isGroupItem]是檢查是否屬於它的組。 但有一個問題,現在看起來像我需要做的鼠標操作:(在雙擊組行不會觸發

4

自己研究這個問題,並嘗試一些答案在這裏,我發現其他方法提到將工作,但會要求你爲了避免屏幕的文物和其他奇怪的行爲進行更大量的人工干預。

,我發現最簡單的辦法是下面的,這在大多數情況下工作。

該解決方案還具有系統自動處理許多其他情況的附加好處,例如列移動等,無需您的參與EMENT。

- (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell 
    forTableColumn:(NSTableColumn *)tableColumn 
       item:(id)item 
{ 
    [cell setImage:[NSImage imageNamed: @"Navigation right 16x16 vWhite_tx"]]; 
    [cell setAlternateImage:[NSImage imageNamed: @"Navigation down 16x16 vWhite_tx"]]; 
} 

在你的情況,你會用你的類檢測邏輯包裝它,併爲你的情況適當地設置細胞圖像。

0

一個很好的方法來改變披露圖像是使用視圖根據大綱視圖:

在您的視圖控制器與NSOutlineViewDelegate:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 
{ 
    CustomNSTableCellView *cell = [outlineView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
    cell.item      = item; 

    return cell; 
} 

你要繼承你的NSOutlineView並在此改變方法:

- (id)makeViewWithIdentifier:(NSString *)identifier owner:(id)owner 
{ 
    id view = [super makeViewWithIdentifier:identifier owner:owner]; 

    if ([identifier isEqualToString:NSOutlineViewDisclosureButtonKey]) 
    { 
     // Do your customization 
     // return disclosure button view 

     [view setImage:[NSImage imageNamed:@"Disclosure_Categories_Plus"]]; 
     [view setAlternateImage:[NSImage imageNamed:@"Disclosure_Categories_Minus"]]; 
     [view setBordered:NO]; 
     [view setTitle:@""]; 

     return view; 
    } 

    return view; 
} 

//Frame of the disclosure view 
- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row 
{ 
    NSRect frame = NSMakeRect(4, (row * 22), 19, 19); 
    return frame; 
} 
1

誰在尋找Swift2解決方案。子類NSRow的大綱視圖和覆蓋didAddSubview方法如下。

override func didAddSubview(subview: NSView) { 
    super.didAddSubview(subview) 
    if let sv = subview as? NSButton { 
     sv.image = NSImage(named:"IconNameForCollapsedState") 
     sv.alternateImage = NSImage(named:"IconNameForExpandedState") 
    } 
}