1

有没有办法在 NSTableview 单元格中对角线绘制线条。你可以发布示例来执行此操作吗?我是 Mac 开发的新手。请在这个问题上帮助我。

提前致谢.......

4

2 回答 2

9

是的,很容易。

您需要创建一个子类NSTextFieldCell它实际上是NSTableView用于显示文本的单元格类型。

子类化一个类会创建该类的一个新版本,它可以完成原始类所做的所有事情以及更多。

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

在 Xcode 中,通过选择File > New > New File...创建一个新文件

新文件

在弹出的工作表中选择Objective-C Class并点击Next

对象类

使其成为 的子类NSTextFieldCell,这就是我们将对其进行修改的副本。点击下一步

子类

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

保存

应该会弹出两个新文件。

文件

单击.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 ++) {

}

这使得 aint等于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. 画线。

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文件。单击表格视图的一行中的单元格,直到它变为蓝色。

蓝色细胞

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

将类更改为MyDiagonalLinedTextFieldCell并按 Enter。

班级变化

现在点击运行并享受您的劳动成果!

自定义单元格窗口

弄乱绘图代码,直到你得到你想要的确切类型的线条。

如果您有任何疑问,请联系我。

于 2011-07-04T23:16:54.003 回答
0

这是一个美丽的答案,并且很好地呈现。不过,我试过了,它似乎不完整或不准确。我的 NSTableView 中有 4 列,并将自定义单元格应用于右侧的单元格 - 出于某种原因,无论我做什么,只有第 1(左)列会绘制特殊的对角线。

似乎您的绘图代码中的逻辑缺少一些“对齐位置列”的步骤,我真的不知道该怎么做。

您还可以通过仅引入自定义单元 .m 一次来改进示例 - 并添加 .h 以伴随它 - 从而展示继承。

于 2020-02-28T04:42:36.317 回答