• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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