2016-01-29 9 views
6

voglio sbarazzarsi di un problema di pixel sulla mia device.I sono la progettazione di un calendario che si presenta come di seguitoErrore nella arrotondamento valore a virgola mobile per la vista raccolta

enter image description here

Sto usando un UICollectionViewCell per questo scopo

- (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); 
} 

il problema è che se aumento larghezza anche da 0.0000001 punto allora il numero di cellule tiraggio per riga è 6 anziché 7. ho provato aumentando l'UIEdgeInset (da 0,00001) così ma è il stesso issu e. Le proprietà per il layout del flusso sono impostate in modo appropriato.

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

Come si rende la dimensione della cella coerente senza lasciare il vuoto? La larghezza effettiva della cella è 53.571428571428569 (375/7). Se io arrotondare il valore al 53.58 poi ho vista qui sotto enter image description here

risposta

4

Questo è un problema molto popolare, il modo più veloce per risolvere il problema utilizzare collectionViewWidth% 7 == 0 per le dimensioni delle cellule

Per esempio il vostro collectionViewWidth == 320. Cell == 320/7 == 45.7142857, U semplicemente dovrebbe usare collectionViewWidth == 322, e il tuo problema è risolto, perché cell == 46

Che l'aumento non era evidente collectionViewWidth U hanno due opzioni

  • In primo luogo, se si collectionViewWidth == screenwidth, semplicemente allineare al centro e bordi nasconderà fuori dai limiti dello schermo

  • In secondo luogo, se si collectionViewWidth < screenwidth, utilizzare UIView al contenitore per CollectionView e utilizzare ClipToBounds, bordi nasconderanno fuori dai limiti del contenitore.

+0

hai un buon punto. Sono consapevole che l'impostazione della larghezza su% 7 risolve il problema. Sto cercando la comprensione di una soluzione più approfondita di come UIKit si occupa della conversione da punti a pixel e se esiste un modo per ignorare quei comportamenti in caso di errore in virgola mobile. –

+0

Ho riscontrato lo stesso problema di recente (https://stackoverflow.com/questions/44380440/ios-uicollectionview-spacing-precision) Nel mio caso, la larghezza delle celle è 103.5, che non dovrebbe avere problemi di arrotondamento, ma io ha finito per avere linee verticali indesiderate. Sembra che il modo migliore per gestirlo sia avere un piccolo margine tra tutte le celle, ma questo è un compromesso sull'interfaccia utente. – Stephenye

1

per sbarazzarsi di un pixel provare a utilizzare questi metodi delegato di 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; 
} 

o, in alternativa:

layout.minimumInteritemSpacing = -0.5; 
layout.minimumLineSpacing = -0.5; 

Può accadere che si dovrebbe impostare uno dei questi a 0.0, mentre l'altro a -0.5. Prova a giocarci.

+0

Non ha funzionato. -ve i valori vengono ignorati dall'attributo minimumInteritemSpacingForSectionAtIndex Ho provato un intervallo possibile da -0.1 a -100 –