110 votes

à l'échelle de l'Image dans un UIButton à AspectFit?

Je veux ajouter une image à un UIButton, et tiens également à l'échelle de mon image pour s'adapter à la UIButton (faire une image plus petite). Veuillez me montrer comment le faire.

C'est ce que j'ai essayé, mais cela ne fonctionne pas:

  • L'ajout image à la touche et à l'aide de setContentMode:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
  • Faire un "étirement de l'image":
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];

210voto

Dave Points 3228

J'ai eu le même problème. Il suffit de régler le ContentMode de l'ImageView qui est à l'intérieur de la UIButton.

[[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];

Espérons que cette aide.

27voto

gcamp Points 9804

Si vous voulez vraiment vous mettre à l'échelle une image, de le faire, mais vous devez redimensionner avant de l'utiliser. Le redimensionnement au moment de l'exécution venez de perdre des cycles de PROCESSEUR.

C'est la catégorie que je suis l'aide de l'échelle une image :

UIImage+Extra.h

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

UIImage+Extra.m

@implementation UIImage (Extras)

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

UIImage *sourceImage = self;
UIImage *newImage = nil;

CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;

CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;

CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;

CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

if (!CGSizeEqualToSize(imageSize, targetSize)) {

        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor < heightFactor) 
                scaleFactor = widthFactor;
        else
                scaleFactor = heightFactor;

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image

        if (widthFactor < heightFactor) {
                thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        } else if (widthFactor > heightFactor) {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
}


// this is actually the interesting part:

UIGraphicsBeginImageContext(targetSize);

CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width  = scaledWidth;
thumbnailRect.size.height = scaledHeight;

[sourceImage drawInRect:thumbnailRect];

newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

if(newImage == nil) NSLog(@"could not scale image");


return newImage ;
}

@end

Vous pouvez l'utiliser à la taille que vous voulez. Comme :

[self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];

22voto

Ninja Points 981

J'ai eu des problèmes avec l'image pas de redimensionnement proportionnellement la façon dont je fixe, il a été en utilisant le bord des encarts.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

17voto

capikaw Points 1167

Cela peut maintenant être fait par le biais de l'IB UIButton propriétés. La clé est de définir votre image d'arrière-plan, sinon ça ne marchera pas.

enter image description here

8voto

Tulleb Points 43

Si vous voulez simplement réduire votre image de bouton:

yourButton.contentMode = UIViewContentModeScaleAspectFit;
yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X