设计要求CollectionView水平、垂直方向的间隔均为0.5pt时,该如何实现,按正常思路,设置
collectionViewLayout.minimumLineSpacing = 0.5;
collectionViewLayout.minimumLineSpacing = 0.5;
image.png
最终运行的结果,实际间隔并没有均匀分布,有的是1px,有的大于1px。导致出现这种问题的原因是:
平分屏幕的时候,itemSize.width = (375-30)/4=86.25(iphone8为例:1px=0.5pt),计算的宽度小数后竟然是0.25,小于1像素是不可再分割的。
实际1px = (1/[UIScreen mainScreen].scale);
修改后的代码:
// #define PixelValue (1/[UIScreen mainScreen].scale)
- (void)configCollectionView {
collectionRows = 4;
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = PixelValue;
layout.minimumInteritemSpacing = PixelValue;
layout.sectionInset = UIEdgeInsetsMake(PixelValue, PixelValue, PixelValue, PixelValue);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
CGFloat originalWidth = self.view.frame.size.width-30;
NSInteger itemWidth = roundf((originalWidth-5*PixelValue)/4.0); // 四舍五入
CGFloat firstWidth = originalWidth-itemWidth*3-5*PixelValue;
firstWidth = floorf(firstWidth)+PixelValue;
// 根据itemSize和间隔去更新collectionView的frame
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(15, 50, itemWidth*3+firstWidth+5*PixelValue, (82+PixelValue)*collectionRows+PixelValue) collectionViewLayout:layout];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
self.collectionView.backgroundColor = [UIColor darkGrayColor];
self.collectionView.showsVerticalScrollIndicator = NO;
[self.view addSubview:self.collectionView];
[self.collectionView registerClass:[TempCollectionViewCell class] forCellWithReuseIdentifier:@"TempCollectionViewCell"];
}
// 保证1px间隔的同时,也要保证每个item的宽度
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
CGFloat originalWidth = self.view.frame.size.width-30;
NSInteger width = roundf((originalWidth-5*PixelValue)/4.0); // 四舍五入
if (indexPath.row % 4 == 3) {
CGFloat firstWidth = originalWidth-width*3-5*PixelValue;
firstWidth = floorf(firstWidth)+PixelValue;
return CGSizeMake(firstWidth, 82);
}
return CGSizeMake(width, 82);
}
运行结果:
image.png
补充
开发中如果UI要求分割线是1px,不管是label、tableViewCell最好使用(1/[UIScreen mainScreen].scale)
,不要写成0.5了。
网友评论