2010-12-12 11 views
12

ustawić UIImage dla mojego UIButton używając [myButton setImage:forState:]; i ustawić to contentMode użyciu [[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; Ale po dotknięciu przycisku, to wraca do UIViewContentModeScaleToFill i rozciąga się mój wizerunek na zewnątrz.UIButton ignorując contentMode gdy podświetlony (adjustsImageWhenHighlighted)

przy użyciu adjustsImageWhenHighlighted naprawia to, ale potem tracę efekt ciemnienia, który chciałbym zachować.

Jakieś sugestie, jak sobie z tym poradzić?

+0

Mam ten sam problem. zaczynamy myśleć, że nie da się tego obejść ... – jasongregori

Odpowiedz

2

moje rozwiązanie tego problemu (może nie skuteczne, ale to daje przegapisz aby dostosować efekt podświetlenia, myślę, że wygląda lepiej niż standardowego) wynosi:

  • podklasa UIButton oczywiście.
  • dodaj właściwość @property (nonatomic, retain) UIView * highlightView;
  • metoda ustawiania obrazu (moje metody, można użyć trybu inny ważny ustawić właściwość adjustsImageWhenHighlighted)

    [self setImage:image forState:UIControlStateNormal]; 
    [self setAdjustsImageWhenHighlighted:NO]; 
    
  • przesłanianie setHighlighted: metoda tak:

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

to działa dla mnie, ale jeśli jest lepszy sposób, z przyjemnością go poznam.

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 problemy: 1. nigdy nie wypuszczaj obrazu w doHighlighted :, 2. subviewWithTag: should be viewWithTag :. Również wskazówka: zamiast CGRectMake() w doHighlighted :, po prostu użyj button.bounds; Poza tym to działa dobrze. – vakio

+0

Naprawdę świetna odpowiedź, dzięki. –

0

Z jakiegoś powodu, co dzieje się, gdy ustawienie trybu Zawartość składników po ustawienia obrazu dla każdego państwa.

Upewnij się, że ustawiłeś tryb zawartości przed ustawiania obrazów, programowo i również w InterfaceBuilder. Aby naprawić to na IB, usuń wszystkie obrazy ustawione dla wszystkich stanów, ustaw tryb zawartości, a następnie ponownie umieść obrazy.

To naprawiło to dla mnie.