Pytanie UIButton ignoruje contentMode po podświetleniu (adjustsImageWhenHighlighted)


Ustawiłem UIImage dla mojego Uibuttonu przy użyciu [myButton setImage:forState:]; i ustawiłem to contentMode za pomocą [[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; Ale po dotknięciu przycisku, wraca do UIViewContentModeScaleToFill i rozciąga mój obraz.

za pomocą adjustsImageWhenHighlighted naprawia to, ale potem tracę efekt ciemnienia, który chciałbym zachować.

Wszelkie sugestie, jak sobie z tym poradzić?


12
2017-12-12 02:44


pochodzenie


mam ten sam problem. zaczyna myśleć, że nie da się tego obejść ... - jasongregori


Odpowiedzi:


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

4
2017-10-12 10:16



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
naprawdę świetna odpowiedź, dzięki. - Simha.IC


moje rozwiązanie tego problemu (może nieskuteczne, ale daje możliwość dostosowania efektu podświetlenia, myślę, że wygląda lepiej niż standardowy):

  • podklasa UIButton oczywiście.
  • dodaj właściwość @property (nonatomic, retain) UIView * highlightView;
  • metoda ustawiania obrazu (moja metoda, możesz użyć innego trybu ważnego do ustawienia właściwości adjustsImageWhenHighlighted)

    [self setImage:image forState:UIControlStateNormal];
    [self setAdjustsImageWhenHighlighted:NO];
    
  • przesłonić setHighlighted: metoda jak poniżej:

    \- (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, chętnie się z nim zapozna.


2
2018-04-04 11:53





Z jakiegoś powodu, który występuje po ustawieniu trybu zawartości po ustawienie obrazu dla dowolnego stanu.

Upewnij się, że ustawiłeś tryb zawartości przed ustawianie obrazów, programowo i na InterfaceBuilderze. 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.


0
2018-02-27 11:45