J'ai une vue d'image, déclarée par programme, et je configure son image, également par programme.
Cependant, je me trouve incapable de régler l'image pour qu'elle corresponde à l'aspect et aligne le centre sur la vue de l'image.
En d'autres termes, je veux que l'image:
Comment puis-je l'obtenir?
Il suffit de coller la solution:
Tout comme @manohar a dit
imageView.contentMode = UIViewContentModeCenter;
if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
imageView.contentMode = UIViewContentModeScaleAspectFit;
}
résolu mon problème
Dans la langue Swift, nous pouvons définir le mode de contenu de la vue UIImage comme suit:
let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Réponse mise à jour
Lorsque j'ai initialement répondu à cette question en 2014, il n'était pas nécessaire de ne pas agrandir l'image dans le cas d'une petite image. (La question était édité en 2015 .) Si vous avez une telle exigence, vous devrez en effet comparer la taille de l'image à celle de l'imageView et utiliser soit UIViewContentModeCenter
(dans le cas de une image plus petite que l'imageView) ou UIViewContentModeScaleAspectFit
dans tous les autres cas.
Réponse originale
Régler le contentMode de l'imageView sur UIViewContentModeScaleAspectFit
me suffisait. Cela semble également centrer les images. Je ne suis pas sûr de savoir pourquoi d'autres utilisent une logique basée sur l'image. Voir aussi cette question: aspect et ajustement iOS
J'ai résolu ce problème comme ça.
UIImageView
(avec UIViewContentModeScaleAspectFit
)(CGSize imageSize = imageView.image.size)
UIImageView
redimensionner. [imageView sizeThatFits:imageSize]
Je voulais mettre UIView en haut au centre de UICollectionViewCell
. alors, j'ai utilisé cette fonction.
- (void)setImageToCenter:(UIImageView *)imageView
{
CGSize imageSize = imageView.image.size;
[imageView sizeThatFits:imageSize];
CGPoint imageViewCenter = imageView.center;
imageViewCenter.x = CGRectGetMidX(self.contentView.frame);
[imageView setCenter:imageViewCenter];
}
Ça marche pour moi.
Cette sous-classe utilise center si l'image n'est pas plus grande que la vue, sinon elle est réduite. J'ai trouvé cela utile pour un UIImageView
qui change la taille.
L'image affichée est plus petite que la vue pour les grandes tailles, mais plus grande que la vue pour les petites tailles. Je veux seulement que cela diminue, mais pas plus haut.
class CenterScaleToFitImageView: UIImageView {
override var bounds: CGRect {
didSet {
adjustContentMode()
}
}
override var image: UIImage? {
didSet {
adjustContentMode()
}
}
func adjustContentMode() {
guard let image = image else {
return
}
if image.size.width > bounds.size.width ||
image.size.height > bounds.size.height {
contentMode = .ScaleAspectFit
} else {
contentMode = .Center
}
}
}
Vous pouvez y parvenir en définissant le mode de contenu de la vue image sur UIViewContentModeScaleAspectFill.
Ensuite, utilisez la méthode suivante pour obtenir l’objet uiimage redimensionné.
- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView
{
CGFloat width = imageToResize.size.width;
CGFloat height = imageToResize.size.height;
float scaleFactor;
if(width > height)
{
scaleFactor = imageView.frame.size.height / height;
}
else
{
scaleFactor = imageView.frame.size.width / width;
}
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0);
[imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
Edité ici (version Swift)
func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage
{
let width = imageToResize.size.width
let height = imageToResize.size.height
var scaleFactor: CGFloat
if(width > height)
{
scaleFactor = onImageView.frame.size.height / height;
}
else
{
scaleFactor = onImageView.frame.size.width / width;
}
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0)
imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage;
}
Rapide:
yourImageView.contentMode = .center
Vous pouvez utiliser les options suivantes pour positionner votre image:
scaleToFill
scaleAspectFit
// contenu mis à l'échelle pour s'adapter à un aspect fixe. le reste est transparentredraw
// redessiner à la modification des limites (appelle -setNeedsDisplay)center
// le contenu reste de la même taille. positionné ajusté.top
bottom
left
right
topLeft
topRight
bottomLeft
bottomRight
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
[your_imageview setContentMode:UIViewContentModeCenter];
Pour les personnes recherchant le redimensionnement UIImage,
@implementation UIImage (Resize)
- (UIImage *)scaledToSize:(CGSize)size
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
[self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- (UIImage *)aspectFitToSize:(CGSize)size
{
CGFloat aspect = self.size.width / self.size.height;
if (size.width / aspect <= size.height)
{
return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
} else {
return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
}
}
- (UIImage *)aspectFillToSize:(CGSize)size
{
CGFloat imgAspect = self.size.width / self.size.height;
CGFloat sizeAspect = size.width/size.height;
CGSize scaledSize;
if (sizeAspect > imgAspect) { // increase width, crop height
scaledSize = CGSizeMake(size.width, size.width / imgAspect);
} else { // increase height, crop width
scaledSize = CGSizeMake(size.height * imgAspect, size.height);
}
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
[self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end