8
votes

UiImage pas transparent

J'essaie de faire une vue qui permet à un utilisateur de dessiner avec leur doigt. J'ai un PNG fabriqué en pixelmator de la brosse. Mon drawrect: la méthode ressemble à ceci:

- (void)drawRect:(CGRect)rect
{

    NSAssert(brush != nil, @"");

    for (UITouch *touch in touchesNeedingDrawing)
    {
        //Draw the touch
        [brush drawInRect:CGRectWithPoints([touch locationInView:self], [touch previousLocationInView:self]) blendMode:0 alpha:1];
    }

    [touchesNeedingDrawing removeAllObjects];
}


5 commentaires

La brosse est une uiimage, juste pour clarifier.


Pourquoi ne pouvez-vous pas utiliser un uiimageview?


Parce que j'aurais besoin de centaines de sous-visions d'UiImageView, qui seraient irréalistes. J'essaie de laisser un utilisateur peindre avec son doigt avec une image de brosse et chaque fois que leur doigt se déplace, j'aurais besoin d'un nouveau UiImageView. J'aurais aussi des problèmes de suppression.


Vous n'avez pas besoin d'un UIImageView pour chaque touche. En fait, la façon habituelle de faire cette tâche est de créer un UIImageView et de le dessiner en fonction de la saisie de l'utilisateur.


Je fais presque ce que vous suggérez, seulement j'utilise un UIView. Chaque fois que quelqu'un traîne au doigt, je dis à l'umisage de se dessiner à cet endroit.


6 Réponses :


0
votes

est la brosse png chargée à une vue d'ensemble de l'image? C'est-à-dire que la variable brosse est un objet d'UIImageView, n'est-ce pas? Si tel est le cas, peut-être simple xxx

aidera


3 commentaires

Je suggère de faire un uiimageview. UiImageView * brosse = [UIImageView Imagenamed: @ "Brush.png"];


BTW peut-être c'est la raison pour laquelle je pensais que ça va être uiimageview. Semble je suis entré en collision avec le même problème, travaillant avec UiImage.


Le seul problème avec c'est que je me retrouverais avec un grand nombre de points de vue que je ne pouvais jamais débarrasser de.



1
votes

Il semble que cela puisse prendre la couleur de remplissage actuelle du contexte.

Essayez de régler la couleur de remplissage pour le contexte avec CGContextsetFillColorWithColor () sur [Uicolor ClearColor] .CGCOLOR

Si cela ne fonctionne pas, la seule autre solution simple et ne devrait pas avoir de performance frappe est d'avoir 2 vues:

  • vue fond - ce sera une vue qui a la couleur d'arrière-plan appropriée ou l'image
  • Vue superposée - Cette vue détectera les touches, etc., puis attirez toutes les coups de pinceau sur le dessus. La couleur de fond de cette vue peut alors être [Uicolor ClearColor], donc lorsque vous dessinez les images de brosse, l'alpha sera rempli de [Uicolor ClearColor]. Fondamentalement, la même vue que vous avez maintenant, juste avec un fond clair.

    Remarque: vous ne devriez pas avoir besoin de gâcher avec le mode de mélange pour faire ce travail. Vous devriez être capable d'utiliser la méthode Drawnrect par défaut: Méthode


0 commentaires

0
votes
<< code> kcgblendmodestinationout .

Vous pouvez également dessiner au point à la place du point: xxx


0 commentaires

4
votes

solution est très simple, teste sur mon propre projet. En classe que vous avez mise à jour avec Custom - (VOID) Drawrect: (CGRRECT) RECLET SET IN - (ID) INIT Couleur d'arrière-plan pour soi

[Auto SetbackColor: [Uicolor ClearColor]];

Et c'est tout. Testé sur mon projet.


2 commentaires

+1. Super. Surtout voir le "je crois que ...", "ça dirait." Et "je devrais .." réponses. Les faits. Aimer :-)


@ goonlight - Je pense que vous avez voulu dire "testé" sur votre propre projet, pas "Testates" sur votre propre projet.



0
votes

Un problème possible est que vous définissez le blendmode sur 0. Je suggère d'utiliser la méthode -DrawinRect: sans mode de mélange. La question peut également être que votre point de vue a un fond noir, mais c'est douteux. Je suggérerais également de tenter d'afficher l'uiimage dans un UIImageView comme test. Le problème peut être lié à la façon dont Pixelmator exporte des images.


0 commentaires

0
votes

Votre problème est une idée fausse fondamentale de la façon dont Drawrect: fonctionne réellement. Chaque fois que vous dessinez quelque chose dans le contexte graphique actuel, tout ce qui était là auparavant sera effacé (de sorte que seul le fond de l'arrière-plan reste).

Puisque vous ne dessinez que la touche actuelle (ES) ( TouchSneDeDrawing est vidée), il n'y a rien sous le rectangle que vous remplissez qui pourrait montrer la transparence de l'image que vous dessinez, de sorte que la couleur de fond montre à travers.

Vous avez essentiellement deux options pour résoudre ce problème:

1) Gardez toutes les touches qui contribuent au dessin autour (ne videz pas le touchesNeedDrawingDrawingdrawingDrawing Tableau) et redessinez tous à chaque fois - cela va être facile mais assez lent.

2) dessine dans un tampon d'une sorte (par exemple un uiimage , en utilisant uigraphiquebeginimagecontext etc.). Chaque fois que votre dessin change, créez un nouveau tampon. Dessinez l'ancien tampon dans le nouveau tampon et les images pour le nouveau coup sur le dessus.


0 commentaires