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