Nur die weiße Füllfarbe ist in UIView transparent

8

Ich habe ein UIView , das auf opaque = NO gesetzt ist und alles funktioniert gut. In drawRect mache ich benutzerdefinierte Zeichnung, und das funktioniert

%Vor%

aber das

%Vor%

führt dazu, dass KEINE Füllung erzeugt wird (Sie können sogar andere Sachen sehen, die ich über den CGContext gezeichnet habe). Wie kann ich eine weiße Füllung zeichnen?

Hinweis: Wenn das Steuerelement nicht undurchsichtig ist, funktioniert es immer noch nicht.

    
Dan Rosenstark 18.09.2010, 18:41
quelle

1 Antwort

17

Warum nicht CGContextSetFillColorWithColor verwenden? Dann können Sie das CGColor-Objekt direkt übergeben, anstatt seine Komponenten zu extrahieren und anzunehmen, dass es sich im selben Farbraum wie der Kontext befindet.

Bearbeitet zum Hinzufügen:

  

das funktioniert

%Vor%      

aber das

%Vor%      

führt dazu, dass KEINE Füllung erzeugt wird (Sie können sogar andere Sachen sehen, die ich über den CGContext gezeichnet habe).

Wie bereits erwähnt, setzt diese Art der Füllfarbe voraus, dass sich die Farbe im selben Farbraum wie der Kontext befindet.

Normalerweise befinden sich die meisten CGContexte in einem RGB-Farbraum. whiteColor hingegen ist fast sicher in einem weißen Farbraum, der nur ein oder zwei (weiße und Alpha) Komponenten aufweist.

Da also der Kontext in einem RGB-Farbraum liegt, erwartet CGContextSetFillColor , dass drei oder vier Komponenten (rot, grün, blau und alpha) übergeben werden. Wenn Sie die Komponenten von whiteColor CGColor erhalten, erhalten Sie einen Zeiger auf ein C-Array, das nur zwei Komponenten enthält. CGContextSetFillColor liest die drei oder vier Komponenten, die es will, egal was; Wenn Sie weniger passieren, kann es Müll nach ihnen finden, oder es kann Nullen finden.

Wenn es eine Null in der Alpha-Position findet, dann haben Sie die Füllfarbe auf etwas zwischen gelb (rot = 1.0, grün = 1.0, blau = 0.0) und weiß (alle drei = 1.0) eingestellt Null Alpha. Dadurch wird die Füllung nicht angezeigt: Sie füllen mit einer transparenten Farbe.

Das Problem besteht darin, dass der Farbraum, in dem sich der Kontext befindet (mit drei oder vier Komponenten), und der Farbraum, in dem sich die Farbe befindet (mit einer oder zwei Komponenten), nicht übereinstimmen. Die Lösung besteht darin, die fehlende Übereinstimmung zu entfernen, was CGContextSetFillColorWithColor bewirkt: Da Sie das gesamte CGColor-Objekt und nicht nur ein Zahlenfeld übergeben, kann Core Graphics den Farbraum des Kontexts auf den des Farbobjekts und einstellen interpretiere die Komponenten des Farbobjekts korrekt.

    
Peter Hosey 18.09.2010, 20:01
quelle

Tags und Links