вертикально выравнивание текста в nstableview row
-
21-09-2019 - |
Вопрос
У меня небольшая проблема с nstableView. Когда я увеличиваю высоту ряда в таблице, текст в нем выровнен в вершине ряда, но я хочу выровнять его вертикально центрированным!
Кто -нибудь может предложить мне какой -нибудь способ сделать это ??
Спасибо,
Мираадж
Решение
Это простое решение для кода, которое показывает подклассы, который вы можете использовать для среднего выравнивания текстового полета.
Заголовок
#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
Эта запись в блоге Показывает альтернативное решение, которое также работает хорошо.
Другие советы
Вот быстрая версия строительства кода на ответе выше:
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)
}
}
Затем я установил высоту высоты таблицы в NSTABLEVIEW:
func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat
{
return 30
}
Установите класс NSTEXTFIELDCELL на вертикцентрированный текст:
и высота TableViewCell
Спасибо, Брайан, за вашу помощь.
@Ответ Iphaaw обновлен для Swift 4 (примечание я также добавил «ячейку» в конце имени класса для ясности, которая также должна соответствовать имени класса в интерфейсном строителе):
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)
}
}
Даже если это очень старый вопрос с принятым ответом, вот альтернативное решение:
Зайдите в IB, выберите свой NSTEXTFIELD, сидящий в NSTABLECELLVIEW и добавьте новое ограничение «Центр вертикально в контейнере». Вы также должны добавить горизонтальные ограничения (которые, вероятно, должны быть ведущими/следственными пространством, установленным в 0, или что -либо, что соответствует вашим потребностям).
Использовал это в nsoutlineview и работал как очарование. Производительность не была проблемой в моем случае, так как у меня не было много ячеек, но я ожидаю, что это не хуже, чем вручную расчета размеров.