以编程方式将 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
以控制每个视图在其父视图更改时如何更改大小和位置。
我有一个 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
以控制每个视图在其父视图更改时如何更改大小和位置。