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 для разрешения сетчатки.