15

我对 NSTableView 有一个小问题。当我在表格中增加一行的高度时,其中的文本在行的顶部对齐,但我想将它垂直居中对齐!

任何人都可以建议我任何方法吗?

谢谢,

米拉杰

4

5 回答 5

21

这是一个简单的代码解决方案,它显示了一个可用于中间对齐 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

此博客条目显示了一个也很有效的替代解决方案。

于 2010-01-20T16:46:15.950 回答
8

这是基于上述答案构建的代码的 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)
    }
}

然后我在NSTableView中设置tableView heightOfRow的高度:

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

将 NSTextFieldCell 的类设置为 VerticallyCenteredTextField:

在此处输入图像描述

和 TableViewCell 的高度

在此处输入图像描述

在此处输入图像描述

感谢布莱恩的帮助。

于 2015-06-28T09:12:10.057 回答
2

即使这是一个非常古老的问题,但有一个公认的答案,这里有一个替代解决方案:

进入 IB,选择位于 NSTableCellView 中的 NSTextField 并添加一个新的“Center Vertically in Container”约束。您还应该添加水平约束(可能应该将前导/尾随空格设置为 0 或任何适合您的需要)。

在 NSOutlineView 中使用它并像魅力一样工作。就我而言,性能不是问题,因为我没有很多单元格,但我希望它不会比手动计算大小差。

于 2018-12-26T21:25:37.343 回答
0

@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)
    }
}
于 2018-02-13T01:34:09.180 回答
0

对于某些属性字符串(例如,带有上标),仅绘制属性字符串可能会产生奇怪的结果。

我建议在 drawInterior 中 调用super …</p>

  override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
    super.drawInterior(withFrame: self.titleRect(forBounds: cellFrame), in: controlView)
}
于 2021-08-11T16:35:03.283 回答