UICollectionView看起来像iOS日历应用程序

时间:2015-04-28 18:23:59

标签: ios objective-c uitableview uicollectionview

我正在构建一个应用程序,我真的需要显示一个类似于iOS日历应用程序中的列表。我需要创建一个collectionView,我可以在其中扩展足以覆盖各自小时的单元格,如下所示:

enter image description here

我尝试了各种各样的事情,包括在Github的this project,我不明白如何在另一个项目中使用

除了这个项目,我还在使用UITableViewController时快速研究了不同的方法:

enter image description here

但我并没有真正得到我想要的地方。我需要在第一张图片中看到设计,并想知道是否有人能指出我正确的方向来实现这一目标?

非常感谢你的帮助!!

更新

在这个例子中,实际的单元格框架不应该代表一小时的开始时间吗? (而不是定制的分隔符)

enter image description here

更新

为什么层次结构如下所示:

enter image description here

这种定位似乎是"阻止"触摸细胞并且didSelectItemAtIndexPath方法不会被调用。这适用于比其他单元更靠后的单元格。

enter image description here

3 个答案:

答案 0 :(得分:8)

您确实应该使用UICollectionView以及自定义布局。只需提供supplementary views即可构建基本的每日计划(每小时一个视图),然后使用cells来设置您的活动。

在继承UICollectionViewLayout时,您需要实现一些方法:

  • collectionViewContentSize应返回一个等于小时数(24)的高度乘以代表一小时的补充视图的高度。
  • prepareLayout几乎可以做任何事情。在该方法中,您将计算需要使用的每个 layoutAttributes 。通过获取事件的时间及其持续时间,您可以计算每个事件的帧。补充视图框(每一个"小时"块)也非常简单,因为它们的高度是固定的(origin.y =固定高度乘以小时)。
  • layoutAttributesForElementsInRect:只需遍历您之前准备的 layoutAttributes ,并返回其所有框架与所提供框架相交的所有内容。
  • layoutAttributesForItemAtIndexPath:查找并返回与提供的indexPath匹配的单元格 layoutAttributes

  • layoutAttributesForSupplementaryViewOfKind:atIndexPath查找并返回补充视图的 layoutAttributes ,该数据提供了indexPath。

接下来,将该布局的实例提供给集合视图:

self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:myCustomLayout]

然后,您只需要通过UICollectionView的委托&提供补充视图(a.k.a小时块)和单元格所需的视图。数据源。如果您需要UIViewController来提供与标准委托/ dataSource相关的更多信息,请随意在自定义布局中创建自定义委托!

注意:由于指示小时开始的行是单元格顶部边框下方的几个像素,因此您需要每次将事件移动相同的像素数。假设每行上面有6个像素,每小时块的高度为60像素,那么如果在凌晨2点开始均匀,则会设置origin.y = 2 * 60 + 6(每小时2小时* 60像素+ 6像素填充)。您还需要将最后一个单元格块调整为6像素,因为它不会在下面有另一个单元格。

我建议您阅读有关创建自定义布局的the official documentation

为了帮助您:我制作了quick sample project,因为制作自己的布局有时会很麻烦。去检查CalendarViewLayout类,我添加了一些注释来解释我如何处理填充。这是它的样子:

Sample

答案 1 :(得分:3)

我不认为这很难做到。

你需要一个不同于你所尝试的视角。

使所有CollectionView单元格大小相同。它们代表1小时的时间,所以它们应该具有相同的大小。

然后在每个单元格中有另一个视图。这是表明存在事件的那个。此视图将显示一种颜色,并根据事件开始或结束的时间将其放置在单元格中。 因此,在cellForRowAtIndexPath中,您将检查您的事件,如果此单元格有任何事件,那么您将显示此事件视图,为其着色并定位它。如果将单元格设置为高度60,则可以非常轻松地定位视图。例如,如果事件从1:20开始,在小时1的单元格中,您将调整事件视图的大小(0,20,320,40)。

答案 2 :(得分:1)

根据对该问题的评论中的讨论,使用问题中链接的Custom Collection View Layout library适用于可以使用CocoaPods轻松集成的上述问题。

使用自定义UICollectionViewLayout可以高度自定义UICollectionView。请参阅creating custom layouts的官方Apple文档。

坦率地说,Apple的文档对我们大多数人来说太过于无法应对。因此,您可以查找(谷歌)custom UICollectionViewLayout tutorial,查看您认为最简单的任何一个,然后根据您的具体需求使用该库。