Как мне масштабировать изображение UIButton? - PullRequest
76 голосов
/ 24 декабря 2009

Я создал экземпляр 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);

Ответы [ 18 ]

87 голосов
/ 18 ноября 2011

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

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

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

Мне потребовалось несколько часов, чтобы понять это (название объекта очень не интуитивно понятно), так что я поделился.

61 голосов
/ 03 сентября 2013

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

enter image description here

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

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

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

enter image description here

32 голосов
/ 16 декабря 2015

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

UIButton *btn = [UIButton new];

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

enter image description here

22 голосов
/ 10 апреля 2010

использование

button.contentMode = UIViewContentModeScaleToFill;

не

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Обновление:

Как прокомментировал @Chris,

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

15 голосов
/ 24 декабря 2009
    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]; 
10 голосов
/ 21 июня 2010

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

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

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

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

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

9 голосов
/ 02 апреля 2012

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

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

и

[button setImage:newImage forState:UIControlStateNormal];

7 голосов
/ 14 сентября 2010

Я только что столкнулся с этой же проблемой, и на этот вопрос есть возможный ответ:

Почему пользовательский образ UIButton не изменяется в Интерфейсном Разработчике?

По сути, вместо этого используйте свойство backgroundimage, которое масштабируется.

6 голосов
/ 11 сентября 2015

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

Из дизайна

  1. Откройте XIB ИЛИ раскадровку.
  2. Кнопка выбора
  3. Внутри Инспектор атрибутов (Правая сторона)> В «Управление» * секция 1013 *> выберите последний 4-й вариант как для горизонтального, так и вертикального.

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

из кода

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;
5 голосов
/ 17 марта 2010

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

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

 return resizedImage;
}
...