我的应用程序中有一个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可以横向绘制其内容!通过更改行高,我可以给它足够的空间来看起来不错。

10-05 19:38