问题标签 [nscollectionviewlayout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
153 浏览

swift - 约束 preferredLayoutAttributes 宽度

我使用UICollectionViewLayout与 Trello 类似的固定列和垂直增长项目的自定义子类。每个项目基本上都是一个包含几个垂直堆叠标签的视图。

目前我观察到的是shouldInvalidateLayout(forPreferredLayoutAttributes:)使用自动布局大小计算的调用,但大小相当fittingSize

我想知道是否有任何方法可以限制preferredLayoutAttributes宽度,因为我有固定宽度的列,让它为我计算高度?

0 投票
1 回答
355 浏览

cocoa - 如何在边界更改时为 NSCollectionViewLayout 的重新布局设置动画?

我有一个NSCollectionViewLayout非常相似的基本实现NSCollectionViewFlowLayout

它将项目放置在水平行中。如果没有足够的空间,则将下一个项目添加到下一行,依此类推。

我的问题:当一个项目从第一行移动到第二行时,如何为布局更改设置动画?

这是一个例子:

重新布局

注意项目#3 如何从第一行“跳跃”到第二行。我想为这种变化制作动画。

有很多方法可以动画添加/删除项目,但我无法弄清楚如何在没有项目更改时为布局更改设置动画。

0 投票
1 回答
339 浏览

macos - 在自定义 NSCollectionViewLayout 子类上未调用 invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)

链接到相关示例项目

描述

我正在尝试创建一个自定义NSCollectionViewLayout子类,该子类使用自动布局来确定其项目的大小。这种布局从上到下定位项目,其中所有项目共享相同的宽度,但每个项目的高度由其内容决定。将其视为UITableViewmacOS 的布局。

假设

初始布局属性在布局的prepare()方法中计算,并通过 layoutAttributesForElements(in:). 集合视图使用这些属性来确定需要显示哪些项目。这些项目由集合视图的委托提供,并apply(_:)调用每个项目的方法来设置其视图属性。

然后集合视图将调用项目的preferredLayoutAttributesFitting(_:)方法来计算其内容的合适大小。然后返回的属性将被传递到集合视图布局的shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)方法中,其中布局确定是否需要进行调整以响应新属性,并将该布尔决策返回给集合视图。

如果布局决定它需要失效,然后集合视图将调用invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)以从布局中获取特定信息,以了解它应该如何自我更新。然后当集合视图调用invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)时,布局可以应用这些更改。

然后重复这个过程,直到shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)返回false每个布局项——提示集合视图在屏幕上显示这些项。

前提

ListLayout子类NSCollectionViewLayout能够为每个NSCollectionViewItem具有“估计”初始高度的10点创建一组初始布局属性。我们期望使用自动布局来确定每个项目的实际高度,所以这个初始值应该无关紧要。

然后,布局能够通过 提供正确的这些初始属性集layoutAttributesForElements(in:)

TextFieldItem子类NSCollectionViewItem包含一个NSTextField实例,该实例同时设置为它的viewtextField属性。此视图的translatesAutoresizingMaskIntoConstraints属性设置为 false,并且具有所需的垂直内容压缩阻力优先级。覆盖项目的apply(_:)方法以将文本字段preferredMaxLayoutWidth设置为给定属性提供的宽度。覆盖项的preferredLayoutAttributesFitting(_:)方法以将首选属性的高度设置为等于文本字段的intrinsicContentSize属性。

集合视图提供了TextFieldItem填充多行文本的实例。

预计每个方法TextFieldItem都会在其preferredLayoutAttributesFitting(_:)方法之后apply(_:)调用,然后调用布局shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)方法。

但是,在操场运行时,都不会调用preferredLayoutAttributesFitting(_:), nor shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:), nor 。invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)结果,每个项目的高度都保持在最初的“估计”高度。

每个文本字段应显示三行文本,但只有第一行的顶部可见。

问题

一定有我遗漏的东西NSCollectionViewLayout和自动布局,但我在文档中没有找到任何表明这一点的东西。

我尝试在集合视图生命周期的各个不同点手动调用这些方法,但没有任何方法能够正确触发布局以调整其计算属性。

是否需要在集合视图、其布局或指示preferredLayoutAttributesFitting(_:)应调用的项目上设置属性?自动布局是否仅支持 和 的子NSCollectionViewFlowLayoutNSCollectionViewGridLayout?还是我误解了NSCollectionViewLayout实例的生命周期?

0 投票
1 回答
246 浏览

swift - Swift NSCollectionView 从下到上流程

我正在开发一个用 Swift 编写的 macOS 消息传递客户端。我使用带有 NSCollectionView 的 NSScrollView 作为 documentView 来呈现消息。目前,我已经实现了无限滚动,但现在的问题是 collectionView 从顶部开始加载单元格并向下工作——这是 NSCollectionView 的默认行为。相反,我需要它从底部开始并向上工作——典型的消息传递应用程序显示消息的方式。

我尝试过的解决方案:

  • 加载视图或用户选择不同的对话后,立即滚动到 collectionView 的底部。这个解决方案明显很笨拙,并且真的搞砸了无限滚动。
  • 覆盖scrollView、scrollView的contentView和collectionView中的isFlipped变量。这样做对任何视图的可见影响为零。
  • 以 pi 弧度旋转整个 scrollView、collectionView、contentView 或 collectionView 单元格。作为一个绝望的措施,我试图旋转整个 scrollView 并且无法做到这一点,也无法旋转任何 collectionView 项目。我做了一些类似的事情wantsLayer = true layer!.setAffineTransform(CGAffineTransform(rotationAngle: .pi)) updateLayer() setNeedsDisplay(frameRect)。这再次没有明显的影响。

让 NSCollectionView 从下到上的最佳方法是什么?顺便说一句,我没有使用故事板。

0 投票
0 回答
254 浏览

nscollectionview - NSCollectionView 作为 NSCollectionViewItem

这是我想要实现的窗口: 实现窗口 它是一个以 NSCollectionView (RedCollectionView) 作为视图的 NSViewController (RedViewController)。
它的项目 (BlueItem) 有一个 NSCollectionView (BlueCollectionView) 作为视图。
它的项目(GreenItem),有一个NSImageView(GreenImageView)作为视图。
RedCollectionView 将垂直滚动,并且其项目将是可选的。但是,BlueCollectionView 仅用于显示,它不会自行滚动并且无法选择。
这是 AppDelegate 的代码:

这是 RedViewController 的代码:

这是 BlueItem 的代码:

最后是 GreenItem 的代码:

当我启动应用程序时,我得到了这个结果: 所以我有 3 个问题: 1. 带有 BlueCollectionView 的 BlueItem 没有得到预期的蓝色背景。 2. BlueCollectionView 流布局尝试在第一行显示所有项目。看起来它不知道集合视图的大小。 3. 当我尝试选择一个BlueItem 时:如果我点击BlueItem 内的空白区域,RedCollectionView 委托会按预期触发,但如果我点击BlueItem 内的绿色部分,则不会触发RedCollectionView 委托。应用截图




0 投票
1 回答
232 浏览

swift - NSCollectionView 项目间间隙指示器的高度错误

我正在为 macOS 实现一个应用程序,在该应用程序中我使用 anNSCollectionView作为一种时间线。为此,我使用自定义子类,NSCollectionViewFlowLayout原因如下:

  1. 我希望项目只能水平滚动而不换行到下一行
  2. 只有NSCollectionViewFlowLayout似乎能够告诉NSCollectionView不要垂直滚动(来自这里的灵感)

然而,所有这些工作都很顺利:我现在正在尝试实现项目的拖放重新排序。这也有效,但我注意到项目间差距指示器(蓝线)没有正确显示,即使我确实返回了正确的尺寸。我计算它们如下:

根据文档,indexPath传递给该方法的值可以介于 0 和集合视图中的项目数之间,包括我们是否试图在最后一个项目之后删除。如您所见,我为项目间间隙指示器返回了一个矩形,该矩形应为 3 像素宽且与项目的高度相同。

虽然指示器以正确的宽度显示在正确的 x 位置,但无论我传入什么高度,它都只有 2 个像素高。

我该如何解决?

注意:如果我暂时将布局更改为NSCollectionViewFlowLayout指示器显示正确。

我正在覆盖以下方法/属性NSCollectionViewFlowLayout

  • 准备()
  • 集合视图内容大小
  • layoutAttributesForElements(in rect: NSRect) -> [NSCollectionViewLayoutAttributes]
  • layoutAttributesForItem(在 indexPath:IndexPath)-> NSCollectionViewLayoutAttributes?
  • shouldInvalidateLayout(forBoundsChange newBounds: NSRect) -> Bool
  • layoutAttributesForInterItemGap(在 indexPath:IndexPath 之前)-> NSCollectionViewLayoutAttributes?
0 投票
0 回答
68 浏览

cocoa - 自定义 NSCollectionViewLayout 不显示任何内容

我正在尝试学习如何创建自定义 NSCollectionViewLayout。我遵循了一些教程,但我总是得到相同的结果,一个空的 CollectionView。

我一直在使用的代码是这个:https ://github.com/Jatapiaro/CustomCollectionViewLayout

我对自定义 NSCollectionViewLayout 的实现是:

即使调用了实现中的所有方法,一旦应用程序运行,我总是会得到以下结果。

CollectionView 失败

有谁知道我做错了什么?

0 投票
0 回答
38 浏览

ios - 使用混合分数和绝对值来调整 NSCollectionLayoutItem 的大小

我正在调整NSCollectionLayoutItem其组中的一个。使用NSCollectionLayoutSize并且NSCollectionLayoutDimension我可以实现诸如'<em>我希望它是其容器宽度的一半'或'我希望它是 200px ' 或'<em>我希望它的高度与它的宽度相同的要求加10%'。

但我找不到实现我需要的方法:'<em>我希望它的高度与它的宽度相同,再加上 28px'。

这有可能吗?

代码:

0 投票
1 回答
16 浏览

cocoa - NSCollectionViewAttributes 未与自定义 NSFlowLayout 子类正确应用

我目前正在NSCollectionView使用自定义布局。为此,我NSCollectionViewFlowLayout对我的项目进行了子类化以顶部对齐(它们都有固定的宽度,这使得算法非常容易)。我现在遇到的问题是只有我的集合视图中的前九个项目才能正确显示,即顶部对齐。

当最初显示集合视图时,这前九个项目至少部分可见。向下滚动集合视图时出现的其他项目将在没有任何顶部对齐的情况下绘制,只是垂直居中每行作为NSCollectionViewFlowLayout. 通过广泛的日志记录,我可以验证我的布局仅提供NSCollectionViewLayoutAttributes正确修改的顶​​部对齐。

当我调整包含 的窗口的NSCollectionView大小,从而调整集合视图本身的大小时,它的可见部分中的所有项目将突然正确显示。

我错过了什么?

这是我的自定义子类: