我对 NSTableView 有一个小问题。当我在表格中增加一行的高度时,其中的文本在行的顶部对齐,但我想将它垂直居中对齐!
任何人都可以建议我任何方法吗?
谢谢,
米拉杰
我对 NSTableView 有一个小问题。当我在表格中增加一行的高度时,其中的文本在行的顶部对齐,但我想将它垂直居中对齐!
任何人都可以建议我任何方法吗?
谢谢,
米拉杰
这是一个简单的代码解决方案,它显示了一个可用于中间对齐 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
此博客条目显示了一个也很有效的替代解决方案。
这是基于上述答案构建的代码的 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 的高度
感谢布莱恩的帮助。
即使这是一个非常古老的问题,但有一个公认的答案,这里有一个替代解决方案:
进入 IB,选择位于 NSTableCellView 中的 NSTextField 并添加一个新的“Center Vertically in Container”约束。您还应该添加水平约束(可能应该将前导/尾随空格设置为 0 或任何适合您的需要)。
在 NSOutlineView 中使用它并像魅力一样工作。就我而言,性能不是问题,因为我没有很多单元格,但我希望它不会比手动计算大小差。
@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)
}
}
对于某些属性字符串(例如,带有上标),仅绘制属性字符串可能会产生奇怪的结果。
我建议在 drawInterior 中 调用super …</p>
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
super.drawInterior(withFrame: self.titleRect(forBounds: cellFrame), in: controlView)
}