如何确定 UICollectionView flowLayout 中单元格之间的间距

2024-01-02

我有一个带有流布局的 UICollectionView,每个单元格都是一个正方形。如何确定每行中每个单元格之间的间距?我似乎找不到合适的设置。我看到集合视图的 nib 文件上有一个最小间距属性,但我将其设置为 0 并且单元格甚至不粘在一起。

还有其他想法吗?


更新:这个答案的 Swift 版本:https://github.com/fanpyi/UICollectionViewLeftAlignedLayout-Swift https://github.com/fanpyi/UICollectionViewLeftAlignedLayout-Swift


Taking @matt 的领导 https://stackoverflow.com/a/13258495/250190我修改了他的代码以确保项目始终左对齐。我发现,如果一个项目本身位于一行,它将以流布局为中心。我做了以下更改来解决这个问题。

仅当单元格宽度不同时才会发生这种情况,这可能会导致如下所示的布局。由于以下行为,最后一行始终左对齐UICollectionViewFlowLayout,问题在于除最后一项之外的任何行中单独存在的项目。

通过@matt的代码我看到了。

在该示例中,我们看到如果单元格最终单独在线上,则单元格会居中。下面的代码确保您的集合视图看起来像这样。

#import "CWDLeftAlignedCollectionViewFlowLayout.h"

const NSInteger kMaxCellSpacing = 9;

@implementation CWDLeftAlignedCollectionViewFlowLayout

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes* attributes in attributesToReturn) {
        if (nil == attributes.representedElementKind) {
            NSIndexPath* indexPath = attributes.indexPath;
            attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;
        }
    }
    return attributesToReturn;
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes* currentItemAttributes =
    [super layoutAttributesForItemAtIndexPath:indexPath];

    UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout sectionInset];

    CGRect currentFrame = currentItemAttributes.frame;

    if (indexPath.item == 0) { // first item of section
        currentFrame.origin.x = sectionInset.left; // first item of the section should always be left aligned
        currentItemAttributes.frame = currentFrame;

        return currentItemAttributes;
    }

    NSIndexPath* previousIndexPath = [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section];
    CGRect previousFrame = [self layoutAttributesForItemAtIndexPath:previousIndexPath].frame;
    CGFloat previousFrameRightPoint = CGRectGetMaxX(previousFrame) + kMaxCellSpacing;

    CGRect strecthedCurrentFrame = CGRectMake(0,
                                              currentFrame.origin.y,
                                              self.collectionView.frame.size.width,
                                              currentFrame.size.height);

    if (!CGRectIntersectsRect(previousFrame, strecthedCurrentFrame)) { // if current item is the first item on the line
        // the approach here is to take the current frame, left align it to the edge of the view
        // then stretch it the width of the collection view, if it intersects with the previous frame then that means it
        // is on the same line, otherwise it is on it's own new line
        currentFrame.origin.x = sectionInset.left; // first item on the line should always be left aligned
        currentItemAttributes.frame = currentFrame;
        return currentItemAttributes;
    }

    currentFrame.origin.x = previousFrameRightPoint;
    currentItemAttributes.frame = currentFrame;
    return currentItemAttributes;
}

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

如何确定 UICollectionView flowLayout 中单元格之间的间距 的相关文章

  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • 使用 Push Transition 效果更改 RootViewcontroller

    在我的iOS应用程序中 我需要更改应用程序之间窗口的rootviewController 因此 当我动态更改我的rootviewcontroller时 它会在更改之前轻拂视图 但我想要的是在更改rootviewcontroller时提供平滑
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • 对 UIImage 进行方形裁剪,导致图像拉伸

    当尝试执行 UIImage 的中心裁剪时 我得到以下结果 左侧是原始图像640 1136 右边是适合正方形的裁剪图像UIImageView at 320 320 turns to 我对比率元素进行了相当多的修改 以便它可以正确检测要修剪的量
  • iOS 外部附件框架:如何获取特定 MFI 设备的协议字符串

    我正在编写一个 iOS 应用程序 用于与 mini mPlay Drumi MP18B 小型蓝牙扬声器 进行通信 据我所知 showBluetoothAccessoryPickerWithNameFilter仅显示协议字符串添加到 Info
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • 使用反射的属性类型或类

    我想知道是否可以确定对象属性的类或原始类型 获取所有属性名称和值非常容易 所以答案 https stackoverflow com questions 2299841 objective c introspection reflection
  • 如何使用自签名证书为 TLS 创建 iOS NWConnection?

    我正在尝试将 Apple 的新 NWConnection 类用于我的 MQTT 客户端 为了进行测试 我需要能够创建到本地测试代理的 TLS 连接 该代理具有自签名证书 到目前为止 我只是使用以下命令设置连接 self connection
  • iPad 2 的 HTML5 源元素错误是否已修复?

    根据这个页面 http camendesign com code video for everybody webm http camendesign com code video for everybody webm 第一个 iPad 有一
  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 如何添加授权以从新钥匙串对应用程序进行代码签名,而无需任何人工交互

    我正在尝试使用特定证书自动化构建 iPhone 应用程序的过程 因此 想象一下 如果不同的用户将他们的证书上传到系统中 并且可以立即用于代码签名 我想在没有任何交互的情况下做到这一点 我也不想用不同的用户证书弄乱系统或登录钥匙串 为此我有
  • SecItemAdd 创建两个身份

    我正在为 iPhone 开发一个应用程序 需要证书来调用某些服务 因此我将证书添加到我的钥匙串中 执行以下操作 SecCertificateRef cert SecCertificateCreateWithData NULL bridge
  • 打印附加结构(swift 4)

    我有三个 textifled 用于将数据附加到结构中 如何打印我附加的内容 现在我收到一条错误消息 import UIKit class ViewController UIViewController IBOutlet var c UITe
  • Monotouch 和本机 iOS 代码

    是否可以将使用 monotouch 编译的 C 库与单个应用程序中的 Objective C 前端链接起来 或者该应用程序必须是全部还是全无 这是可能的 但您不会从 MonoTouch 工具获得任何帮助 并且您无法摆脱这样一个事实 您仍然需
  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • 通用类不会将委托调用转发给具体子类

    鉴于以下情况 protocol EntityType var displayString String get extension String EntityType var displayString String return self

随机推荐

  • 将基本 Tensorflow 模型导出到 Google Cloud ML

    我正在尝试导出本地张量流模型以在 Google Cloud ML 上使用它并对其运行预测 我正在关注使用 mnist 数据提供 Tensorflow 示例 https github com tensorflow serving blob m
  • vi 中删除重复行?

    我有一个文本文件 其中包含一长串条目 每行一个 其中一些是重复的 我想知道是否可以 如果可以 如何 删除任何重复项 如果可能的话 我有兴趣在 vi vim 中执行此操作 如果您可以对文件进行排序 则可以使用 sort u
  • 在自己的网站上提交之前检查是否有人喜欢页面

    我的服务器上有一个自己的页面 人们可以在其中下载我自己的曲目 我的想法是在该页面上添加一个类似于我的 Facebook 页面的按钮 人们必须首先点击 喜欢 按钮 然后才能下载曲目 也许这必须通过包含姓名 电子邮件和他们必须单击的类似按钮的表
  • C:从函数返回字符串

    我有一个返回字符串的函数 const char getMyPassword return mysecretpassword 嗯 它工作得很好 但我发现如果我在 Unix 系统上运行 strings 它会显示在列表中 不好 更换它最简单的方法
  • 舵柄:找不到舵柄

    我收到此错误消息 helm version Error could not find tiller 我已经创建了tiller项目 oc new project tiller Now using project tiller on serve
  • 反应式扩展 SelectMany 和 Concat

    我理解 SelectMany 的行为是有效地将生成的每个值的结果合并到单个流中 因此排序是不确定的 如何在 C 中的 RxJs 中执行类似于 concatAll 的操作 var obs Observable Range 1 10 Selec
  • 您可以将一名工会成员的值分配给另一名工会成员吗?

    考虑以下代码片段 union int a float b a b a is this UB b b something 将一名工会成员分配给另一名工会成员是否有效 不幸的是 我相信这个问题的答案是 尽管自赋值完全没问题 但 C 中对联合的操
  • jQuery 简单加载第一次调用花费太多时间

    我的简单 jQuery 的加载语句花费了太多时间 50 秒以上 不存在服务器端问题 服务器的页面逻辑也很简单 我也尝试过 ajax get甚至尝试使用手动 AJAX 调用 XMLHttp请求 以下是 jQuery 加载的示例 functio
  • 如何让 PyDev 编辑器有选择地忽略错误?

    我在 Eclipse 下使用 PyDev 编写一些 Jython 代码 我有很多情况需要做这样的事情 import com work project component client Interface ISubInterface as I
  • 制作自定义tabBar的方法

    创建这样的效果以及导航控制器和视图控制器的处理的最佳方法应该是什么 如果我不想在 viewcontorller 中重新调整每个后续视图的大小并且事情看起来就像是一个 该怎么办标签栏 我建议使用 UIImageView 作为蓝色背景 然后使用
  • 修复警告:[相机]尝试使用不支持的设备更改为肖像模式(BackDual)

    我有一个UICollectionView with a CameraCell作为第一个单元格 它显示相机预览 我想修复 XCode 控制台中的警告iOS 16 iPhone XS Max配备双后置摄像头 Camera Attempted t
  • mysql订单字符串作为数字

    我已经搜索了几天 寻找一种在 mysql 中将字符串排序为数字的方法 我的行看起来像这样 订单列 1 1 2 1 1 100 1 1 1 在 mysql 中按此列升序排序将产生 1 1 1 1 1 100 1 1 2 我有兴趣获得以下结果
  • 如何在给定 ID 的情况下获取未知用户名?

    我有一个 20 个字符的数字 ID 看起来像10527391670258314752 给定这个ID 我怎样才能获得与之关联的用户名 该表如下所示 id name password balance 10527391670258314752 J
  • Safari 中的 SVG 组元素不会触发 Wheel 事件

    我正在尝试绑定一个wheel使用 D3 的 SVG 组元素的事件侦听器 看来wheel当我在 Safari 中滚动组元素时 不会触发事件 组不为空 它在 Firefox 或 Chrome 上运行良好 let svg d3 select sv
  • 使用 Fragment 的 setRetainInstance(true) 确实是处理旋转变化的好习惯吗

    我指的是为什么使用 Fragment setRetainInstance boolean https stackoverflow com questions 11160412 why use fragmentsetretaininstanc
  • 我的模板中获取资源的绝对路径名

    在我的 JSF 2 0 Facelets 应用程序中 我有一个出色的模板 我希望所有页面都使用它 它位于 Web 应用程序的根目录中 名称为 template xhtml 因此它被引用为您所期望的
  • 为什么创建 ASPNETDB.mdf 以及如何摆脱它?

    我的问题已在标题中陈述 以提供一些背景知识 我正在帮助客户在 ASP net 环境中使用 Web 部件 但我不希望它们附加到此数据库 我希望能够在不创建此数据库的情况下使用该网站 我目前正在对此进行更多研究 但是任何有关网站的建议或有关此的
  • 为什么我们需要网络套接字?

    这更像是一个n00b问题 但我从来没有真正知道答案 那么为什么我们需要 websockets 协议呢 与 Comet 式 长轮询 悬挂 GET 式使用 HTTP 相比 有哪些优势 Comet 和 Ajax 都可以提供最终用户体验 提供类似桌
  • VSCode C/C++ IntelliSense 标识符未定义,但可以解析定义

    新安装 VSCode 我安装的唯一扩展是 Microsoft C C Intellisense 插件 版本0 24 1 我正在使用一个代码库 其中包含一些带有 define X foo 宏的头文件 在 cpp 文件中 它用红色下划线表示 标
  • 如何确定 UICollectionView flowLayout 中单元格之间的间距

    我有一个带有流布局的 UICollectionView 每个单元格都是一个正方形 如何确定每行中每个单元格之间的间距 我似乎找不到合适的设置 我看到集合视图的 nib 文件上有一个最小间距属性 但我将其设置为 0 并且单元格甚至不粘在一起