Si vous placez l'image dans un UIImageView
derrière le bouton, vous perdrez la fonctionnalité intégrée de la UIButton
classe, telle que adjustsImageWhenHighlighted
et adjustsImageWhenDisabled
, et bien sûr la possibilité de définir différentes images pour différents états (sans avoir à le faire vous-même).
Si nous voulons avoir une image non étirée pour tous les états de contrôle , une approche consiste à obtenir l'image en utilisant imageWithCGImage:scale:orientation
, comme dans la méthode suivante:
- (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;
}
Pour implémenter cela, nous écririons:
UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];
Cela devrait empêcher l'image de s'étirer dans tous les états de contrôle. Cela a fonctionné pour moi, mais faites-moi savoir si ce n'est pas le cas!
REMARQUE: Ici, nous abordons un problème lié à UIButton
, mais le insideButton:
pourrait aussi bien être insideView:
, ou à tout ce que l'on souhaite insérer dans l'image.