我的应用程序中有一个NSTableView,同时在X轴和Y轴上都绘制了数据(即,每一行都与每一列匹配。)我已经按照我想要的方式填充了单元格的数据,但是看起来糟糕的是,这些列水平延伸。
我想将NSTextFieldCell放在其侧面,以便将文本垂直书写而不是水平书写。我意识到我可能必须对NSTextFieldCell进行子类化,但是我不确定要完成我想做的事情我需要重写哪些函数。
NSTextFieldCell中的哪些函数可绘制文本本身?有没有内置的方式可以垂直而不是水平绘制文本?
最佳答案
好吧,花了很多时间才能弄清楚这一点,但是我最终遇到了NSAffineTransform对象,该对象显然可以用于相对于应用程序移动整个坐标系。一旦弄清楚了,我就将NSTextViewCell子类化,并覆盖-drawInteriorWithFrame:inView:函数,以在绘制文本之前旋转坐标系。
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
// Save the current graphics state so we can return to it later
NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];
// Create an object that will allow us to shift the origin to the center
NSSize originShift = NSMakeSize(cellFrame.origin.x + cellFrame.size.width / 2.0,
cellFrame.origin.y + cellFrame.size.height / 2.0);
// Rotate the coordinate system
NSAffineTransform* transform = [NSAffineTransform transform];
[transform translateXBy: originShift.width yBy: originShift.height]; // Move origin to center of cell
[transform rotateByDegrees:270]; // Rotate 90 deg CCW
[transform translateXBy: -originShift.width yBy: -originShift.height]; // Move origin back
[transform concat]; // Set the changes to the current NSGraphicsContext
// Create a new frame that matches the cell's position & size in the new coordinate system
NSRect newFrame = NSMakeRect(cellFrame.origin.x-(cellFrame.size.height-cellFrame.size.width)/2,
cellFrame.origin.y+(cellFrame.size.height-cellFrame.size.width)/2,
cellFrame.size.height, cellFrame.size.width);
// Draw the text just like we normally would, but in the new coordinate system
[super drawInteriorWithFrame:newFrame inView:controlView];
// Restore the original coordinate system so that other cells can draw properly
[context restoreGraphicsState];
}
我现在有一个NSTextCell可以横向绘制其内容!通过更改行高,我可以给它足够的空间来看起来不错。