2012-08-01 50 views
3

我想以編程方式滾動NSTableView,使特定的行居中。它的簡單滾動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

我有同樣的問題,我想知道爲什麼這不是在API中的選項! – trss 2012-08-23 19:22:34

回答

1

我會看看NSView-scrollPoint:-scrollRectToVisible:方法。嘗試做類似:

if (tableView.mainScrollView) { 
    CGFloat yLocation = row.frame.origin.y + tableView.mainScrollView.contentView.frame.size.height/2; 
    if (yLocation > tableView.frame.size.height) yLocation = tableView.frame.size.height; 
    NSPoint rowPoint = NSMakePoint(0, row.frame.origin.y +); 
    [tableView scrollPoint:rowPoint]; 
} 

我不確定這是否正常,因爲我無法測試它,請告訴我。

1

這對我的作品的一個子類的NSTableView的

func scrollRowToVisible(row: Int, animated: Bool) { 

     if(animated){ 


      let rowRect = self.rectOfRow(row) 
      var scrollOrigin = rowRect.origin 
      let clipView = self.superview as? NSClipView 

      let tableHalfHeight = NSHeight(clipView!.frame)*0.5 
      let rowRectHalfHeight = NSHeight(rowRect)*0.5 

      scrollOrigin.y = (scrollOrigin.y - tableHalfHeight) + rowRectHalfHeight 
      let scrollView = clipView!.superview as? NSScrollView 

      if(scrollView!.respondsToSelector(#selector(NSScrollView.flashScrollers))){ 
       scrollView!.flashScrollers() 
      } 

      clipView!.animator().setBoundsOrigin(scrollOrigin) 

     } else { 

      self.scrollRowToVisible(row) 
     } 

    } 

那麼您可以撥打:

self.tableView.scrollRowToVisible(self.tableView.selectedRow, animated:true) 

您所選擇的行

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]; 
0

我無意中發現了這個問題,同時尋找在斯威夫特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)