以编程方式将 NSTableCellView 和子视图设置为具有动态宽度

Set NSTableCellView and subviews to have dynamic width programmatically

我有一个 NSTableView,其单元格包含各种 NSTextFields 和 NSProgressIndicators。我以编程方式设置单元格,并以编程方式控制它们的行为。我实现单元格的方式基本上使我无法使用 Interface Builder。一切都很好,除了当我调整 NSWindow 的大小时,我的 NSTableView 中的所有 NSTableCells 和它们的子视图不会将它们的宽度调整为等于它们包含在 table 中的宽度。

非常感谢任何有关如何为所有 NSTableView 的子视图实现宽度动态变化的建议。

这是我创建单元格的代码:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {

    var data = NSMutableDictionary()
    data = xloadData(data)
    if data.count == 0 {
        data.setObject((homeDir + "/Library/Messages/Attachments"), forKey: "Message Attachments")
        data.setObject((homeDir + "/Library/Caches"), forKey: "Application Caches")
        xsaveData(data)
    }
    let array: NSArray = data.allKeys.sorted(){([=10=] as! String) < ( as! String)}
    let mainview = NSTableCellView(frame: NSRect(x: 0, y: 0, width: tableView.frame.width, height: 48))
    mainview.identifier = "sx"
    let keyName = NSTextField(frame: NSRect(x: 0, y: 20, width: tableView.frame.width, height: 28))
        keyName.bezeled = false
        keyName.drawsBackground = false
        keyName.editable = false
        keyName.selectable = false
        keyName.font = NSFont(name: "HelveticaNeue-Thin", size: 17)
        keyName.textColor = NSColor(hexColorCode: "#F3F3F3")
        keyName.stringValue = array.objectAtIndex(row) as! String

    //Calculate sizes
    let val: String = valueFromKey(data, key: keyName.stringValue)
    let size: Double = sizeDict.objectForKey(val) as! Double
    let totalSize: Double = sizeDict.objectForKey("total") as! Double
    var progRatio: Double = 0
    if totalSize != 0 {
        progRatio = (size / totalSize) * 100
    }

    let sizeInfo = NSTextField(frame: NSRect(x: 0, y: 20, width: tableView.frame.width - 5, height: 28))
        sizeInfo.bezeled = false
        sizeInfo.drawsBackground = false
        sizeInfo.editable = false
        sizeInfo.selectable = false
        sizeInfo.font = NSFont(name: "HelveticaNeue-Thin", size: 16)
        sizeInfo.textColor = NSColor(hexColorCode: "#F3F3F3")
        sizeInfo.alignment = NSTextAlignment.RightTextAlignment
        sizeInfo.stringValue = "\(convertBytes(size)) / \(totalSize)"

    var progAsset = NSProgressIndicator(frame: NSRect(x: 0, y: 0, width: tableView.frame.width - 5, height: 20))
        progAsset.indeterminate = false
        progAsset.doubleValue = progRatio

    mainview.addSubview(keyName)
    mainview.addSubview(sizeInfo)
    mainview.addSubview(progAsset)

    return mainview
}

您有两个基本选项:使用自动布局或使用旧式弹簧和 struts(自动调整蒙版)。

对于自动布局,您将创建约束以将单元格视图内的视图与单元格视图(它们的父视图)相关联。它们也可能相互关联。

例如,您的文本字段重叠,其中一个右对齐。相反,您应该安排它们并排放置。你可以这样做:

keyName.setContentHuggingPriority(NSLayoutPriority(250),
                                  forOrientation:.Horizontal)
keyName.setContentCompressionResistancePriority(NSLayoutPriority(750),
                                                forOrientation:.Horizontal)
sizeInfo.setContentHuggingPriority(NSLayoutPriority(251),
                                   forOrientation:.Horizontal)
sizeInfo.setContentCompressionResistancePriority(NSLayoutPriority(751),
                                                 forOrientation:.Horizontal)
let views = ["keyName": keyName, "sizeInfo": sizeInfo]
var constraints = NSLayoutConstraint.constraintsWithVisualFormat("|[keyName][sizeInfo]-(5)-|",
                                                                 options:[.AlignAllBaseline],
                                                                 metrics:nil,
                                                                 views:views)
NSLayoutConstraint.activateConstraints(constraints)

等您还需要进度指示器的水平约束和垂直约束。

另一种方法是为每个视图设置 autoresizingMask 以控制每个视图在其父视图更改时如何更改大小和位置。