UIButton не прослушивает настройку режима содержимого?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

В качестве альтернативы сделайте это вместо этого:

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

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

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

Ответ 3

Вместо того, чтобы устанавливать 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+).

Ответ 4

Спустя пару часов смущения, вот как я получил его для работы под iOS 3.2. Как сказал dusker, использование 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];

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Только решение, которое работало для меня:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Ответ 8

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

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;
}

Ответ 9

Swift 3

self.firstButton.imageView?.contentMode = .scaleAspectFill

Ответ 10

Вместо setImage попробуйте setBackgroundImage

Ответ 11

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

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

Ответ 12

Я также советлю посмотреть свойство adjustsImageWhenHighlighted UIButton, чтобы избежать странных деформаций изображения при нажатии кнопки.

Ответ 13

Пытаясь понять это, мой метод немного пошатнулся, и я закончил подклассификацию UIButton и переопределив setHighlighted:

Для меня это работает, чтобы просто сбить изображение альфа на .5, потому что они на черном фоне.

Тем не менее, он работает только, если я прокомментирую [super setHighlighted:] (где он появляется, изображение-растягивается код), который просто не кажется правильным способом решить это вообще... все похоже, работает нормально. Мы посмотрим, как он держится, когда я продолжаю работать над этим.

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

Ответ 14

Если кто-то ищет ответ, который работает в iOS 6 и iOS 7 и раскадровке:

Вы можете установить изображение в своем раскадровке:

enter image description here

И затем:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

Ответ 15

Если UIButton, похоже, не прослушивает настройки ограничения макета, проверьте, больше ли размер изображений, чем размер кнопки. Всегда используйте изображения @2x и @3x для разрешения сетчатки.