• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

UIView nicht leeren vor dem Reinmalen

mr.winkle

Fießers Erstling
Registriert
16.08.07
Beiträge
126
Hallo Leute,
ich habe hier ein UIView mit einer eigenen Klasse um in selbiges per CoreGraphics reinzumalen.
Im drawRect dieses Views verfahre ich so:
Code:
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(ctx, 0.84, 0.45, 0.0, 1.0);
CGContextFillEllipseInRect(ctx, ...);
...
...
und so weiter. Ich cleare / übermale nirgendwo das komplette View.
Im Interface Builder ist dieses View lediglich auf "Opaque" gestellt, auch "Clear Context before Drawing" ist False.
Trotzdem wird das View anscheinend vor dem Zeichnen geleert, es wird immer nur das angezeigt was ich beim letzten Durchlauf gemalt habe. Ich würde mich aber gern selber um das Leeren des Views kümmern.
Habe ich das was übersehen, oder kann man das automatische Leeren woanders ausschalten?

Dankeschön,
mr.winkle
 

Termy

Boskop
Registriert
28.12.09
Beiträge
209
Ich würde sagen, dass du mit diesem Befehl
CGContextSetRGBFillColor(ctx, 0.84, 0.45, 0.0, 1.0);
Den Kompletten Bereich neu einfärbst. Ist also klar, dass du nachher nichts mehr siehst
 

mr.winkle

Fießers Erstling
Registriert
16.08.07
Beiträge
126
Danke für den Versuch, aber damit färbe ich nichts ein - dieser Befehl stellt lediglich die im darauf folgenden Befehl benutzte Farbe ein.
Die eingestellte Farbe ist Orange, das wäre mir also aufgefallen.
Warte weiterhin auf Antworten...
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
@Termy: Diese beiden Funktionen tun aber nicht dasselbe. Das Eine ist die fillColor, das andere die strokeColor. Ersteres wird zum Füllen verwendet, letzteres zum Zeichnen des Randes.

@mr.winkle: Die drawRect-Methode wird dann aufgerufen, wenn das View NEU gezeichnet werden muss. Wann dieser Fall eintritt, entscheidet das System. Und dieses wird das schon richtig machen. Deine Vorstellung von, dass man immer wieder das View erweitern kann, ohne die alten Dinge auch neu zu zeichnen, widerspricht dem Cocoa- bzw. UIKit-Konzept von Views. Du musst dir also alle alten gezeichneten Dinge speichern lassen, um sie dann bei jedem drawRect-Aufruf neu zu zeichnen.

Eine Idee wäre, du machst NSArrays mit den Positionsdaten und der Farben deiner Ellipsen. Diese Arrays erweiterst du dann immer, wenn du was Neues zeichnen willst und lässt in der drawRect-Methode dann eine Schleife über sämtliche Einträge laufen.

Du kannst das Ganze noch ein Wenig effizienter machen, indem du das Argument der Methode in Betracht ziehst. Dieses rect beschreibt nämlich den Anteil des Views, der effektiv neu gezeichnet werden muss. Oft ist das das ganze View, manchmal aber auch nicht. Schau in jedem Schleifendurchgang, ob die Ellipse ganz oder teils innerhalb dieses rects ist. Wenn ja, neu zeichnen, wenn nein, continue! Weiter kannst du deine Einrichtung MVC-konform machen, das hilft auch!

Gruss ppocket