Как масштабировать образ изображения UIButton?

Я создал экземпляр UIButton с именем "button" с изображением с помощью [UIButton setImage:forState:]. Размер button.frame больше размера изображения.

Теперь я хочу уменьшить масштаб изображения этой кнопки. Я попытался изменить button.imageView.frame, button.imageView.bounds и button.imageView.contentMode, но все они выглядят неэффективными.

Может ли кто-нибудь помочь мне масштабировать UIButton imageView?

Я создал UIButton следующим образом:

UIButton *button = [[UIButton alloc] init];
[button setImage:image forState:UIControlStateNormal];

Я попытался масштабировать изображение следующим образом:

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.bounds = CGRectMake(0, 0, 70, 70);

и это:

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.frame = CGRectMake(0, 0, 70, 70);

Ответ 1

Для исходного плаката, вот решение, которое я нашел:

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

Это позволит вашей кнопке масштабироваться горизонтально. Существует также вертикальная установка.

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

Ответ 2

Я столкнулся с аналогичной проблемой, где у меня есть фоновое изображение (одно с рамкой) и изображение (флаг) для пользовательской кнопки. Я хотел, чтобы флаг был уменьшен и в центре. Я попытался изменить атрибут imageView, но не удалось и увидел это изображение -

enter image description here

Во время моих экспериментов я попытался:

button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)

Я достиг ожидаемого результата:

enter image description here

Ответ 3

Дополнительный путь для конфигурации в XIB файле. Вы можете выбрать эту опцию, если хотите, чтобы текст или изображение заполнялись по шкале UIButton. Это будет то же самое с кодом.

UIButton *btn = [UIButton new];

btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment   = UIControlContentVerticalAlignmentFill;

введите описание изображения здесь

Ответ 4

использовать

button.contentMode = UIViewContentModeScaleToFill;

не

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Update:

Как заметил @Chris,

Чтобы заставить это работать для setImage: forState:, вам нужно сделать следующее по горизонтали: myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

Ответ 5

    UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)];
    button.buttonType = UIButtonTypeCustom;
    UIImage *buttonImage = [UIImage imageNamed:@"image.png"];

    UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
    [button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal]; 

Ответ 6

Я нашел это решение.

1) Подкласс следующие методы UIButton

+ (id)buttonWithType:(UIButtonType)buttonType {
    MyButton *toReturn = [super buttonWithType:buttonType];
    toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
    return toReturn;
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    return contentRect;
}

И он работает хорошо.

Ответ 7

Странно, единственная комбо, которая работала для меня (iOS 5.1), была...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

и

[button setImage:newImage forState:UIControlStateNormal];

Ответ 9

Просто сделайте (из дизайна OR From Code):

От дизайна

  • Откройте xib OR Storyboard.
  • Кнопка выбора
  • Внутри Инспектор атрибутов (справа) > В разделе "Управление" выберите последний 4-й вариант для горизонтального и вертикального. li >

[Для пункта № 3: изменить горизонтальное и вертикальное выравнивание на UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]

Из кода

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

Ответ 10

как это может решить вашу проблему:

+ (UIImage*)resizedImage:(UIImage*)image
{
 CGRect frame = CGRectMake(0, 0, 60, 60);
 UIGraphicsBeginImageContext(frame.size);
 [image drawInRect:frame];
 UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return resizedImage;
}

Ответ 11

Из небольшого теста, который я только что прочитал здесь, зависит, если вы используете setImage или setBackgroundImage, оба сделали тот же результат и увеличили изображение

//for setBackgroundImage
 self.imageButton.contentMode = UIViewContentModeScaleAspectFill;
        [self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

//for setImage
 self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
        self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    [self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

Ответ 12

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

Ответ 13

Я не могу использовать решение _imageView, но я могу использовать CGContextRef для его решения. Он использует UIGraphicsGetCurrentContext, чтобы получить currentContextRef и нарисовать изображение в currentContextRef, а затем масштабировать или поворачивать изображение и создавать новое изображение. Но это не идеально.

код:

-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height;
{
    CGImageRef imgRef = photoimage.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);

    bounds.size.width = bounds_width;
    bounds.size.height = bounds_height;

    CGFloat scaleRatio = bounds.size.width / width;
    CGFloat scaleRatioheight = bounds.size.height / height;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = photoimage.imageOrientation;
    switch(orient)
    {
        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"];
            break;
    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft)
    {
        CGContextScaleCTM(context, -scaleRatio, scaleRatioheight);
        CGContextTranslateCTM(context, -height, 0);
    }
    else
    {
        CGContextScaleCTM(context, scaleRatio, -scaleRatioheight);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageCopy;
}

Ответ 14

Это также будет работать, так как backgroundImage автоматически масштабирует

[button setBackgroundImage:image forState:UIControlStateNormal];

Ответ 15

Раскадровка

Вы должны определить конкретное свойство в Атрибутах времени выполнения Инспектор удостоверений - imageView.contentModel, где вы устанавливаете значение относительно rawValue позиции enum UIViewContentMode. 1 означает scaleAspectFit.

Установить button.imageView.contentMode в раскадровке

И выравнивание кнопок, в Инспекторе атрибутов:

Полное выравнивание кнопки

Ответ 16

Снимок экрана в XCode 8

В левом нижнем углу снимка экрана вы можете увидеть свойства растягивания. Попробуйте использовать их.

Ответ 17

Я надеюсь, что это может помочь кому-то еще:

Свифт 3+

button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment =  UIControlContentVerticalAlignment.fill

Ответ 18

У каждого UIButton есть один скрытый UIImageView. Поэтому мы должны установить режим содержимого, как показано ниже...

[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit];
[btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];