浮点数在集合视图中四舍五入时出现错误

9
我希望解决设备上的一个像素问题。我正在设计一个类似下图的日历:

enter image description here

为此我使用了UICollectionViewCell。
   - (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
   return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right
}

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat collectionViewWidth = (CGRectGetWidth(collectionView.frame) / 7);
    CGFloat collectionViewHeight = 48;
    return CGSizeMake(collectionViewWidth, collectionViewHeight);
}

问题是,如果我将宽度增加0.0000001个点,那么每行绘制的单元格数就会从7个变为6个。我也尝试过增加UIEdgeInset(0.00001), 但问题仍然存在。流程布局的属性已经设置适当。
 layout.minimumInteritemSpacing = 0.0f;
 layout.minimumLineSpacing = 0.0f;

如何使单元格大小保持一致而不留下空白?单元格的实际宽度为53.571428571428569(375/7)。如果将该值四舍五入为53.58,则会得到以下视图 enter image description here

2个回答

6

这是一个非常普遍的问题,最快解决方法是使用collectionViewWidth % 7 == 0来确定单元格大小。

例如,如果您的collectionViewWidth为320,则单元格大小为320/7 = 45.7142857。您只需将collectionViewWidth设置为322,问题就会得到解决,因为单元格大小为46。

为了不让增加变得明显,您有两个选择:

  • 首先,如果collectionViewWidth == screenWidth,则简单地将其对齐到中心位置,边缘将隐藏在屏幕限制之外。

  • 其次,如果collectionViewWidth < screenWidth,则使用UIView作为collectionView的容器,并使用clipToBounds属性,边缘将隐藏在容器限制之外。


你说得很对。我知道将宽度设置为%7可以解决问题。我正在寻找更深入的理解,了解UIKit如何处理点到像素转换,并且是否有一种方法可以在出现浮点错误的情况下覆盖这些行为。 - Kunal Balani
我最近遇到了同样的问题(https://stackoverflow.com/questions/44380440/ios-uicollectionview-spacing-precision)。在我的情况下,单元格的宽度为103.5,不应该存在四舍五入问题,但最终仍然出现了不需要的垂直线条。看起来处理这个问题最好的方法是在所有单元格之间留有一小间距,但这会对用户界面造成影响。 - Stephenye

1

要去掉一个像素,请尝试使用 UICollectionView 的这些委托方法:

- (CGFloat)collectionView:(UICollectionView *)collectionView
                   layout:(UICollectionViewLayout*)collectionViewLayout
minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{
    return -0.5;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView
                   layout:(UICollectionViewLayout*)collectionViewLayout
minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
    return -0.5;
}

或者,另外一种选择是:
layout.minimumInteritemSpacing = -0.5;
layout.minimumLineSpacing = -0.5;

有时您可能需要将其中一个设置为0.0,而另一个设置为-0.5。尝试进行调整。


它没起作用。minimumInteritemSpacingForSectionAtIndex 属性会忽略负值。我尝试了从 -0.1 到 -100 的可能范围。 - Kunal Balani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接