10.11 NSCollectionView - 动态确定单元格大小

2024-05-09

OS X v10.11 AppKit 发行说明 https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView建议可以根据每个项目调整集合视图项目的大小:

项目大小可以全局确定 CollectionView 的所有项目(通过设置 NSCollectionViewFlowLayout 的“itemSize”属性),或者可以从一个项目到下一个项目不同(通过在 CollectionView 的委托上实现 -collectionView:layout:sizeForItemAtIndexPath: )。

就我而言,我的 CollectionViewItem 由单个标签组成,其中包含不同长度的字符串。我使用 NSCollectionView 来显示字符串数组,因为 NSStackViews 不支持数组绑定,并且不流向新行。字符串数组通过数组控制器绑定到 NSCollectionView 的内容。

我的项目的 nib 文件已正确设置,根视图和标签都有内容拥抱 and 内容抗压缩性优先级为 1000,边缘通过 AutoLayout 对齐。

现在, NSCollectionViewLayout 的委托方法具有以下签名:

func collectionView(collectionView: NSCollectionView, 
                    layout collectionViewLayout: NSCollectionViewLayout, 
                    sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize

我现在的想法是抓取项目本身,对其运行布局传递,然后返回新的项目大小。

let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size

这种方法的问题是 itemAtIndexPath 返回 nil。如果我在 nil 情况下返回默认大小,则该默认大小将用于所有单元格。

如何设置 NSCollectionView 以尊重我的项目的自动布局约束,并为每个单元格动态使用计算的大小?


我回答了这个问题的重复项,但这可能是应该针对的问题,因为它较旧。

Juul 的评论是正确的 - 这些项目不存在。sizeForItemAt被调用的是请求委托提供该数据条目的任何特定大小的集合,它将用于帮助创建其最终的视图控制器,NSCollectionViewItem。因此,当您要求集合在它用于帮助获取项目的方法中获取项目时,您会创建一个循环。

我们遇到的问题是我们想要根据外貌该数据的长度:具有正确格式的文本标签的长度,而不仅仅是字符串长度。所以我们遇到了先有鸡还是先有蛋的问题。

我找到的唯一可能更漂亮的解决方案如下:

Prep

  • 子类NSCollectionViewItem并确保您的集合视图具有返回正确子类化项目的数据源。
  • 完全使用 XIB 中的约束。
  • 您的子类应该有一个加载要表示的数据对象的方法 - 当然还有您的数据源协议方法。
  • 在第一次之前的某个时刻sizeForItemAt调用,或者在第一个调用的开头(如果那时您还没有)手动创建一个实例NSCollectionViewItem子类,并使用 NSNib 的instantiate(withOwner:topLevelObjects:)以您的子类作为所有者来实例化其 XIB。将该参考存储为一种“调整模板”,因此您只需执行一次。代表对我来说是最容易的地方。

^注意:我的第一条路线是通过集合来尝试这一点makeItemWithIdentifier,但它更脆弱,因为它要求集合在创建尺寸模板时具有项目。在初始阶段也无法完成sizeForItemAt(在重新加载崩溃期间访问/制作物品)。我担心因为它是用集合制作的,所以它可能会被重复使用,并且下面的方法不起作用或开始编辑可见项目。 YMMV。

In sizeForItemAt

  • 直接从数据源获取所表示的数据对象。让您的大小调整模板对象使用我之前提到的方法来表示该数据对象。
  • 访问尺寸模板View.FittingSize,一个项目可以被赋予其约束/优先级的最小尺寸,并返回它。

嘭!没有经过压力测试或任何东西,但我这边没有任何问题,并且它没有进行布局传递或任何东西,只是调用FittingSize。我还没有在网上的任何地方看到这一点,所以我想写出完整的解释。

我在 Xamarin.Mac 中执行此操作,因此我的代码不会是 1:1,并且我不想快速编写乱码并弄乱任何内容。

TLDR:手动实例化一个 NSCollectionViewItem 子类及其将存储的 xib,不属于集合。在 sizeForItem 期间填充您存储为尺寸参考的项目,并返回FittingSize集合项目的视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10.11 NSCollectionView - 动态确定单元格大小 的相关文章

  • 一个好的8086模拟器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 mac 有没有 8086 模拟器 如果是 哪个是最好的 除非您需要真正的原始 8086 带有自定义操作系统 否则您应该尝试 DosBox
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • ios水平居中约束问题?

    I am having hard time in learning constraints auto layout in iOS I have used any width any height I have a storyboard sc
  • 如何在 OSX 上安装 LaTeX .sty 文件?

    我设置了一个 LaTeX 项目 tex documents some file tex support todonotes sty where some file tex uses todonotes usepackage colorinl
  • Xcode 9:“clang:错误:生成多个输出文件时无法指定 -o”

    我刚刚将 Xcode 更新到版本 9 并且在编译时开始收到以下错误消息 该问题似乎与将 优化级别 参数设置为 无 即 O0 进行编译有关 如果我将其设置得更高 错误就会消失 但是当我增加优化时 调试工具将无法正常工作 例如变量跟踪 我查看了
  • Cocoa - 捕获 NSStatusItem 鼠标悬停事件

    当用户的鼠标悬停在我的 NSStatusItem 上时 如何执行函数 如果您分配自定义NSView给你的NSStatusItem s view属性 您可以覆盖NSResponder方法mouseEntered mouseMoved and
  • 有什么方法可以询问方法的名称吗?

    我正在尝试调试我正在开发的 iPhone 应用程序 向各种源文件添加 50 条 NSLog 语句的想法让我感到很兴奋 我想做的是写一对陈述 比如 NSString methodName self methodName NSLog metho
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • NSNotificationCenter 为“观察者”和“对象”保留什么类型的引用?

    任何人都可以澄清 阐明有关情况 NSNotificationCenter addObserver selector name object 观察者 和 对象 参数的通知中心保留哪些类型的引用 从通知中心删除观察者的最佳实践是什么 多线程应用
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • 为什么有时 npm install 在 mac 上不起作用?

    我在运行命令时创建了nodejs项目npm 安装它因一些错误而失败 同一个项目正在进行中ubuntu系统但是当我克隆这个代码时mac系统并尝试运行 npm install 它失败并出现一些错误 我认为 scrypt 模块有问题 但我不知道确
  • UITableViewCell 上的自动布局问题

    我在使用自动布局时遇到问题xcode 5项目 我在内部使用带有导航控制器的普通视图控制器 我有一个MKMapView在上半部分和一个UITableView在下半部分 我在用storyboards 并配置了原型UITableViewCell
  • 如何获取 CIFilter 类中的过滤器名称列表?

    我正在使用以下代码进行曝光调整及其工作 我需要锐化 降噪 高光 色温 阴影 模糊等滤镜名称 CIFilter filterWithName CIExposureAdjust keysAndValues inputImage imageVie
  • 如何在 MAMP 上显示错误?

    我有 MAMP 但我不知道如何在其上显示错误 当我的 php 代码出现错误时 它只显示空白页 我在 Google 上搜索过 我发现我必须在所有文件夹和版本上将其更改为 display errors on 并将其包含在我的页面上 错误报告 E
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 如何在 Mac 上禁用屏幕保护程序/显示器睡眠

    有没有办法用可可禁用屏幕保护程序和显示器睡眠 OSX 10 8 中已弃用 UpdateSystemActivity OverallAct 的使用 现在推荐的方法是通过以下调用来阻止它 IOPMAssertionCreateWithName
  • 处理过时的 NSURL 书签的正确方法是什么?

    从安全范围的书签解析 NSURL 时 如果用户已重命名或移动该文件或文件夹 则该书签将过时 苹果的文档对于陈旧性有这样的描述 isStale 返回时 如果是 则书签数据已过时 你的应用程序应该 使用返回的 URL 创建一个新书签并用它代替
  • 如何在没有 SDK 的情况下在 Objective C 中为 S3 创建预签名 URL?

    我正在构建一个 mac 应用程序not使用 AWS iOS 开发工具包 我尝试构建的 GET 请求应遵循以下通用格式 Authorization AWS AWSAccessKeyId base64 hmac sha1 VERB n CONT
  • 对 Mac“捆绑”文件进行版本控制的最佳方法

    所以你知道很多 Mac 应用程序都使用 捆绑包 对于你的应用程序来说 它看起来像是一个文件 但实际上它是一个包含许多文件的文件夹 对于要处理此问题的版本控制系统 它需要 检出目录中的所有文件 以便应用程序可以根据需要修改它们 at chec

随机推荐