Se você colocar a imagem UIImageView
atrás do botão, perderá a funcionalidade embutida da UIButton
classe, como adjustsImageWhenHighlighted
e e adjustsImageWhenDisabled
, claro, a capacidade de definir imagens diferentes para estados diferentes (sem o embaraço de fazer isso sozinho).
Se quisermos ter uma imagem não expandida para todos os estados de controle , uma abordagem é obter a imagem usando imageWithCGImage:scale:orientation
, como no seguinte método:
- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {
// Check which dimension (width or height) to pay respect to and
// calculate the scale factor
CGFloat imgRatio = img.size.width / img.size.height,
btnRatio = btn.frame.size.width / btn.frame.size.height,
scaleFactor = (imgRatio > btnRatio
? img.size.width / btn.frame.size.width
: img.size.height / btn.frame.size.height;
// Create image using scale factor
UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
scale:scaleFactor
orientation:UIImageOrientationUp];
return scaledImg;
}
Para implementar isso, escreveríamos:
UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];
Isso deve evitar que a imagem se estique em todos os estados de controle. Funcionou para mim, mas deixe-me saber se não funcionar!
NOTA: Aqui estamos tratando de um problema relacionado a UIButton
, mas insideButton:
pode muito bem ser insideView:
, ou qualquer outra coisa em que se gostaria de ajustar a imagem.