масштабировать изображение в UIButton для AspectFit? - PullRequest
86 голосов
/ 08 января 2010

Я хочу добавить изображение в UIButton, а также хочу масштабировать мое изображение, чтобы оно соответствовало UIButton (уменьшить изображение). Пожалуйста, покажи мне, как это сделать.

Это то, что я пробовал, но это не работает:

  • Добавление изображения к кнопке и использование setContentMode:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
  • Создание "растянутого изображения":
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];

Ответы [ 16 ]

197 голосов
/ 19 июля 2010

У меня была такая же проблема. Просто установите ContentMode для ImageView, который находится внутри кнопки UIB.

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

Надеюсь, это поможет.

94 голосов
/ 15 июля 2015

Ни один из ответов здесь действительно не помог мне, я решил проблему с помощью следующего кода:

button.contentMode = UIViewContentModeScaleToFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Вы также можете сделать это в Интерфейсном Разработчике.*enter image description here

47 голосов
/ 21 августа 2015

Самый простой способ программно установить UIButton imageView в режиме fit fit :

Swift

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Objective-C

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Примечание: Вы можете изменить .scaleAspectFit (UIViewContentModeScaleAspectFit) на .scaleAspectFill (UIViewContentModeScaleAspectFill), чтобы установить заполнение аспекта mode

27 голосов
/ 08 января 2010

Если вы действительно хотите масштабировать изображение, сделайте это, но вы должны изменить его размер, прежде чем использовать его. Изменение его размера во время выполнения приведет к потере циклов процессора.

Это категория, которую я использую для масштабирования изображения:

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:

UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0);

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

Вы можете использовать его в нужном вам размере. Нравится:

[self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];
19 голосов
/ 07 июня 2012

У меня были проблемы с пропорциональным изменением размера изображения, поэтому в способе его установки использовались вставки с краями.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
14 голосов
/ 03 марта 2016

Расширяя ответ Дейва, вы можете установить contentMode кнопки imageView для всех в IB без кода, используя атрибуты времени выполнения:

enter image description here

  • 1 означает UIViewContentModeScaleAspectFit,
  • 2 будет означать UIViewContentModeScaleAspectFill.
14 голосов
/ 10 сентября 2014

Теперь это можно сделать через свойства IB UIButton. Ключ должен установить ваше изображение как фон, иначе это не будет работать.

enter image description here

8 голосов
/ 18 апреля 2014

Если вы просто хотите уменьшить изображение кнопки:

yourButton.contentMode = UIViewContentModeScaleAspectFit;
yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
4 голосов
/ 20 сентября 2015

У меня есть метод, который делает это для меня. метод возьмите uibutton и сделайте изображение подходящим

-(void)makeImageAspectFitForButton:(UIButton*)button{
    button.imageView.contentMode=UIViewContentModeScaleAspectFit;
    button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill;
}
4 голосов
/ 16 декабря 2014

Самое чистое решение - использовать Авторазметка .Я понизил Приоритет сопротивления сжатию содержимого моего UIButton и установил изображение (не Фоновое изображение ) через Интерфейсный конструктор .После этого я добавил пару ограничений, которые определяют размер моей кнопки (довольно сложный в моем случае), и она работала как шарм.

...