【问题标题】:NSGridView custom view intrinsic sizeNSGridView 自定义视图固有大小
【发布时间】:2020-07-31 01:19:56
【问题描述】:

我正在构建一个简单的 NSGridView,并希望将自定义 NSView 作为网格的每个元素。最终,每个 NSView 都将是一个以 NSView 为中心的基于 xib 的标签 (NSTextField)。 我遇到的问题是 NSView 的内在大小。我想定义 NSView 的大小并在此基础上进行自动布局工作。我将此代码添加到自定义视图(labelView):

override var intrinsicContentSize: NSSize {
    return NSSize(width:100, height:100);
};

它确实被称为;但显然被忽略了。作为测试,我在同一行上有一些其他标签,并且该行的高度始终设置为最大的行文本高度(包括自定义视图中的标签);但长度设置为最长的列文本字段,忽略自定义视图中的标签。无论如何,我想任意使 NSView 具有一定的高度和长度,就像我尝试(但失败)使用intrinsicContentSize 一样。

NSStackview 似乎做对了;但 NSGridView 没有。

我可以用

强制特定列的宽度
    grid.column(at:0).width = 400;

但我真正想做的是定义 NSView 的大小,并让自动布局将其用作构建块。

这让我觉得这是一个概念错误,所以如果有人能解释这些 NSGridView-autolayout-NSView 的细微之处,我想很多人可能会受益。

【问题讨论】:

  • 你是新来的 swift.. 你不需要;,你试过grid.invalidateIntrinsicContentSize 吗?
  • 我做了,但我可能没有正确使用它。我发现在intrinsicContentSize中尊重宽度,而不是高度;并且 label.heightAnchor 受到尊重,但 label.widthAnchor:
  • override var intrinsicContentSize: NSSize{ invalidateIntrinsicContentSize() return NSSize(width:390,height: 200) // 200 can be anything, no change }; mainLabel.widthAnchor.constraint(equalToConstant: 430.0).isActive = true // does nothing
  • 刚刚再次阅读了有关网格视图的信息,可能会将您引向错误的方向。您实际上是否明确定义了 NSGridRow 高度和 NSGridColumn 宽度,它定义了 UIView 嵌套的单元格大小?还是您想坚持可以像在 iOS 上一样拥有 CollectionView 的想法?
  • 什么是网格视图的yPlacement

标签: swift macos nsview nsgridview


【解决方案1】:

我遇到了完全相同的问题,尝试在 NSGridView 中使用自定义 NSView,但无法让它们正确绘制。最终对我有用的是设置以下内容:

let gridSize = 5
let cellSize: CGFloat = 50

gridView.xPlacement = .fill // this was key part of the solution
gridView.yPlacement = .fill

for i in 0 ..< gridSize {
    gridView.row(at: i).height = cellSize
    gridView.column(at: i).width = cellSize
}

请注意,我使用 NSGridView 的行高和列宽设置每个单元格的大小,而不是使用 NSView 大小,但这是我让它工作的唯一方法。

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多