J'ai un couple UIButtons, et au bureau de l'IB ils sont définis à l'Aspect de la forme, mais pour une raison quelconque, ils sont toujours à l'étirement. Est-il autre chose que vous avez à régler? J'ai essayé tous les modes de vue différents, et aucun d'eux de travailler, ils ont tous de s'étirer.
Réponses
Trop de publicités?J'ai eu ce problème avant. Je l'ai résolu en mettant mon image dans un UIImageView
où contentMode
paramètres de travail, et de mettre un transparent personnalisée UIButton
sur le dessus de cela.
EDIT: Cette réponse est obsolète. Voir @Werner Altesischer réponse à la réponse correcte dans les versions modernes de iOS.
Si vous placez l'image dans une UIImageView
derrière le bouton, vous perdrez la fonctionnalité intégrée de l' UIButton
classe, comme adjustsImageWhenHighlighted
et adjustsImageWhenDisabled
, et bien sûr la possibilité de définir des images différentes pour les différents états (sans le hazzle de le faire vous-même).
Si nous voulons avoir une image unstreched pour tous les états, l'un approuch est d'obtenir l'image à l'aide d' 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 mettre en œuvre cette nous écrire:
UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];
Cela devrait permettre d'éviter l'image d'étirement dans tous les états. Il a travaillé pour moi, mais laissez-moi savoir si ce n'est pas!
REMARQUE: Ici, nous abordons un problème lié à l' UIButton
, mais l' insideButton:
pourrait tout aussi bien être insideView:
, ou ce que l'on souhaite ajuster l'image à.
J'ai eu ce problème à un moment de retour. Le problème que j'ai eu était que j'essayais d'appliquer cet effet à l'arrière-plan UIButton qui est limitée et, par conséquent, vous ne pouvez l'ajuster comme facile.
L'astuce est de le définir comme une simple image, puis appliquer @ayreguitar technique et cela devrait résoudre le problème!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
Cette réponse est fondée sur @WernerAltewischer de réponse.
Pour éviter de devoir brancher mon bouton à un IBOutlet pour exécuter le code, je sous-classé UIButton de la classe:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
Maintenant créer un bouton personnalisé dans votre xib, et de définir son image (pas l'image d'arrière-plan):
Ensuite, définissez sa classe:
Vous avez terminé!
Au lieu de
votre bouton image de l'aspect ajustement est maintenant comme prévu: