滚动NSTableView以使行居中

时间:2012-08-01 21:04:12

标签: objective-c cocoa

我想以编程方式滚动NSTableView,以便特定行居中。滚动NSTableView以使特定行可见是很简单的:

[theTableView scrollRowToVisible:pos];

然而,通常所讨论的行位于可见区域的底部,而我希望它大致位于中心。

另一种愚蠢的方法是滚动几行,超出我想要显示的行,例如:

    // pos = index of desired row
    // numRows = number of rows in the table
    NSRect visibleRect = [resultsTableView visibleRect];
    NSRange visibleRange = [resultsTableView rowsInRect:visibleRect];
    NSUInteger offset = visibleRange.length/2;
    NSUInteger i;
    if (pos + offset >= numRows)
        i = numRows - 1;
    else if (pos < visibleRange.length)
        i = pos;
    else
        i = pos + offset;
    [resultsTableView scrollRowToVisible:i];

如果所有行的高度完全相同,则此方法有效,但我有兴趣制作不同高度的行。

有更好的,也许更直接的方式吗?例如,我注意到NSTableView包含在NSScrollView中....(该表是使用Interface Builder制作的。)

谢谢!

5 个答案:

答案 0 :(得分:3)

这适用于我的NSTableView

的子类
self.tableView.scrollRowToVisible(self.tableView.selectedRow, animated:true)

然后你可以打电话:

tf.nn.softmax_cross_entropy_with_logits

选择行

答案 1 :(得分:1)

我会看看NSView的{​​{1}}和-scrollPoint:方法。尝试做类似的事情:

-scrollRectToVisible:

我不确定这是否有效,因为我无法测试,请告诉我。

答案 2 :(得分:0)

这对我有用.. https://stackoverflow.com/a/8480325/804616
但您可能希望根据视图是否已经可见来有条件地调用代码。

答案 3 :(得分:0)

我在OBJC上的解决方案。

            NSRect row = [self.tableView rectOfRow:index];
        if ((row.origin.y + row.size.height) < self.scrollView.frame.size.height / 2)
            return;
        row.size.height = self.scrollView.frame.size.height;
        row.origin.y -= self.scrollView.frame.size.height / 2;
        row.origin.y += row.size.height;
        [self.tableView scrollPoint:row.origin];

答案 4 :(得分:0)

我在寻找Swift 4中的解决方案时偶然发现了这个问题(感谢@AntoniodePerio提供了我移植的答案):

extension NSTableView {
    func centreRow(row: Int, animated: Bool) {
        self.selectRowIndexes(IndexSet.init(integer: row), byExtendingSelection: false)
        let rowRect = self.frameOfCell(atColumn: 0, row: row)
        if let scrollView = self.enclosingScrollView {
            let centredPoint = NSMakePoint(0.0, rowRect.origin.y + (rowRect.size.height / 2) - ((scrollView.frame.size.height) / 2))
            if animated {
                scrollView.contentView.animator().setBoundsOrigin(centredPoint)
            } else {
                self.scroll(centredPoint)
            }
        }
    }
}

致电:

@IBOutlet weak var myTable: NSTableView! myTable.centreRow(row: 10, animated: true)