2017-08-15 4 views
1

Ich habe eine UIScrollView, die eine "Draw View" enthält, die der Benutzer freihändig mit UIBezierPath zeichnen kann. Es verwendet CATiledLayer, damit ich ohne Unschärfe zoomen kann.EXC_BAD_ACCESS beim Streichen von UIBezierPath während der Übersetzung mit CATiledLayer

Wenn ich die Pfade zeichnen, gibt es keinen Fehler EXC_BAD_ACCESS trotz mehrmals aufgerufenen Strich. Wenn ich jedoch einen Pfad mit CGAffineTransForm umsetze, dauert es weniger als ein paar Sekunden, bevor ein EXC_BAD_ACCESS-Fehler ausgelöst wird, wenn der Pfad gestreichelt wird. Es erzeugt auch visuell Artefakte mit dem Pfad.

Ich bin mir sicher, dass dies etwas mit CATiledLayer zu tun hat, das die Übersetzung nicht mag, denn wenn ich CATiledLayer nicht mehr benutze, gibt es überhaupt kein Problem - der Pfad übersetzt sich wie erwartet ohne Artefakte. Ich brauche jedoch den CATiledLayer, um zu zoomen, ohne zu verwischen (soweit ich weiß, gibt es keine andere Möglichkeit, als contentscalefactor auf die Zoomstufe zu setzen).

Die Speicher-/CPU-Auslastung ist nicht anormal, wenn der Fehler ausgelöst wird.

Es ist erwähnenswert, dass ich die iOS 11 und Xcode 9 Betas verwende. (Bearbeiten: geschieht auch auf iOS 10, aber immer noch mit dem gleichen Xcode 9 Beta)

Ich habe versucht, Zombie-Objekte zu aktivieren, aber es liefert keine nützlichen Informationen.

+0

Aber Ihr Code ist geheim? – matt

Antwort

0

CATiledLayer verwendet mehrere Threads, um den Inhalt zu zeichnen. Viele UIKit-Operationen müssen vom Hauptthread aus ausgeführt werden. Der beste Weg, um die Vorteile des gekachelten Layers zu erhalten, sollte ein Core-Grafikpfad anstelle des UIKit-Pfads sein. Siehe auch Technical Q&A 1637.

+0

Ich habe versucht, einen CGPath zu zeichnen. Das funktioniert jetzt beim Übersetzen gut, aber stille stürzt mit EXC_BAD_ACCESS ab, wenn ich es versuche * skaliere * oder drehe es – user3290287

+0

Ohne deinen Code kann dir niemand helfen. – clemens

Verwandte Themen