2010-12-12 53 views
12

Je mis un UIImage pour mon UIButton en utilisant [myButton setImage:forState:]; et je l'ai mis à l'aide est contentMode[[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; Mais lorsque vous appuyez sur le bouton, il retourne à UIViewContentModeScaleToFill et étend mon image sur.UIButton ignorant contentMode lorsque mis en évidence (adjustsImageWhenHighlighted)

en utilisant adjustsImageWhenHighlighted corrige cela, mais ensuite je perds l'effet assombrissant, que je voudrais garder.

Des suggestions sur la façon de faire face à cela?

+0

J'ai le même problème. commencer à penser qu'il n'y a aucun moyen de contourner cela ... – jasongregori

Répondre

2

ma solution à ce problème (peut-être pas efficace, mais il vous donne une opportunité de personnaliser l'effet de mettre en évidence, je pense qu'il semble mieux qu'un standard) est la suivante:

  • sous-classe UIButton bien sûr.
  • ajouter la propriété @property (nonatomic, retain) UIView * highlightView;
  • méthode

    pour définir l'image (ma méthode, vous pouvez utiliser autre mode important de définir la propriété adjustsImageWhenHighlighted)

    [self setImage:image forState:UIControlStateNormal]; 
    [self setAdjustsImageWhenHighlighted:NO]; 
    
  • override setHighlighted: méthode comme ceci:

    \- (void)setHighlighted:(BOOL)highlighted { 
        if (!highlightView) { 
         self.highlightView = [[[UIView alloc] initWithFrame:self.bounds] autorelease]; 
         self.highlightView.backgroundColor = [UIColor darkGrayColor]; 
         self.highlightView.alpha = 0.0; 
         [self addSubview:self.highlightView]; 
        } 
        if (highlighted) { 
         [UIView beginAnimations:@"highlight" context:nil]; 
         [UIView setAnimationDuration:0.2]; 
         highlightView.alpha = 0.5; 
         [UIView commitAnimations]; 
        } 
        else { 
         [UIView beginAnimations:@"highlight" context:nil]; 
         [UIView setAnimationDuration:0.2]; 
         highlightView.alpha = 0.0; 
         [UIView commitAnimations]; 
        } 
    } 
    

Cela fonctionne pour moi, mais s'il y a un meilleur moyen, je serai heureux de le connaître.

4
UIButton *imageBtn = [UIButton ... 
imageBtn.adjustsImageWhenHighlighted = NO; 

[imageBtn addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside]; 

[imageBtn addTarget:self action:@selector(doHighlighted:) forControlEvents:UIControlEventTouchDown]; 
[imageBtn addTarget:self action:@selector(doHighlighted:) forControlEvents:UIControlEventTouchDragEnter]; 
    [imageBtn addTarget:self action:@selector(doCancelHighlighted:) forControlEvents:UIControlEventTouchDragExit]; 

-(void)doSomething:(UIButton *)button{ 
    ... 
    [self performSelector:@selector(doCancelHighlighted:) withObject:button afterDelay:0.2f]; 
} 

-(void)doHighlighted:(UIButton *)button{ 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 300, 300)]; 
    imageView.backgroundColor = [UIColor blackColor]; 
    imageView.alpha = 0.7; 
    imageView.tag = 1000; 
    [button addSubview:imageView]; 
} 

-(void)doCancelHighlighted:(UIButton *)button{ 
    UIView *view = [button subviewWithTag:1000]; 
    [UIView animateWithDuration:0.2f animations:^{ 
     view.alpha = 0; 
    } completion:^(BOOL finished) { 
     [view removeFromSuperview];   
    }]; 
} 
+2

2 problèmes: 1. vous ne libérez jamais l'imageview dans doHighlighted :, 2. subviewWithTag: devrait être viewWithTag :. Aussi un conseil: au lieu de CGRectMake() dans doHighlighted: il suffit d'utiliser button.bounds; A part ça, ça fonctionne bien. – vakio

+0

vraiment très bonne réponse, merci. –

0

Pour une raison quelconque qui se produit lorsque vous définissez le mode de contenu après réglage de l'image pour un Etat.

Veillez à régler le mode de contenu avant en réglant les images, par programme et sur InterfaceBuilder également. Pour résoudre ce problème sur IB, assurez-vous de supprimer toutes les images définies pour tous les états, de définir le mode de contenu, puis de remettre les images en place.

Cela a résolu pour moi.