2010-11-29 11 views
19

Meine Frage ist sehr ähnlich zu diesem Not drawing outside bounds when clipToBounds=NO, die keine klare Antwort erhalten.draw außerhalb von UIView Grenzen von DrawRect

Grundsätzlich habe ich eine UIView, und ich möchte eine Linie von der Mitte, bis zum Rand des Bildschirms zeichnen. Mit [self convertPoint:(CGPoint){0,0} fromView:[self superview]]; (das den Ursprung in Bezug auf die Superansicht meiner Ansicht findet) zu berechnen ist einfach, aber wenn ich eine Linie aus meiner Ansicht zeichnen drawRect: es wird an den Grenzen meiner Ansicht abgeschnitten.

Gibt es einen Weg zu Ich habe versucht, die clipsToBounds-Eigenschaft zu ändern, aber es scheint keinen Effekt zu haben

Ich kann meine Zeilen nicht aus der Superview zeichnen, weil ich dies mit mehreren Ansichten tun muss und einige werden vor anderen sein ... herauszufinden, die Schicht von der Superview DrawRect scheint wie eine schlechte Idee.

Ebenso kann ich nicht nur die Größe meiner Ansicht einschränken, einzuschließen der gesamte Bildschirm, weil meine Ansichten dynamisch skalierbar sein müssen ... die Grenzen müssten RIESIG sein (> 20.000 Punkte), damit dies funktioniert.

+0

Für den Datensatz, ging ich mit einer Geschwisteransicht, und nur süchtig alle Methoden, die ich benutze, um Ansicht neu zu ordnen, um sicherzustellen, dass sie auch die Geschwisteransicht verschieben. Dies machte die Leistung deutlich besser, da die maximale Größe für jede meiner Ansichten die Größe des Bildschirms ist. –

Antwort

8

Ich würde nicht empfehlen, immer außerhalb der Grenzen einer Ansicht zu zeichnen. Entweder muss Ihre Ansicht automatisch angepasst werden, um Ihre Zeichnung einzubeziehen, oder Sie benötigen transparente überlappende Ansichten. Oder beides. Ich kann mir keine Situation vorstellen, die keiner dieser Fälle abdecken würde, aber mir fehlt vielleicht die Vorstellungskraft. =)

Wahrscheinlich passiert gerade, dass wenn die Superansicht neu gezeichnet wird, sie der Superansicht sagt, dass sie neu gezeichnet werden muss, was zum Löschen der Zeichnung führt, die du draussen machst. Es ist eine Weile her, dass jemand, der besser informiert ist, mich korrigieren kann (sollte!), Wenn ich falsch liege.

Ich weiß nicht, ob "Quartz Debug" (von den Standard-Apple-Entwickler-Tools installieren, /Developer/Applications/Performance Tools/Quartz Debug) im Simulator funktioniert, aber es ist einen Versuch wert. Es hat einen Modus, der Ihnen zeigt, wann und wie oft das Neuzeichnen stattfindet, mit einem Rahmen und einer optionalen Verzögerung bei den Aktualisierungen.

Sie können tun, was Sie fragen, aber Sie müssen die Unteransichten jedes Mal neu zeichnen, wenn Sie die Grenzen der Unteransicht überschreiten. Dies bedeutet, dass Ihre Superansicht die untergeordneten Elemente manuell innerhalb der Zeichenfunktion zeichnen muss . Im Wesentlichen würden Sie das Zeichnungs-Paradigma von Apple herauswerfen und Ihre Sub-Views einfach dazu bringen, sich wie eine Zeichnungserweiterung Ihrer Hauptansicht zu verhalten.

Wenn Ihre Bereiche so dynamisch sind, sollten Sie vielleicht in Prozenten des Bildschirms oder der Super-Ansicht statt in Punkten denken, es könnte mehr Sinn machen, zu codieren.

+0

Danke für den Rat. Es war hilfreich, das Problem aus einem anderen Blickwinkel zu betrachten. Ich ging mit Geschwisteransichten. –

+13

Ich habe einen Anwendungsfall: Ich möchte ein Rechteck zeichnen, das perfekt an die Grenzen seiner Superview angepasst ist; aber ich möchte auch ein kleines Dreieck hinzufügen, das unter dem Rechteck nach unten zeigt. Um dies effektiv zu tun, muss ich das kleine Dreieck aus den Grenzen der Ansicht ziehen. –

Verwandte Themen