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:
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?
Ich habe einen Debug-Code in viewDidAppear
, der die backgroundColor- und class-Beschreibung aller Subviews ausgibt.
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.
Ich habe eine einfache Beispielanwendung erstellt, um das Problem hervorzuheben.
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:
Um die schwarzen Ecken loszuwerden, kannst du:
[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). 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):
Natürlich könnte dies ein wenig optimiert werden:
override
-Eigenschaft an, der die Farben der Ebene ändert. display
, da sie nicht mehr benötigt wird. 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.
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!
Tags und Links iphone uitableview cocoa-touch uiview