Schwarze Ecken auf gruppierten UITableViewCells nur nach Navigation Pops

8

Ich bin kein Grafikexperte, aber irgendwie gelang es mir, einige gut aussehende benutzerdefinierte UITableViewCells zu erstellen, indem ich die Hintergrundansicht auf eine backgroundView mit irgendeinem CG-Code setzte. In allen SDKs bis zu 3.1.3 (vielleicht 3.2 ... ich habe nicht auf dem iPad getestet) funktionierte das großartig, aber ich denke, ein neueren SDK hat eine Änderung in der Art eingeführt, wie Grafiken außerhalb des Bildschirms zwischengespeichert werden.

>

Beim ersten Rendern ist alles gut: Die Zeichnung ist in Ordnung und die Ecken sind transparent. Wenn ich ein paar View-Controller auf den Navigations-Stack drücke und zurückkomme, erscheinen jetzt schwarze Ecken in den Ansichten:

VOR & amp; & amp; NACH

alt text http://new.tinygrab.com/c1f9e8196b4b92e6bb4d3130a7e08974.png altext http://new.tinygrab.com/531ee83e42cdeadc78d418d1c5e7c513.png

Ich habe Tonnen von Code, die meisten davon hier . Ich habe versucht, das Beste aus meinen Fähigkeiten zu machen, indem ich mir die Dokumente für die entsprechenden Änderungen ansehe, aber nach mindestens 8 Stunden kann ich immer noch nicht herausfinden, was das verursachen könnte. Ich habe versucht, jede Sicht, die ich mir vorstellen kann, auf backgroundColor=clearColor und opaque=NO zu setzen. Was fehlt mir noch? Irgendwelche Debugging-Tipps?

UPDATE:

Ich habe einen Debug-Code in viewDidAppear , der die backgroundColor- und class-Beschreibung aller Subviews ausgibt.

%Vor%

Mit diesem Code überprüfe ich die backgroundColor-Einstellungen der Zellenansichten beim ersten Laden, wenn es in Ordnung ist, und dann wieder nach dem Zurückkommen. Es gibt einige Unterschiede, aber alle Farben sind immer noch klar definiert. Dies führt zu der Annahme, dass das Problem unter der UITableViewCell liegt.

UPDATE 2:

Ich habe eine einfache Beispielanwendung erstellt, um das Problem hervorzuheben.

    
coneybeare 11.05.2010, 14:38
quelle

3 Antworten

5

Ich habe die Beispielanwendung getestet und kann das Problem der schwarzen Ecken reproduzieren.

Nach einigen Experimenten scheint es, dass das Problem der schwarzen Ecken mit dem Zwischenspeichern der Ebenen zusammenhängt, die zum Rendern der Tabellenansicht verwendet werden. Die Geometrie der Zellenschicht scheint wichtig zu sein:

  • Auf der ersten Farbe wird die Zelle gebeten, zu einem Rect zu malen. Ihr Code zeichnet einen abgerundeten Pfad, aber abgeschnitten die Ecken. Da die zugrunde liegende Tabellenansicht bereits gezeichnet wurde, tritt kein Problem auf. Die Rect-Zone wird zwischengespeichert und die Ecken sind nicht bemalt.
  • Wenn der Controller gedrückt wird, wird ein zwischengespeichertes Bild mit rechteckigen Platzhaltern für die Zellen gespeichert.
  • Wenn der Controller aufgerufen wird, werden das zwischengespeicherte Bild und die Zellen gezeichnet. Aber die Stelle, an der Zellen gezeichnet werden, ist rechteckig, aber das zwischengespeicherte Bild der Zelle ist nicht, was zu schwarzen Ecken führt.

Um die schwarzen Ecken loszuwerden, kannst du:

  • Stellen Sie sicher, dass alle Rect der Zelle gemalt ist. Das bedeutet, dass Sie die Zelle vor dem Zeichnen der Kante als Hintergrundfarbe der Tabellenansicht mit derselben Farbe versehen. Wenn Ihre Tabellenansicht die Standardhintergrundfarbe verwendet, können Sie [UIColor groupTableViewBackgroundColor].CGColor als Füllfarbe verwenden; es ist eine musterbasierte Farbe und folgt der Geräteausrichtung (yeah); aber das Bild ist nicht perfekt auf den Hintergrund ausgerichtet (verdammt).
  • Verwenden Sie eine CALayer-Maske auf der Ebene der Zelle. Dazu muss eine Maske CGImage erstellt, als Inhalt der Ebene festgelegt und die Maskenebene der Ebene der Zelle zugewiesen werden. Ich bin mir nicht sicher über die Leistung.

Ich hoffe, es hilft ein bisschen.

Aktualisieren

Nach einigen erfolglosen Versuchen habe ich die Maskenidee fallen gelassen, weil sie zu ungeschickt war.

Ich habe den Code für die Ebene der Zelle erneut gelesen und herausgefunden, wie man die schwarzen Ecken auf einfache Weise entfernen kann. Die Grundidee ist, dass ein CAGradientLayer nur dann vollständig transparent ist, wenn seine Farbverläufe klar sind. Mit der folgenden display -Methode verschwanden die schwarzen Ecken (sowohl im Simulator als auch auf dem Gerät):

%Vor%

Natürlich könnte dies ein wenig optimiert werden:

  • Erstellen Sie die Farbfelder einmal.
  • Geben Sie einen benutzerdefinierten Setter für die override -Eigenschaft an, der die Farben der Ebene ändert.
  • Entfernen Sie die Methode display , da sie nicht mehr benötigt wird.
Laurent Etiemble 14.05.2010, 18:33
quelle
2

Ich habe mit Ihrem Beispielcode mit OS3.2 auf dem Simulator experimentiert und es zeigt definitiv das gleiche Symptom. Ich habe ein paar Dinge ausprobiert und bin mit diesem Fix fertig geworden:

%Vor%

Fügen Sie dies in UAGradientCellBackgroundLayer in init method hinzu.

    
progrmr 13.05.2010 21:30
quelle
0

Wenn Sie das hier rauswerfen (vielleicht wird es helfen), hat das Hinzufügen des folgenden zu cellForRowAtIndexPath einen interessanten Effekt:

%Vor%

Nicht alle Zellen haben den schwarzen Hintergrund. Das Ändern des Alphas scheint die Wahrscheinlichkeit zu ändern, dass eine bestimmte Zelle nicht korrekt gerendert wird. Alpha = 1.0 garantiert einen schwarzen Hintergrund, während jede niedrigere die Wahrscheinlichkeit dieses Effekts verringert.

Der schwarze Hintergrund wird ebenfalls ausgeblendet. Ich bin mir sicher, dass ihr alle wisst, aber ja, es hat mit der UAGradientCellBackgroundView zu tun.

Viel Glück!

    
Daniel Amitay 14.05.2010 20:39
quelle