我想以编程方式滚动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制作的。)
谢谢!
答案 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)