Si vous placez l'image dans un UIImageViewderrière le bouton, vous perdrez la fonctionnalité intégrée de la UIButtonclasse, telle que adjustsImageWhenHighlightedet 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.