问题:UICollectionView Cell之间存在缝隙

原因

  • UICollectionViewCell的size不为整数时,UICollectionViewFlowLayout在布局计算时,可能会调整Cell的frame.origin,使Cell按照最小物理像素(渲染像素)对齐,导致出现缝隙。

  • 假设当前Cell的frame.origin.y=100.8(逻辑像素),转化成渲染像素(参考备注)是201.6(iPhone 8)或302.4(iPhone 8 Plus)。为了按渲染像素对齐,UICollectionViewFlowLayout应该会四舍五入取整,取整后为202(iPhone 8)或302(iPhone 8 Plus),转成逻辑像素101(iPhone 8)或100.667(iPhone 8 Plus),导致在iphone8上就会出现0.2像素的缝隙。

  • 分辨率相关的,可以百度下。

简单解决办法:

  • 主动把Cell的size取整,不丢给UICollectionViewFlowLayout处理。
- (CGSize)fixedCollectionCellSize:(CGSize)size {
    CGFloat scale = [UIScreen mainScreen].scale;
    return CGSizeMake(round(scale * size.width) / scale, round(scale * size.height) / scale);
}

Demo实验

  • UITableView,Cell高度设置成100.12,没有强制被按渲染像素对齐,如 99.62 1802.16 1902.28
(lldb) po [0x7fb85b83b800 recursiveDescription]
; layer = ; contentOffset: {0, 1272.5}; contentSize: {375, 2002.4000549316406}; adjustedContentInset: {20, 0, 0, 0}>
   | >
   |    | ; layer = >
   |    |    | >
   |    | <_UITableViewCellSeparatorView: 0x7fb85b710820; frame = (15 99.62; 360 0.5); layer = >
   | >
  • iPhone Plus 8,UICollectionView,Cell高度设置成100.12,强制被按渲染像素对齐了,frame.origin.y被调整后的值,如200.333 500.667 600.667
   | 
  • iPhone Plus,UICollectionView,Cell高度设置成100.12,强制被按渲染像素对齐了,frame.origin.y被调整后的值,如300.5 400.5 500.5
   | 

备注

Points(逻辑像素)<--->Rendered Pixels(渲染像素)<--->Physical Pixels(物理像素)

iOS不同机型尺寸.png

你可能感兴趣的:(问题:UICollectionView Cell之间存在缝隙)