Кнопка UIB, игнорирующая contentMode при выделении (AdjusttsImageWhenHighlighted)
Я установил UIImage
для моего UIButton с помощью [myButton setImage:forState:];
и я установил это contentMode
с помощью [[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit];
Но когда вы нажимаете кнопку, он возвращается к UIViewContentModeScaleToFill
и растягивает мое изображение.
с помощью adjustsImageWhenHighlighted
исправляет это, но затем я теряю эффект затемнения, который я хотел бы сохранить.
Любые предложения о том, как справиться с этим?
3 ответа
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];
}];
}
Мое решение этой проблемы (возможно, неэффективное, но оно дает вам возможность настроить эффект выделения, я думаю, что оно выглядит лучше стандартного):
- подкласс 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]; } }
Это работает для меня, но если есть лучший способ, я буду рад узнать это.
По какой-то причине это происходит, когда вы устанавливаете режим содержимого после установки изображения для любого состояния.
Убедитесь, что вы установили режим содержимого перед настройкой изображений, программно, а также в InterfaceBuilder. Чтобы исправить это на IB, убедитесь, что вы удалили все изображения, установленные для всех состояний, задали режим содержимого, а затем вернули изображения обратно.
Это исправило это для меня.