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

时间:2015-06-19 19:13:57

标签: objective-c macos swift nstableview

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

非常感谢任何有关如何在所有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(){($0 as! String) < ($1 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
}

1 个答案:

答案 0 :(得分:0)

您有两个基本选项:使用自动布局或使用旧式弹簧和支柱(自动调整遮罩)。

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

例如,您的文本字段重叠,一个右对齐。你应该安排他们并排,而不是。你可以这样做:

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,以控制每个视图的大小和位置随其超级视图的变化而变化。