UIButton игнорируя contentMode при выделении (AdjusttsImageWhenHighlighted) - PullRequest
12 голосов
/ 12 декабря 2010

Я установил UIImage для своей кнопки UIB, используя [myButton setImage:forState:];, и установил contentMode, используя [[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; Но когда вы нажимаете кнопку, она возвращается к UIViewContentModeScaleToFill и растягивает мое изображение.

Использование adjustsImageWhenHighlighted исправляет это, но затем я теряю эффект затемнения, который я хотел бы сохранить.

Любые предложения о том, как справиться с этим?

Ответы [ 3 ]

4 голосов
/ 12 октября 2011
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 голосов
/ 04 апреля 2011

Мое решение этой проблемы (возможно, неэффективное, но оно дает вам возможность настроить эффект выделения, я думаю, что оно выглядит лучше стандартного):

  • Подкласс UIButton, конечно.
  • добавить свойство @property (nonatomic, retain) UIView * highlightView;
  • метод для установки изображения (мой метод, вы можете использовать другой режим, важный для установки свойства corretsImageWhenHighlighted)

    [self setImage:image forState:UIControlStateNormal];
    [self setAdjustsImageWhenHighlighted:NO];
    
  • переопределить setHighlighted: метод, подобный так:

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

Это работает для меня, но если есть лучший способ, я будурад узнать это.

0 голосов
/ 27 февраля 2013

По какой-то причине это происходит, когда вы устанавливаете режим контента после установки изображения для любого состояния.

Убедитесь, что вы установили режим контента до установкиизображения, программно и на InterfaceBuilder, а также.Чтобы исправить это на IB, убедитесь, что вы удалили все изображения, установленные для всех состояний, задали режим содержимого, а затем снова вернули изображения.

Это исправило это для меня.

...