2011-04-12 2 views
1

Dans un projet sur lequel je travaille, j'ai 3 images: haut, milieu et bas. Le haut et le bas sont à hauteur fixe, et le milieu doit être répété entre les deux. (La taille de la fenêtre va changer.) Ils sont tous teintés d'une couleur provenant des préférences de l'utilisateur, puis doivent avoir leur ensemble alpha en utilisant une valeur des préférences.Répéter un NSImage semi-transparent

Je peux faire à peu près tout. La partie sur laquelle je suis coincé est le dessin du milieu. J'ai décidé d'utiliser [NSColor +colorWithPaternImage:] serait la chose la plus facile à utiliser. Il y a beaucoup de code qui fait les images et les couleurs, donc supposons qu'ils existent et ne sont pas nuls.

int problem; // just to help explain things 

float alpha; 
NSImage *middleTinted; 

NSRect drawRect = [self bounds]; 
drawRect.size.height = self.bounds.size.height - topTinted.size.height - bottomTinted.size.height; 
drawRect.origin.y = topTinted.size.height; 

NSColor* colorOne = [NSColor colorWithPatternImage:middleTinted]; 
NSColor* colorTwo = [colorOne colorWithAlphaComponent:alpha]; 

if(problem == 1) 
{ 
    [colorOne set]; 
} 
else if(problem == 2) 
{ 
    [colorTwo set]; 
} 

[NSBezierPath fillRect:drawRect]; 

En supposant problem == 1, il dessine l'image correcte, au bon endroit et avec la taille correcte, mais pas alpha. (Évidemment, puisque je n'en ai pas spécifié un.)

Quand problem == 2, je m'attendrais à faire la même chose, mais avoir la bonne valeur alpha. Au lieu de cela, je reçois une boîte noire.

Existe-t-il une solution qui répètera l'image avec l'alpha correct? Je pense que je pourrais dessiner l'image manuellement en boucle, mais je préférerais une solution plus raisonnable si elle existe.

Répondre

1

Je suppose que le problème est que les couleurs de modèle ne prennent pas en charge -colorWithAlphaComponent:.

NSCell.h contient une méthode appelée NSDrawThreePartImage qui effectue le travail de dessin des extrémités et d'une image en mosaïque entre les deux. Il a également un paramètre alphaFraction qui devrait répondre à vos besoins. Si cela ne fonctionne pas pour vous, alors vous pouvez obtenir l'approche de la couleur du motif en retravaillant votre image middleTinted dans un nouveau NSImage, en utilisant la valeur alpha désirée. (Voir les méthodes draw de NSImage ...)

+0

La deuxième solution était celle que j'ai commencé à utiliser, mais 'NSDrawThreePartImage' fonctionnait bien et c'est évidemment une meilleure solution que la mienne. Merci! –