2016-01-29 8 views
6

Ich möchte auf meinem device.I eines Pixels Problem loszuwerden bin ein Kalender entwerfen, die wie unten aussiehtFehler bei Fließkommawert für die Sammlung Ansicht Abrundung

enter image description here

ich UICollectionViewCell bin mit für Dieser Zweck

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

das Problem ist, dass, wenn I Breite von 0,0000001 Punkt erhöhen, selbst dann kann die Anzahl der Zellen pro Linie zu zeichnen ist 6 statt 7. habe ich versucht, die UIEdgeInset Erhöhung (von 0,00001) als gut, aber es ist das gleiche Ausgabe e. Die Eigenschaften für das Flow-Layout sind entsprechend eingestellt.

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

Wie mache ich die Zellengröße konsistent, ohne die Lücke zu verlassen? Die tatsächliche Breite der Zelle ist 53,571428571428569 (375/7). Wenn ich den Wert auf 53,58 runden dann erhalte ich die unten Ansicht enter image description here

Antwort

4

Dies ist ein sehr beliebtes Problem, der schnellste Weg zu lösen es collectionViewWidth% 7 == 0 für die Zellgröße

Zum Beispiel Ihrer collectionViewWidth verwenden == 320. Cell == 320/7 == 45.7142857, U sollte einfach collectionViewWidth == 322 verwenden, und dein Problem ist gelöst, weil cell == 46

Dass die Erhöhung nicht bemerkbar war collectionViewWidth U haben zwei Optionen

  • Erstens, wenn Sie collectionViewWidth == Screen, richten Sie einfach in die Mitte und Kanten von Bildschirmgrenzen werden verbergen verbergen für Collection, und verwenden Sie ClipToBounds, Kanten

  • Zweitens, wenn Sie collectionViewWidth < Screen, verwenden UIView Behälter außerhalb der Containergrenzen.

+0

Sie haben einen guten Punkt. Ich bin mir bewusst, dass die Einstellung der Breite auf% 7 das Problem löst. Ich bin auf der Suche nach einer tieferen Lösung, wie UIKit mit Punkt-zu-Pixel-Konvertierungen umgehen kann und ob es möglich ist, diese Verhaltensweisen zu überschreiben, wenn ein Gleitkommafehler auftritt. –

+0

Ich stieß vor kurzem auf das gleiche Problem (https://stackoverflow.com/questions/44380440/ios-uicollectionview-spacing-precision) In meinem Fall ist die Breite der Zellen 103,5, die Rundungsproblem nicht haben sollte, aber ich hatte immer noch unerwünschte vertikale Linien. Es sieht so aus, als ob der beste Weg darin besteht, einen kleinen Abstand zwischen allen Zellen zu haben, aber das ist ein Kompromiss auf der Benutzeroberfläche. – Stephenye

1

zu befreien von einem Pixel zu erhalten versuchen, diese Delegatmethoden von UICollectionView mit:

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

oder alternativ:

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

Es kann vorkommen, dass Sie würde man von einstellen müssen diese zu 0.0, während die andere zu -0.5. Versuche damit zu spielen.

+0

Es hat nicht funktioniert. -ve-Werte werden vom minimumInteritemSpacingForSectionAtIndex-Attribut ignoriert. Ich habe einen möglichen Bereich von -0.1 bis -100 versucht –