вертикальное выравнивание текста в строке NSTableView

У меня небольшая проблема с NSTableView. Когда я увеличиваю высоту строки в таблице, текст в ней выравнивается по верхней части строки, но я хочу выровнять его по центру по вертикали!

Может ли кто-нибудь предложить мне какой-либо способ сделать это ??

Спасибо,

Мирадж


person Devarshi    schedule 20.01.2010    source источник


Ответы (4)


Это простое кодовое решение, показывающее подкласс, который можно использовать для выравнивания TextFieldCell по середине.

заголовок

#import <Cocoa/Cocoa.h>


@interface MiddleAlignedTextFieldCell : NSTextFieldCell {

}

@end

код

@implementation MiddleAlignedTextFieldCell

- (NSRect)titleRectForBounds:(NSRect)theRect {
    NSRect titleFrame = [super titleRectForBounds:theRect];
    NSSize titleSize = [[self attributedStringValue] size];
    titleFrame.origin.y = theRect.origin.y - .5 + (theRect.size.height - titleSize.height) / 2.0;
    return titleFrame;
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSRect titleRect = [self titleRectForBounds:cellFrame];
    [[self attributedStringValue] drawInRect:titleRect];
}

@end

Эта запись в блоге показывает альтернативное решение это тоже хорошо работает.

person Bryan McLemore    schedule 20.01.2010
comment
size предполагает бесконечную ширину — он не учитывает перенос строк. Вместо этого я предлагаю boundingRectForSize:options: с размером от cellFrame. - person Peter Hosey; 20.01.2010

Вот версия кода для Swift, основанная на ответе выше:

import Foundation
import Cocoa

class VerticallyCenteredTextField : NSTextFieldCell
{

    override func titleRectForBounds(theRect: NSRect) -> NSRect
    {
        var titleFrame = super.titleRectForBounds(theRect)
        var titleSize = self.attributedStringValue.size
        titleFrame.origin.y = theRect.origin.y - 1.0 + (theRect.size.height - titleSize.height) / 2.0
        return titleFrame
    }

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        var titleRect = self.titleRectForBounds(cellFrame)

        self.attributedStringValue.drawInRect(titleRect)
    }
}

Затем я устанавливаю высоту tableView heightOfRow в NSTableView:

func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat
{
    return 30
}

Установите класс NSTextFieldCell как VerticalCenteredTextField:

введите здесь описание изображения

и высота TableViewCell

введите здесь описание изображения

введите здесь описание изображения

Спасибо Брайан за вашу помощь.

person iphaaw    schedule 28.06.2015

Даже если это очень старый вопрос с принятым ответом, вот альтернативное решение:

Зайдите в IB, выберите свой NSTextField, находящийся в NSTableCellView, и добавьте новое ограничение «Центрировать по вертикали в контейнере». Вы также должны добавить горизонтальные ограничения (которые, вероятно, должны быть начальным/конечным пробелом, установленным на 0 или что-то еще, что соответствует вашим потребностям).

Использовал это в NSOutlineView и работал как шарм. В моем случае производительность не была проблемой, так как у меня было не так много ячеек, но я ожидаю, что это не хуже, чем вычисление размеров вручную.

person CatalinM    schedule 26.12.2018

Ответ @iphaaw обновлен для Swift 4 (обратите внимание, что я также добавил «Cell» в конце имени класса для ясности, что также должно соответствовать имени класса в Interface Builder):

import Foundation
import Cocoa

class VerticallyCenteredTextFieldCell : NSTextFieldCell {
    override func titleRect(forBounds theRect: NSRect) -> NSRect {
        var titleFrame = super.titleRect(forBounds: theRect)
        let titleSize = self.attributedStringValue.size
        titleFrame.origin.y = theRect.origin.y - 1.0 + (theRect.size.height - titleSize().height) / 2.0
        return titleFrame
    }

    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
        let titleRect = self.titleRect(forBounds: cellFrame)
        self.attributedStringValue.draw(in: titleRect)
    }
}
person Ben Stahl    schedule 13.02.2018