2010-12-12 13 views
12

ho impostato un UIImage per il mio UIButton utilizzando [myButton setImage:forState:]; e ho impostato è contentMode usando [[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; Ma quando si tocca il tasto, risale al UIViewContentModeScaleToFill e si estende fuori la mia immagine.UIButton ignorando contentMode quando evidenziata (adjustsImageWhenHighlighted)

utilizzando risolve questo problema, ma poi perdo l'effetto di oscuramento, che vorrei mantenere.

Qualche suggerimento su come far fronte a questo?

+0

Ho lo stesso problema. iniziando a pensare che non c'è modo di aggirare questo ... – jasongregori

risposta

2

la mia soluzione a questo problema (forse non efficiente, ma ti dà un'opportunita 'di personalizzare l'effetto di evidenziazione, penso che sembra meglio di quello standard) è:

  • sottoclasse UIButton naturalmente.
  • add property @property (nonatomic, retain) UIView * highlightView;
  • metodo di fissazione dell'immagine (il mio metodo, è possibile utilizzare la modalità diversa importante per impostare la proprietà adjustsImageWhenHighlighted)

    [self setImage:image forState:UIControlStateNormal]; 
    [self setAdjustsImageWhenHighlighted:NO]; 
    
  • Override setHighlighted: metodo in questo modo:

    \- (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]; 
        } 
    } 
    

questo funziona per me, ma se c'è un modo migliore, sarò felice di conoscerlo.

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 problemi: 1. non si rilascia mai la vista di immagini in doHighlighted :, 2. subviewWithTag: dovrebbe essere viewWithTag :. Un consiglio: invece di CGRectMake() in doHighlighted :, usa semplicemente button.bounds; Oltre a questo, questo funziona bene. – vakio

+0

davvero una grande risposta, grazie. –

0

Per qualche motivo che si verifica quando si imposta la modalità contenuti dopo impostazione dell'immagine per qualsiasi stato.

Assicurarsi di impostare la modalità di contenuto prima di impostando le immagini, in modo programmatico e su InterfaceBuilder. Per risolvere questo problema su IB, assicurati di rimuovere tutte le immagini impostate per tutti gli stati, imposta la modalità di contenuto, quindi ripristina le immagini.

Questo lo ha risolto per me.