在特定的NSTableview单元格中对角绘制线条

时间:2011-07-04 15:14:18

标签: cocoa nstableviewcell

有没有办法在NSTableview单元格中对角画线。请你发贴样本来做这个。我是Mac开发的新手。请帮我解决这个问题。

提前致谢.......

2 个答案:

答案 0 :(得分:8)

是的,很容易。

您需要创建NSTextFieldCell子类,这实际上是NSTableView用于显示文字的单元格类型。

对类进行子类化会创建该类的新版本,该版本执行原始类所做的所有操作以及更多。

这是使用Xcode 4.如果您使用Xcode 3,请告诉我。

在Xcode中,选择 文件>创建新文件。新>新文件......

New File

在弹出的工作表中选择 Objective-C Class ,然后点击 下一步

Objc class

使它成为NSTextFieldCell的子类,这是我们将要修改的副本。点击 下一步

subclass

您可以将其保存为您想要的任何内容,但出于本教程的目的,请将其另存为 MyDiagonalLinedTextFieldCell 。点击 保存

saving

应弹出两个新文件。

files

单击 .m 文件。这是实现文件,它告诉我们类中的方法是做什么的。 其内容应类似于以下内容:

//
//  MyDiagonalLinedTextFieldCell.m
//  CustomCell
//
//  Created by spudwaffle on 7/4/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "MyDiagonalLinedTextFieldCell.h"

@implementation MyDiagonalLinedTextFieldCell

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

@end

init方法下方添加drawInteriorWithFrame: inView:方法。 每次单元格需要在屏幕上渲染时,应用程序都会调用drawInteriorWithFrame: inView:方法。

您的代码现在应如下所示:

@implementation MyDiagonalLinedTextFieldCell

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {

}

@end

您需要做的第一件事就是绘制标准NSTextFieldCell。 这可以通过调用:

来完成
[super drawInteriorWithFrame:cellFrame inView:controlView];

这会在程序想要的确切区域中绘制正常的NSTextFieldCell

现在,我们需要绘制自定义线条。让它们分开5个像素,使它们像素宽1像素。 这需要for循环!

for (int i = 0; i < cellFrame.size.width/5; i ++) {

}

这会使int等于0,每次循环运行时都会添加到该计数,并在i达到需要绘制的行数时停止。

接下来,输入绘图代码来绘制线条。

for (int i = 0; i < cellFrame.size.width/5; i ++) {
        NSBezierPath *path = [NSBezierPath bezierPath];
        [path moveToPoint:NSMakePoint(i * 5, cellFrame.origin.y)];
        [path lineToPoint:NSMakePoint((i * 5) + 2, cellFrame.origin.y + cellFrame.size.height)];
        [[NSColor grayColor]set];
        [path setLineWidth:1];
        [path stroke];
}

此:

  1. 创建NSBezierPath,用于绘制线条和形状。
  2. 将路径的起点移动到单元格的下边缘。
  3. 在单元格的上边缘画一条线。
  4. 将绘图颜色设置为灰色。
  5. 将绘图线宽设置为1
  6. 画线。
  7. 由于for循环,它为每一行反复执行此操作。

    这是完整的MyDiagonalLinedTextFieldCell.m文件。您暂时无需担心.h

    #import "MyDiagonalLinedTextFieldCell.h"
    
    @implementation MyDiagonalLinedTextFieldCell
    
    - (id)init
    {
        self = [super init];
        if (self) {
            // Initialization code here.
        }
    
        return self;
    }
    
    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
        [super drawInteriorWithFrame:cellFrame inView:controlView];
        for (int i = 0; i < cellFrame.size.width/5; i ++) {
            NSBezierPath *path = [NSBezierPath bezierPath];
            [path moveToPoint:NSMakePoint(i * 5, cellFrame.origin.y)];
            [path lineToPoint:NSMakePoint((i * 5) + 2, cellFrame.origin.y + cellFrame.size.height)];
            [[NSColor grayColor]set];
            [path setLineWidth:1];
            [path stroke];
        }
    }
    
    @end
    

    现在,我们需要在表视图中设置单元格以使用此类。

    单击您的MainMenu.xib文件。 单击表视图行中的单元格,直到它变为蓝色。

    blue cell

    然后,点击右侧栏中的按钮,如下所示: button

    Class 更改为MyDiagonalLinedTextFieldCell,然后按Enter键。

    class change

    现在跑步并享受你的劳动成果!

    custom cell window

    使用绘图代码进行混乱,直到获得所需的确切行数。

    如有任何问题,请随时与我联系。

答案 1 :(得分:0)

这是一个很漂亮的答案,而且很好呈现。尽管如此,我还是尝试过,但似乎不完整或不准确。我的NSTableView中有4列,并将自定义单元格仅应用到右边的单元格-出于某种原因,无论我做什么,只有FIRST(左)列会绘制特殊的对角线。

您的绘图代码中的逻辑似乎缺少“我确实不知道如何做”的“与位置列对齐”的步骤。

您还可以通过仅引入自定义单元.m并添加.h来改进示例,从而证明继承。