通过三种方式个性化NSTableView

时间:2011-08-10 10:28:42

标签: objective-c cocoa nstableview nstableviewcell

我想使用NSTableView向用户显示磁盘列表,我认为显示它们的方式与普通的NSTableView有所不同。这是一个图像示例:

I'd like something like this

我喜欢的功能是:

  1. 较厚的行(就像这一行)
  2. 用于选择的漂亮渐变,而不是正常颜色
  3. 左侧是一个图像(驱动器的图标),右侧是文本(它的名称),但只使用一列(名称为“可用磁盘”)
  4. 我特别不愿意做第三个,因为我认为它将包含我自己的细胞亚类并自己绘制文本和图像,我有线索如何做:(

    其他的我认为一旦有人指出我正确的方向,他们就不会那么困难了......

    PS:图像来自首选项中的Xcode 4.

2 个答案:

答案 0 :(得分:0)

您可以使用NSCollectionView,并设计一个可用于行的自定义NSView,但有关使用XCode 4的一些注意事项,请参阅this question and answers

答案 1 :(得分:0)

好的!我发现所有这三件事都可以做到:

  1. 您可以更改IB中的行厚度
  2. 通过将“突出显示”更改为“源列表”而不是“常规”,您也可以在IB中完成这个漂亮的渐变
  3. 现在第三个我做的事情与我说的想法有点不同:

    • 在IB中我关闭了“标题”,因此在用户不知道的情况下使用两列是
    • 第一列我放了一个图像单元格,而第二列我放了一个文本单元格
    • 然后,因为我改变了行的高度,我注意到NSTextViewCell没有垂直对齐文本,也没有选项,这意味着我最终有一个NSTextViewCell子类用于居中文本。这是:
  4. `

    @interface ACTCenteredTextFieldCell : NSTextFieldCell
    {
    
    }
    
    @end
    
    @implementation ACTCenteredTextFieldCell
    
    - (NSRect)titleRectForBounds: (NSRect)theRect {
        NSRect titleFrame = [super titleRectForBounds: theRect];
        NSSize titleSize = [[self attributedStringValue] size];
    
        titleFrame.origin.y = theRect.origin.y + (theRect.size.height - titleSize.height) / 2.0;
    
        return titleFrame;
    }
    
    - (void)drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView {
        NSRect titleRect = [self titleRectForBounds: cellFrame];
    
        [[self attributedStringValue] drawInRect: titleRect];
    }
    @end
    

    有!到目前为止对我来说工作得很好!