Способ реализовать боковой NSTextFieldCell? - PullRequest
0 голосов
/ 29 июня 2010

У меня в приложении есть NSTableView с данными, которые рисуются для обеих осей X и Y (т. Е. Каждая строка сопоставляется с каждым столбцом). У меня есть данные, заполняющие ячейки так, как мне хотелось быно это выглядит ужасно с горизонтально растянутыми столбцами.

Я бы хотел повернуть NSTextFieldCell на бок, чтобы текст записывался вертикально, а не горизонтально.Я понимаю, что мне, вероятно, придется создать подкласс NSTextFieldCell, но я не уверен, какие функции мне нужно переопределить, чтобы выполнить то, что я хочу сделать.

Какие функции вNSTextFieldCell нарисовать сам текст?Есть ли какой-нибудь встроенный способ рисовать текст вертикально, а не горизонтально?

1 Ответ

1 голос
/ 01 июля 2010

Что ж, потребовалось много копаний, чтобы понять это, но в конце концов я наткнулся на объект 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, который рисует его содержимое вбок! Изменяя высоту строки, я могу дать ей достаточно места, чтобы хорошо выглядеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...