UIButton не слушает настройки режима контента? - PullRequest
85 голосов
/ 01 июня 2010

firstButton - это UIButton типа Custom. Я программно помещаю три из них в каждую ячейку таблицы, таким образом:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

В других местах я говорю обрезать границы. То, что я получаю, это обрезка центрального квадрата изображения, а не его масштабное отображение. Я перепробовал множество способов, включая установку свойства mode для firstButton.imageView, который также, похоже, не работает.

Ответы [ 15 ]

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

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

Мне потребовалось немного поиска и экспериментов, но я нашел решение. Просто установите ContentMode «скрытого» ImageView, который находится внутри UIButton.

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

Возможно, именно об этом говорил Дэн Рэй в своем принятом ответе, но я подозреваю, что нет.

65 голосов
/ 05 марта 2014

Если вы имеете дело с изображением UIButton (в отличие от его backgroundImage), установка contentMode для самого UIButton или для его imageView не имеет никакого эффекта (несмотря на то, что говорят другие ответы).

Вместо этого сделайте это вместо:

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

Или измените размер изображения соответственно.

ИЛИ просто используйте UIImageView (который должным образом учитывает contentMode) с прикрепленным к нему UITapGestureRecognizer или прозрачной UIButton поверх него.

45 голосов
/ 30 октября 2011

Вместо установки contentMode на самой кнопке вы захотите установить свойства contentHorizontalAlignment и contentVerticalAlignment и (что крайне важно) contentMode для кнопки imageView для любого вида заливки или поместиться. Вот пример:

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

Конечно, вы также можете делать другие вещи, такие как выравнивание изображения кнопки в верхней части кнопки. Если вам не нужна заливка или подгонка аспектов, вы можете просто установить выравнивание:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

В Swift вы захотите использовать:

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

Это работает для всех версий iOS, включая последние версии с автоматическим макетом (т.е. iOS 4 до iOS 11 +).

7 голосов
/ 02 октября 2010

После нескольких часов путаницы, вот как я заставил его работать под iOS 3.2. Как сказал Сумерк, использование setBackgroundImage вместо setImage сделало эту работу за меня.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];
6 голосов
/ 04 июня 2010

Ответ заключается в том, чтобы использовать UIImageView со всеми интересными настройками режима содержимого, которые вы хотите, а затем наложить на него пользовательскую кнопку. Глупо, что вы не можете сделать все это одним выстрелом, но кажется, что вы не можете.

4 голосов
/ 10 июня 2012

Нашли исправление для этого. Установите для свойства adjustsImageWhenHighlighted UIButton значение NO.

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

Надеюсь, это поможет. Не стесняйтесь комментировать ниже, я буду отвечать на любые ваши вопросы.

3 голосов
/ 05 сентября 2017

Swift 3

self.firstButton.imageView?.contentMode = .scaleAspectFill
3 голосов
/ 14 июля 2015

Единственное решение, которое у меня сработало:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
3 голосов
/ 06 марта 2014

Мой ответ похож на ответ Кубы. Мне нужно, чтобы мое изображение было установлено программно.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}
1 голос
/ 20 января 2013

Я полагаю, что у нас есть проблема простого конструктора интерфейса - очевидно, IB игнорирует любые изменения режима содержимого ПОСЛЕ того, как вы установили свойство image.

решение простое: установите режим содержимого, удалите ранее установленные имена изображений (убедитесь, что вы удалили его во всех состояниях, по умолчанию, выделено и т. Д.), Затем повторно введите нужные имена изображений во всех требуемых состояниях - et voilà.

...