iOS6 - UICollectionViewFlowLayout 没有正确放置单元格

Posted

技术标签:

【中文标题】iOS6 - UICollectionViewFlowLayout 没有正确放置单元格【英文标题】:iOS6 - UICollectionViewFlowLayout doesn't place the cell correctly 【发布时间】:2012-11-12 15:53:31 【问题描述】:

我添加了一个框架大小为 320x600 的 UICollectionView,每个项目大小为 44x44。最终输出没有正确定位每一行中的单元格。有一些单元格位于集合视图的边界之外,它看起来像这个链接中的图像:http://cl.ly/image/2s270g1p1g2e

#4、#5、#6、#11、#12、#13 和 else 超出集合视图的范围。这是我启动 UICollectionView 和流布局的代码:

SSCalendarFlowLaout *flowlayout = [[SSCalendarFlowLaout alloc] init];
flowlayout.minimumInteritemSpacing = 1.0f;
flowlayout.minimumLineSpacing = 1.0f;
flowlayout.itemSize = CGSizeMake(44, 44);
flowlayout.scrollDirection = UICollectionViewScrollDirectionVertical;

CGRect rect = CGRectMake(0, 0, 320, 600);
self.calendarGrids = [[UICollectionView alloc] initWithFrame:rect
                                          collectionViewLayout:flowlayout];
self.calendarGrids.delegate = self;
self.calendarGrids.dataSource = self;

self.calendarGrids.allowsSelection = YES;
self.calendarGrids.backgroundColor = [UIColor yellowColor];

[self.calendarGrids registerClass:[SSCalendarDayCell class]
         forCellWithReuseIdentifier:@"CalendarDayCell"];

[self addSubview:self.calendarGrids];

SSCalendarFlowLayout 是 UICollectionViewFlowLayout 的子类。子类化它的原因是为了调试这个问题:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 

  NSArray *unfilteredPoses = [super layoutAttributesForElementsInRect:rect];
  for (UICollectionViewLayoutAttributes *pose in unfilteredPoses) 
    NSLog(@"%@", NSStringFromCGRect(pose.frame));
  
  return unfilteredPoses;

有趣的是,每个项目的 layoutAttributesForElementsInRect 输出都是正确的,如下面的控制台输出:

2012-11-12 23:42:59.275 Calendar[49367:c07] 0, 22, 44, 44
2012-11-12 23:42:59.275 Calendar[49367:c07] 55.2, 22, 44, 44
2012-11-12 23:42:59.276 Calendar[49367:c07] 110.4, 22, 44, 44
2012-11-12 23:42:59.278 Calendar[49367:c07] 165.6, 22, 44, 44
2012-11-12 23:42:59.278 Calendar[49367:c07] 220.8, 22, 44, 44
2012-11-12 23:42:59.279 Calendar[49367:c07] 276, 22, 44, 44
2012-11-12 23:42:59.279 Calendar[49367:c07] 0, 76, 44, 44

但为什么输出与 UICollectionViewFlowLayout 设置的框架如此不同?模拟器和 iPhone 中的输出都是错误的。

我怀疑这是一个与此相关的错误:http://openradar.appspot.com/12433891 但与此错误不同的是,UICollectionViewFlowLayout 在每一行中都错放了单元格,而不仅仅是第一行。

【问题讨论】:

【参考方案1】:

问题解决了。我错过了单元格内的标签矩形。我在每个单元格中添加了一个 UILabel 的子视图,但是在这个问题中发生的事情是我将标签配置如下:

- (id) initWithFrame:(CGRect)frame 

  self = [super initWithFrame:frame];
  if (self) 

    self.dayLabel = [[UILabel alloc] initWithFrame:frame];
    [self.contentView addSubview:self.dayLabel];

  
  return self;


这绝对是错误的。我将框架集更正为: self.dayLabel = [[UILabel alloc] initWithFrame:(CGRect)CGPointZero, frame.size]; 然后一切正常。 还是谢谢

【讨论】:

以上是关于iOS6 - UICollectionViewFlowLayout 没有正确放置单元格的主要内容,如果未能解决你的问题,请参考以下文章

iPhone X横向全屏UICollectionViewCell问题

iOS6 方向

在 ios6 上运行单元测试是不是有意义

开发人员的 iOS6 差异 [关闭]

IOS6 地理位置 watchPosition 回调失败

ios6设备不支持方向