首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有使用自动布局的动态宽度项目的NSCollectionView

具有使用自动布局的动态宽度项目的NSCollectionView
EN

Stack Overflow用户
提问于 2020-12-30 14:54:02
回答 1查看 128关注 0票数 1

我正在构建一个NSCollectionView,它可以水平滚动显示如下所示的项目:

我在带有自动布局约束的.xib中定义了我的NSCollectionView项。项目的宽度由标签的宽度加上计数标签(及其周围的药丸)的宽度定义。所有这些都封装在一个名为“Box”的NSView中。

以下是Box的约束:

我已经连接了我的数据源,一切看起来都很好,除了我不能让项目的宽度根据其中视图的大小进行更改。

根据我所读到的,我不能仅仅依靠自动布局来定义这里的大小(我希望我错了),就像我在NSTableView中定义动态高度一样。因此,我尝试使用NSCollectionViewDelegateFlowLayout中的sizeForItemAt委托方法来计算大小

代码语言:javascript
复制
func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
  let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "PhaseItem"), for: indexPath) as! PhaseItem
    
  return item.box.fittingSize
}

当我将fittingSize打印到控制台时,它看起来是正确的。但是我得到了一个与Box的大小相关的Unable to simultaneously satisfy constraints崩溃(它有一个RoundedWrap的子类):

代码语言:javascript
复制
"<NSLayoutConstraint:0x6000033c3890 H:|-(11)-[NSTextField:0x7ff6abf6e9f0]   (active, names: '|':Avid.RoundedWrap:0x7ff6abf74840 )>",
"<NSLayoutConstraint:0x6000033c6300 H:[NSTextField:0x7ff6abf6e9f0]-(7)-[Avid.BadgeView:0x7ff6abf6f120]   (active)>",
"<NSLayoutConstraint:0x6000033c5400 H:[Avid.BadgeView:0x7ff6abf6f120]-(9)-|   (active, names: '|':Avid.RoundedWrap:0x7ff6abf74840 )>",
"<NSLayoutConstraint:0x6000033c39d0 H:|-(8)-[NSTextField:0x7ff6abf6f360]   (active, names: '|':Avid.BadgeView:0x7ff6abf6f120 )>",
"<NSLayoutConstraint:0x6000033c2760 H:[NSTextField:0x7ff6abf6f360]-(8)-|   (active, names: '|':Avid.BadgeView:0x7ff6abf6f120 )>",
"<NSLayoutConstraint:0x6000033c3a20 H:|-(0)-[Avid.RoundedWrap:0x7ff6abf74840]   (active, names: '|':NSView:0x7ff6abf74a80 )>",
"<NSLayoutConstraint:0x6000033c3b60 H:[Avid.RoundedWrap:0x7ff6abf74840]-(0)-|   (active, names: '|':NSView:0x7ff6abf74a80 )>",
"<NSAutoresizingMaskLayoutConstraint:0x6000033140f0 h=--& v=--& NSView:0x7ff6abf74a80.width == 0   (active)>"

如果我删除了将盒子的尾部边缘固定到包含视图的约束,那么崩溃就会消失,但是我的NSCollectionView项根本不会出现。

有没有更简单的方法来完成这一切?如何使用自动布局来设置NSCollectionViewItem%s的动态宽度?

EN

回答 1

Stack Overflow用户

发布于 2020-12-31 06:25:43

看起来我是在正确的轨道上。我只需要补充一下:

代码语言:javascript
复制
item.view.layoutSubtreeIfNeeded()

像这样

代码语言:javascript
复制
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
  ///...
  item.view.layoutSubtreeIfNeeded()
  return item
}

为了使项目大小准确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65503184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档