2017-03-10 5 views
0

J'ai une image générée en tant que NSImage, puis je la dessine dans ma sous-classe NSView, en utilisant une méthode draw() personnalisée.Comment dessiner un NSImage, mais disparaître sur le côté (gradient alpha linéaire)?

Je souhaite modifier cette vue personnalisée afin que l'image soit dessinée au même endroit, mais qu'elle s'efface sur le côté. C'est-à-dire, il est dessiné comme un gradient linéaire, de alpha = 1.0 à alpha = 0.0.

Ma meilleure estimation est l'une des variantes de draw() avec NSCompositingOperation qui pourrait m'aider à faire ce que je veux, mais j'ai du mal à comprendre comment ils pourraient faire cela. Je ne suis pas un expert graphique, et les documents NSImage et NSCompositingOperation semblent utiliser une terminologie différente.

La version rapide: à peu près this question mais sur macOS au lieu d'Android.

Répondre

2

Vous êtes sur la bonne voie. Vous devrez utiliser NSCompositingOperationDestinationOut pour y parvenir. Cela va effectivement percer la destination en fonction de l'alpha de la source en cours de tirage. Donc, si vous dessinez d'abord votre image et que vous dessinez ensuite un dégradé de alpha 0.0 à 1.0 avec l'opération .destinationOut en haut, vous obtiendrez votre image avec alpha 1.0 à 0.0

Parce que ce poinçon arrive à tout ce qui est déjà dans le magasin de support où le dégradé est dessiné, vous devez faire attention où/comment vous l'utilisez.

  • Si vous voulez faire tout cela dans le dessin de la vue, vous devez faire le dessin de l'image et le poinçon à gradient dans un transparency layer utilisant CGContextBeginTransparencyLayer et CGContextEndTransparencyLayer pour éviter poinçonnage toute autre chose.
  • Vous pouvez également créer d'abord un nouveau NSImage pour représenter cette variante évanouie, en utilisant le drawingHandler constructor ou le NSCustomImageRep et en faisant le même dessin de dégradé & (sans vous soucier des calques de transparence). Ensuite, dessinez cette image dans votre vue ou utilisez simplement cette image avec un NSImageView.