【问题标题】:NSCollectionView Auto-Resize Subview with Auto-LayoutNSCollectionView 使用自动布局自动调整子视图大小
【发布时间】:2014-01-08 15:29:43
【问题描述】:

我正在尝试实现简单 NSView 的堆叠排列,为此我使用绑定到 Dictionary Controller 的 NSCollectionView。我到目前为止的结果如下:

左侧的标签绑定到控制器项键,SegmentedControl selectedIndex 绑定到项值。

问题是,我不知道如何强制 NSCollectionView 中的子视图符合容器宽度;发生的情况是,它们保持自己的宽度,当 NSCollectionView 变得太窄时,会出现水平滚动条,如下所示:

我知道this question(以及“反向”this one),老实说,除了琐碎的事情之外,我从来没有过多地使用过自动布局。我想知道,凭借 AutoLayout 带来的所有幻想,有没有一种方法可以在不诉诸编码和使用事件/通知的情况下处理这个问题? (我知道观察 NSViewFrameDidChangeNotification 是一种替代方法,对吧?)

谢谢

【问题讨论】:

  • 你能让这个工作吗?我想知道 IB 是否有办法做到这一点。

标签: objective-c cocoa autolayout nscollectionview


【解决方案1】:

刚刚做了一些非常相似的事情——除了使用NSSplitView 子类——所以如果我正确理解了你的问题,你会想要为子视图设置约束以附加到你的超级视图的两侧,如下所示:

NSDictionary * viewsDict = NSDictionaryOfVariableBindings(filler);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filler]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewsDict]];

您可能还需要调整子视图的 Content Compression Resistance Priority 参数才能达到预期的效果。

另请注意,当专门针对 OS X 10.9 时,会有新的 NSStackView 类:

"NSStackView 是 OS X 10.9 中的一个新类。它用于使用自动布局对视图的水平或垂直堆栈进行布局。从堆栈视图中添加和删除视图时,将自动创建和修改必要的约束保持一个有凝聚力的布局。"

【讨论】:

  • 感谢您的回答。我完全忘了提到我正在使用绑定(编辑过的问题),这就是我想继续使用 NSCollectionView 的原因之一(它真的很容易使用)。我对 Content Compression Resistance Priority 进行了一些尝试,将其设置为较低的值(here 所述),但没有任何改变……对于 CollectionView 的孩子来说,似乎适用不同的规则?
  • 有没有办法从 IB 进行设置?
【解决方案2】:

解决方案其实很简单:切换到基于视图的NSTableViewNSCollectionView 不适用于问题中描述的用途。使用NSTableView,您可以在默认情况下免费获得调整大小的行为。

无论您使用的是绑定还是数据源,它都有效,这并不重要。

【讨论】:

  • 我的意思是 iOS self.tableView.rowHeight = UITableViewAutomaticDimension;。 macOS 有什么替代品吗?
  • 嗯,你要问的是一个完全不同的野兽。我建议特别要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多