wie bekomme ich 1 pixcel width borders in UICollectionView Zellen? (Code zur Verfügung gestellt)

8

Wie kann ich ein pixcel-perfektes (1) pixcel mit Umrandungslinie in einer UICollectionView erhalten (z. B. um einen Monatskalender zu erstellen). Das Problem ist, dass wo Zellen treffen ihre Grenzen treffen, so dass es effektiv 2 Pixcels (nicht 1 Pixcel).

Das Problem ist daher ein mit CollectionView-Layout zusammenhängendes Problem. So wie jede Zelle ihren eigenen 1-Pixel-Rahmen setzt, entsteht, wenn die Zellen alle mit einem Abstand von Null zusammentreffen, ein Bild, das wie ein 2-Pixel-Rahmen aussieht (mit Ausnahme der äußeren Kanten des Collection-Views, der 1 Pixel ist) >

Suchen, welcher Ansatz / Code verwendet werden soll, um dies zu lösen.

Hier ist die benutzerdefinierte UICollectionViewCell-Klasse, die ich verwende, und ich lege hier die Zellen mit drawrect fest.

%Vor%     
Greg 11.10.2015, 12:08
quelle

4 Antworten

6

Es gibt einige Strategien, die Sie ergreifen können, um dieses Problem zu lösen. Was am besten ist hängt von einigen Details Ihres Layouts ab.

Option 1: Halbe Grenzen

Zeichnen Sie um die Hälfte die gewünschte Breite um jedes Element. Dies wurde vorgeschlagen. Es wird die richtige Breite für die Rahmen zwischen den Elementen erreicht, aber die Rahmen um den Rand der Kollektion herum sind ebenfalls halb so breit wie gewünscht. Um dies zu lösen, können Sie einen Rahmen um die gesamte Sammlung oder Abschnitte ziehen.

Wenn Sie im Monatslayout nur Tage eines bestimmten Monats darstellen, dh jeder Monat eine eindeutige nicht rechteckige Form hat, ist das Festlegen der Kantenränder komplizierter als es wert ist.

Option 2: Überlappende Zellen

Zeichnen Sie die volle Umrandung um jeden Gegenstand, aber passen Sie die Rahmen so an, dass sie sich um die Hälfte der Breite der Umrandungen überlappen und die Redundanz verstecken.

Dies ist die einfachste Strategie und funktioniert gut, aber beachten Sie einige Dinge:

  • Beachten Sie, dass die äußeren Kanten des Layouts ebenfalls leicht verändert sind. Kompensieren Sie dies bei Bedarf.
  • Die Rahmen überlappen sich, so dass Sie keine halbtransparenten Rahmen verwenden können.
  • Wenn nicht alle Ränder dieselbe Farbe haben, fehlen einige Kanten. Wenn es nur eine einzelne Zelle mit einem anderen Rand gibt, können Sie den Z-Index des Objekts anpassen, um ihn über die anderen Zellen zu bringen.

Option 3: Manuelles Zeichnen

Anstatt Grenzen für die Zelle zu verwenden, können Sie einen Rahmen um den Container hinzufügen und anschließend die Grenzen in der Superansicht manuell zeichnen. Dies könnte durch Überschreiben von drawRect(_:) und Verwenden von UIBezierPaths zum Zeichnen von horizontalen und vertikalen Linien in den Intervallen der Zellen erreicht werden. Dies ist die manuelleste Option. Es gibt Ihnen mehr Kontrolle, ist aber viel mehr Arbeit.

Option 4: Zeichnen Sie nur einige Grenzen in jeder Zelle

Anstatt die Rahmenbreite und die Rahmenfarbe der Ebene festzulegen, die einen Rahmen um die gesamte Ansicht zeichnet, zeichnen Sie die Ränder der Zellen selektiv. Zum Beispiel: jede Zelle konnte nur ihre untere und rechte Kante zeichnen, außer wenn keine Zelle über oder rechts davon ist.

Dies kann wiederum zu Komplikationen führen, wenn Sie ein unregelmäßiges Gitter haben. Es erfordert auch, dass jede Zelle über ihren Kontext im Raster informiert, der mehr Struktur erfordert. Wenn Sie diesen Weg gehen, würde ich vorschlagen, subclassing UICollectionViewLayoutAttributes und zusätzliche Informationen darüber, welche Kanten gezeichnet werden sollten. Die Kantenzeichnung selbst kann erneut durchgeführt werden, indem UIBezierPath in drawRect(_:) für jede Kante erstellt wird.

    
Anthony Mattox 15.10.2015, 22:33
quelle
3

Normalerweise dividiere ich die Rahmenbreite durch die Bildschirmskalierung:

%Vor%     
Wilmar 15.10.2015 11:40
quelle
0

Verwenden Sie nativeScale!

%Vor%     
katleta3000 15.10.2015 11:50
quelle
0

Im Hinblick auf die sehr gründlich akzeptierte Antwort glaube ich nicht, dass eine dieser Methoden sehr sauber ist. Um dies in allen Szenarien gut aussehen zu lassen, werden Sie das Raster "manuell" zeichnen wollen, aber dies in einem drawRect zu tun ist keine gute Idee a), da dies Ihre Zellen unter zeichnen wird b) drawRect malt den Bildschirm 60 Mal pro Sekunde, so dass bei einer großen Scroll-Ansicht Performance-Probleme auftreten.

Besser IMO ist CALayers zu verwenden. Mit CALayer können Sie einmal eine Gitterlinie auf die Ansicht legen und von da an auf der GPU bleiben, so dass sogar ein riesiges Raster mit 60 fps gezeichnet werden kann. Ich finde auch die Implementierung einfacher und flexibler. Hier ist ein funktionierendes Beispiel:

%Vor%     
John Scalo 22.03.2018 16:25
quelle