【问题标题】:How to NSTableView cell add padding to cell?如何为 NSTableView 单元格添加填充到单元格?
【发布时间】:2011-11-20 19:36:18
【问题描述】:

我有一个 NSTableView,它在我的窗口上从一个边缘延伸到另一个边缘,但是表格边缘的单元格中的数据确实需要一些填充。如果我在边缘留下排水沟,窗口看起来不太好,所以我想尝试在一些单元格内添加一些填充,这样数据就不会正好靠在边缘。

我在 Interface Builder 或代码文档中找不到任何关于向单元格添加填充或插入的内容。

有什么建议吗?

【问题讨论】:

    标签: xcode macos cocoa xcode4 nstableview


    【解决方案1】:

    您可以继承 NSTextFieldCell 并覆盖 drawInteriorWithFrame:inView: 方法来自定义绘制字符串。

    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    {
        NSRect titleRect = [self titleRectForBounds:cellFrame];
        NSAttributedString *aTitle = [self attributedStringValue];
        if ([aTitle length] > 0) {
            [aTitle drawInRect:titleRect];
        }
    }
    

    其中 titleRectForBounds: 增加了一些空间

    - (NSRect)titleRectForBounds:(NSRect)bounds
    {
        NSRect titleRect = bounds;
    
        titleRect.origin.x += 5;
        titleRect.origin.y += 5;
    
        NSAttributedString *title = [self attributedStringValue];
        if (title) {
            titleRect.size = [title size];
        } else {
            titleRect.size = NSZeroSize;
        }
    
        // We don't want the width of the string going outside the cell's bounds
        CGFloat maxX = NSMaxX(bounds);
        CGFloat maxWidth = maxX - NSMinX(titleRect);
        if (maxWidth < 0) {
            maxWidth = 0;
        }
    
        titleRect.size.width = MIN(NSWidth(titleRect), maxWidth);
    
        return titleRect;
    }
    

    http://comelearncocoawithme.blogspot.com/2011/09/custom-cells-in-nstableview-part-1.html 有一个更完整的示例

    【讨论】:

    • 感谢您提供非常完整的答案。尽管桌面 Cocoa 的每个问题的答案都是“它不会那样做,您需要在子类中覆盖该方法”,但我发现这真的令人沮丧。 iOS/Cocoa Touch 怎么比桌面 Cocoa 成熟多了?
    • 我认为 Cocoa Touch 的完成是因为它不像 Cocoa 那样通用,在控件上放置了更多预定义的行为和策略,以便获得更一致的体验。另一方面,Cocoa 在尝试成为一个更通用的工具包时,有一些可能的东西,你需要编写更多的代码。
    • 您还需要记住,NSTableView 可能是在 10 年或更长时间前编写的,因此需求和 UI 需求随着时间的推移发生了变化。我怀疑这就是为什么 Lion 现在能够将自定义 NSView 作为单元格。至少在 Cocoa 中,当你需要覆盖一个行为时,这通常是一件很简单的事情
    【解决方案2】:

    简单方法:在文本字符串前添加空格。 更好的方法:在单元格中嵌入一个视图,并将所有其他 UI 对象放入其中。

    【讨论】:

    • 添加空格是我尝试的第一件事。 NSTableView 似乎修剪了字符串,在实际显示之前删除了所有前导和尾随空格,因为如果我添加 @" ",它不会显示,但如果我附加 @"_" 它会显示。
    • 我已经成功地使用了类似@"text"的东西,所以在文本起作用之前猜猜空格?顺便说一句,这些技巧适用于简单的情况。对于更复杂的布局,我使用 Interface Builder 创建了一个 XIB,并基于它创建了一个单元格。更容易进行布局更改。对不起,我忘了这件事,昨晚很晚。
    【解决方案3】:

    在你的 cellforrowAtIndexPath 中你需要实现这个。

    cell.textLabel.text = [NSString stringWithFormat:@" %@",sometext];

    否则 取一个标签并为其设置框架。然后将其添加到单元格

    【讨论】:

    • 添加空格是我尝试的第一件事。 NSTableView 似乎修剪了字符串,在实际显示之前删除了所有前导和尾随空格,因为如果我添加 @" ",它不会显示,但如果我附加 @"_" 它会显示。
    • 另外,我正在处理 NSTableView,而不是 UITableView。这是桌面 Cocoa,而不是 iPhone 上的 Cocoa Touch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多