2015-04-04 16 views
13

Ich habe eine UICollectionView mit einem FlowLayout eingerichtet, die keinen Raum zwischen den Zellen in vertikaler oder horizontaler Richtung lässt.UICollectionView 3 Spaltenraster, 1px Platz? (Bild enthalten)

Ich habe alles funktioniert, aber es gibt eine ungerade 1px Platz zwischen der 2. und 3. Spalte und ich habe keine Ahnung warum !? Ich habe festgestellt, dass die 1px-Lücke sowohl im iOS-Simulator als auch auf einem echten Gerät auftaucht. Hat jemand das erlebt?

Mein UIViewController ist ein Delegierter/Datenquelle der folgenden Optionen:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

ich die notwendigen Funktionen implementiert habe keinen Abstand zu entfernen (und mit print-Anweisungen überprüft, dass sie ausgeführt werden), sowie visuelle Bestätigung der Zellen entlang nebeneinander up:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 
    return UIEdgeInsetsZero 
} 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { 
    return 0 
} 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { 
    return 0 
} 

Schließlich habe ich die Breite der Zelle ausgedruckt (jede Farbquadrat) zurückgeführt wird, um sicherzustellen, war es diedieoder (320/3) ist 106,666667

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

    var totalHeight: CGFloat = (self.view.frame.width/3) 
    var totalWidth: CGFloat = (self.view.frame.width/3) 

    println(totalWidth) // this prints 106.666666667 

    return CGSizeMake(totalWidth, totalHeight) 
} 

enter image description here

+0

Haben Sie eine bessere Lösung als die unten genannten gefunden? – BlueBoy

+0

@BlueBoy Ich habe nicht. Die Lösung, mit der ich gehe, besteht darin, zwei der Säulen zu einer Decke oder einem Boden von (Breite/3) zu machen und dann die dritte Spalte auf den Rest einzustellen. – Alex

+0

Wie machst du nur zwei der Säulen eine Decke? – BlueBoy

Antwort

5

besser vermeiden Anzahl der Doppel Art in ähnlichen Situationen. Verwendung:

return CGSizeMake(ceil(totalWidth), ceil(totalHeight)) 
+0

Aber möchte ich nicht, dass die Größe (Breite und Höhe) der Zellen schwimmt? Wenn ich diesen Code implementieren, werden nur 2 Zellen pro Zeile angezeigt, da 107 + 107 + 107 = 321, das ist die Ansichtsbreite von 320. – Alex

+2

zumindest, können Sie 107 + 107 + (320-214) – dimpiax

+0

Sie machen sind richtig - das funktioniert ... aber warum sollte das so sein, da CGSizeMake CGFloats als Eingabeparameter verwendet? – Alex

2

Ich war das gleiche Problem, fest ich es mit dem folgenden Code:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

    let paddingSpace = sectionInsets.left * 4 
    let availableWidth = view.frame.width - paddingspace 
    let widthPerItem = availableWidth/3 

    return CGSizeMake(width: widthPerItem, height: widthPerItem) 
} 

und definieren Sie die Variable in der unten stehenden beginnen Ihrer Klasse:

fileprivate let sectionInsets = UIEdgeInsets(top: 0.0, left: 0.5, bottom: 0.0, right: 0.0) 
0

Hier ist meine Lösung zur Ausgabe nur mittlere Zelle der Breite 106 und andere zwei mit der Breite 107 in der Methode collectionView Layout

NSInteger numColumns = 3; 
CGSize deviceSize; 
CGFloat width = self.view.frame.size.width/numColumns; 
CGFloat height = width ; 
NSInteger rem = (int)self.view.frame.size.width%numColumns; 
if(indexPath.row == (1 + numColumns*counter) && rem != 0) { 

    deviceSize = CGSizeMake(floor (width), ceil(height)); 
    counter++; 
} 
else { 

    deviceSize = CGSizeMake(ceil (width), ceil(height)); 
} 
deviceSize = CGSizeMake(deviceSize.width, deviceSize.height);