2016-01-29 11 views
6

chcę się pozbyć jednej emisji piksela na moich device.I m projektowania kalendarza, który wygląda jak poniżejBłąd zaokrąglania wartość zmiennoprzecinkową na widok kolekcji

enter image description here

Używam UICollectionViewCell dla ten cel

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

problem polega na tym, że jeśli mogę zwiększyć szerokość nawet przez 0,0000001 punktu wówczas liczba komórek narysować jedną linię jest 6 zamiast 7. próbowałem zwiększenie UIEdgeInset (przez 0,00001), jak również, ale to jest ta sama emisja mi. Właściwości układu przepływu są odpowiednio ustawione.

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

Jak zrobić rozmiar komórki spójny bez opuszczania luki? Rzeczywista szerokość komórki to 53.571428571428569 (375/7). Gdybym zaokrąglić wartość do 53.58 potem dostaję Poniżej widoku enter image description here

Odpowiedz

4

Jest to bardzo popularny problem najszybszy sposób, aby rozwiązać go używać collectionViewWidth% 7 == 0 dla rozmiaru komórek

Na przykład swoją collectionViewWidth == 320. Komórka == 320/7 == 45.7142857, U po prostu powinieneś użyć collectionViewWidth == 322, a twój problem został rozwiązany, ponieważ komórka == 46

To, że wzrost nie był zauważalny collectionViewWidth U ma dwie opcje

  • Po pierwsze, jeśli collectionViewWidth == ScreenWidth, wystarczy wyrównać do środka i krawędzie ukryje poza granice ekranu

  • Po drugie, jeśli collectionViewWidth < ScreenWidth użyć UIView do pojemnika na CollectionView i używać clipTobounds, krawędzie ukryje z limitów kontenera.

+0

masz dobry punkt. Jestem świadomy, że ustawienie szerokości na% 7 rozwiązuje problem. Szukam zrozumienia bardziej dogłębnego rozwiązania tego, w jaki sposób UIKit radzi sobie z konwersją punktów na piksele i czy istnieje sposób na zastąpienie tych zachowań w przypadku wystąpienia błędu zmiennoprzecinkowego. –

+0

Ostatnio napotkałem ten sam problem (https://stackoverflow.com/questions/44380440/ios-uicollectionview-spacing-precision) W moim przypadku szerokość komórek wynosi 103,5, co nie powinno mieć problemu z zaokrąglaniem, ale ja wciąż kończyło się, mając niechciane pionowe linie. Wygląda na to, że najlepszym sposobem radzenia sobie z tym jest uzyskanie niewielkiego marginesu między wszystkimi komórkami, ale jest to kompromis w interfejsie użytkownika. – Stephenye

1

Aby pozbyć się jednego piksela spróbuj użyć tych metod delegat 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; 
} 

lub, alternatywnie:

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

Może się zdarzyć, że trzeba by ustawić jedną z te do 0.0, a drugie do -0.5. Spróbuj z nim grać.

+0

To nie zadziałało. -ve wartości są ignorowane przez atrybut minimumInteritemSpacingForSectionAtIndex Próbowałem możliwego zakresu od -0,1 do -100 –

Powiązane problemy