有没有办法在 NSTableview 单元格中对角线绘制线条。你可以发布示例来执行此操作吗?我是 Mac 开发的新手。请在这个问题上帮助我。
提前致谢.......
有没有办法在 NSTableview 单元格中对角线绘制线条。你可以发布示例来执行此操作吗?我是 Mac 开发的新手。请在这个问题上帮助我。
提前致谢.......
是的,很容易。
您需要创建一个子类,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];
}
这:
NSBezierPath
,用于绘制线条和形状。1
。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。
现在点击运行并享受您的劳动成果!
弄乱绘图代码,直到你得到你想要的确切类型的线条。
如果您有任何疑问,请联系我。
这是一个美丽的答案,并且很好地呈现。不过,我试过了,它似乎不完整或不准确。我的 NSTableView 中有 4 列,并将自定义单元格应用于右侧的单元格 - 出于某种原因,无论我做什么,只有第 1(左)列会绘制特殊的对角线。
似乎您的绘图代码中的逻辑缺少一些“对齐位置列”的步骤,我真的不知道该怎么做。
您还可以通过仅引入自定义单元 .m 一次来改进示例 - 并添加 .h 以伴随它 - 从而展示继承。