2010-10-06 26 views
1

Je crée un UIButton programme, puis en ajoutant une image masquée avec setImage:Comment faire UIButton utilise correctement une image masquée?

CGRect photoFrame = CGRectMake(11, 11, 180, 120); 
UIButton *cardPhotoButton = [[UIButton alloc] initWithFrame:photoFrame]; 
cardPhotoButton.backgroundColor = [UIColor clearColor]; 

UIImage *cardPhoto = [[UIImage alloc] init]; 
cardPhoto = [self maskImage: 
[UIImage imageNamed:[metaDict objectForKey:@"Photo"]] withMask:[UIImage imageNamed:@"CardPhotoFrame.png"]]; 

[cardPhotoButton setImage:cardPhoto forState:UIControlStateNormal]; 

cardPhotoButton.contentMode = UIViewContentModeScaleAspectFit; 

[self addSubview:cardPhotoButton]; 

Le masquage est fait avec cette méthode, je suis arrivé sur le web:

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
    return [UIImage imageWithCGImage:masked]; 
} 

Maintenant, le problème est que le masquage pour l'état par défaut ne fonctionne pas, mais bizarrement quand je clique réellement sur le bouton et que le bouton passe à l'état "en surbrillance", les parties transparentes de l'image masquée commencent à fonctionner.

Je suppose que j'ai besoin de mettre quelque peu de couleur BG à clearColor quelque part, mais je les ai tous essayés et aucun ne fonctionne.

Des idées que je pourrais manquer?

Répondre

1

Quelle est votre exigence actuelle? vous voulez des images différentes pour l'état normal et en surbrillance ou la taille de l'image ne correspond pas correctement au bouton?

Si le problème de l'image ne correspond pas correctement, la raison en est que vous devez définir le type du bouton en tant que type personnalisé.

+0

Je veux que tous les Etats aient la même image, mais je dois le masque d'image au travail et en la transparence de l'image n'apparaît pas dans l'état par défaut, uniquement dans l'état HighLighted. – margusholland

+0

Y a-t-il un besoin spécifique de masquage? Si vous voulez que la même image que vous voulez faire apparaître le bouton en tant que dimension de votre image, il suffit de définir le type de bouton personnalisé et de définir l'image pour l'état normal, en surbrillance et sélectionné. donc l'image restera la même dans tous les cas. J'espère maintenant que vous pouvez trouver la solution. –

+0

L'image est en fait une photo que je veux ajouter un masque qui fera de la photo un cadre spécifique que j'essaie d'ajouter. Et en créant un nouveau UIButton mon défaut en fait un UIButtonTypeCustom n'est-ce pas? – margusholland

0

vous pouvez utiliser: OBShapedButton, https://github.com/ole/OBShapedButton

OBShapedButton est une sous-classe UIButton optimisé pour la forme des boutons non rectangulaires. Les instances de OBShapedButton ne répondent aux touches que dans les zones où l'image affectée au bouton pour UIControlStateNormal est non transparente.

J'ai eu cette réponse de cette question: How Do I Create a Circular UIButton?

cela a fonctionné parfaitement pour moi :)