3

我正在尝试创建一个托盘弹出应用程序,其表格与 Dropbox 在其弹出窗口视图中的表格非常相似。有一个文件表格,当您将鼠标悬停在表格单元格上时,单元格将突出显示并显示其他控件。我不确定 NSTableView 是否适合这个?有人有建议吗?

带有突出显示的单元格的 Dropbox 弹出式表格

4

2 回答 2

7

这将是NSTableView. 使用基于视图的 NSTableView,您将能够轻松地创建这些单元格(视图)的外观。NSTrackingArea如果您使用向表格视图(滚动视图可能更好)添加一个鼠标悬停的突出显示应该可以完成-[NSView addTrackingArea:],它为您提供-mouseMoved:事件回调。通过该方法,您可以使用locationInWindowNSEvent 上的属性,然后使用 NSTableView 的-rowAtPoint:调用来查询您应该更改哪一行以显示悬停事件。

于 2017-09-06T21:06:34.077 回答
0

作为此处可能的修改,我必须执行以下操作才能完成这项工作:

highlightedRow: MyCustomRow?

func viewWillAppear(){
    configureTableHighlight()
}

func configureTableHighlight() {
    let trackingArea = NSTrackingArea(rect: scrollView.frame, options: [.mouseMoved, .activeInKeyWindow, .inVisibleRect], owner: self, userInfo: nil)
    scrollView.addTrackingArea(trackingArea)
}

override func mouseMoved(with event: NSEvent) {
    let pointInTableView = tableView.convert(event.locationInWindow, to: nil)
    let row = tableView.row(at: pointInTableView)
    
    if row == -1 {
        highlightedRow?.highlight = false
        highlightedRow = nil
        return
    }
    
    guard let view = tableView.view(atColumn: 0, row: row, makeIfNecessary: false) as? MyCustomRow else {
        return
    }
    
    if(highlightedRow == view){
        return
    }
    
    view.highlight = true;
    highlightedRow?.highlight = false
    highlightedRow = view;
}

然而,这可能取决于您添加 trackingView 的位置。

附加参考:

NSTableView 的 NSCell 中的鼠标悬停检测?

于 2020-12-07T04:31:54.540 回答