2016-01-29 3 views
6

Я хочу, чтобы избавиться от одного вопроса пикселей на моем device.I я разработка календаря, который выглядит, как показано нижеОшибки округления значения с плавающей точкой для представления коллекции

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 точки, то число клеток нарисовать на линию 6 вместо 7. Я попытался увеличения UIEdgeInset (от 0,00001), а также, но это тот же выпуск е. Свойства для компоновки потока устанавливаются соответствующим образом.

layout.minimumInteritemSpacing = 0.0f; 
layout.minimumLineSpacing = 0.0f; 

Как сделать размер ячейки согласованным, не выходя из зазора? Фактическая ширина ячейки составляет 53,571428571428569 (375/7). Если я округлять значение до 53.58, то я получаю снизу Вид enter image description here

ответ

4

Это очень популярная проблема, самый быстрый способ разрешить его использование collectionViewWidth% 7 == 0 для размера ячейки

Например ваш collectionViewWidth == 320. Cell == 320/7 == 45.7142857, U просто должен использовать collectionViewWidth == 322, и ваша проблема решена, потому что ячейка == 46

Что увеличение не было заметным collectionViewWidth U имеет два варианта

  • Во-первых, если вы collectionViewWidth == screenWidth, просто выровняйте по центру и края скроют вне пределов экрана

  • Во-вторых, если вы collectionViewWidth < screenWidth, используйте UIView в контейнер для CollectionView, и использовать ClipToBounds, края будут скрывать вне пределов контейнеров.

+0

у вас есть хороший момент. Я знаю, что установка ширины в% 7 устраняет проблему. Я ищу понимание более глубокого решения, как UIKit имеет дело с точками преобразования пикселей, и если есть способ переопределить эти поведения в случае возникновения ошибки с плавающей точкой. –

+0

Недавно я столкнулся с той же проблемой (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. Попробуйте сыграть с ним.

+0

Это не сработало. -ve игнорируются атрибутом minimumInteritemSpacingForSectionAtIndex. Я попробовал возможный диапазон от -0,1 до -100 –

Смежные вопросы