firstButton - это UIButton типа Custom. Я программно помещаю три из них в каждую ячейку таблицы, таким образом:
[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];
В другом месте я говорю это clipToBounds. Я получаю обрезку центрального квадрата изображения, а не его рендеринг с масштабированием по сторонам. Я пробовал это множество способов, включая установку свойства режима в firstButton.imageView, что тоже, похоже, не работает.
ios
uibutton
contentmode
Дэн Рэй
источник
источник
Ответы:
У меня такая же проблема. Я вижу, что этот вопрос немного устарел, но я хочу дать четкий и правильный ответ, чтобы сэкономить время другим людям (например, мне), когда он появится в их результатах поиска.
Мне потребовалось немного поисков и экспериментов, но я нашел решение. Просто установите ContentMode «скрытого» ImageView, который находится внутри UIButton.
[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit]; [firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
Возможно, именно это имел в виду Дэн Рэй в своем принятом ответе, но я подозреваю, что нет.
источник
Если вы имеете дело с изображением UIButton (в отличие от backgroundImage), установка contentMode в самом UIButton или в его imageView не имеет никакого эффекта (несмотря на то, что говорят другие ответы).
В качестве альтернативы сделайте это:
self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Или измените размер изображения соответствующим образом.
ИЛИ просто используйте UIImageView (который должным образом уважает contentMode) с прикрепленным к нему UITapGestureRecognizer или прозрачным UIButton поверх него.
источник
contentMode
на ,imageView
если вы хотите сделать любой вид заливки сторон или приступа, как и другие ответы выяснены. Обратитесь: stackoverflow.com/a/7944316/746890 .Вместо того, чтобы устанавливать
contentMode
на самой кнопке, вы захотите установитьcontentHorizontalAlignment
иcontentVerticalAlignment
свойства и (что особенно важно)contentMode
для кнопкиimageView
для любого вида заливки или подгонки. Вот пример:button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Конечно, вы также можете делать другие вещи, например выравнивать изображение кнопки по верхнему краю кнопки. Если вам не требуется заливка или подгонка аспекта, вы можете просто установить выравнивание самостоятельно:
button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
В Swift вы захотите использовать:
Это работает для всех версий iOS, включая последние версии с автоматической компоновкой (например, от iOS 4 до iOS 11+).
источник
После пары часов путаницы вот как я заставил его работать под 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];
источник
Ответ - использовать UIImageView со всеми желаемыми прекрасными настройками Content Mode, а затем наложить поверх него настраиваемую кнопку. Тупой, что вы не можете сделать это за один раз, но похоже, что вы не можете.
источник
Нашел исправление для этого. Установите
adjustsImageWhenHighlighted
свойство вUIButton
значениеNO
.UIButton *b = [[UIButton alloc] initWithFrame:rect]; [b setImage:image forState:UIControlStateNormal]; [b.imageView setContentMode:UIViewContentModeScaleAspectFill]; [b setAdjustsImageWhenHighlighted:NO];
Надеюсь это поможет. Не стесняйтесь комментировать ниже, я отвечу на любые ваши вопросы.
источник
Мой ответ похож на ответ Кубы. Мне нужно, чтобы мое изображение было установлено программно.
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; }
источник
Единственное решение, которое сработало для меня:
[button setImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
источник
Swift 3
self.firstButton.imageView?.contentMode = .scaleAspectFill
источник
Вместо setImage попробуйте setBackgroundImage
источник
Я считаю, что здесь есть простая проблема с построителем интерфейса - очевидно, IB игнорирует любые изменения режима содержимого ПОСЛЕ того, как вы установили свойство image.
решение очень простое: установите режим содержимого, удалите ранее установленные имена изображений (убедитесь, что вы удалили его во всех состояниях, по умолчанию, выделены и т. д.), затем повторно введите желаемые имена изображений во всех желаемых состояниях - et voilà .
источник
Я также советую взглянуть на
adjustsImageWhenHighlighted
UIButton
свойство, чтобы избежать странных деформаций изображения при нажатии кнопки.источник
Пытаясь понять это, мой метод со временем стал немного хакерским, и я создал подкласс UIButton и переопределил setHighlighted:
Для меня это работает, чтобы просто сбить изображение с альфа до 0,5, потому что они находятся на черном фоне.
Однако это сработает только в том случае, если я закомментирую [super setHighlighted:] (там, где, по-видимому, происходит растягивающий код изображения), что просто не похоже на правильный способ решить эту проблему ... все кажется хотя работает нормально. Мы увидим, как это работает, когда я продолжу над этим работать.
- (void)setHighlighted:(BOOL)highlight { if (highlight) { [self.imageView setAlpha:.5]; } else { [self.imageView setAlpha:1]; } // [super setHighlighted:highlight]; }
источник
Если кто-то ищет ответ, который работает в iOS 6 и iOS 7 и раскадровке:
Вы можете установить изображение в раскадровке:
А потом:
for(UIView* testId in self.subviews) { if([testId isKindOfClass:[UIImageView class]]) [testId setContentMode:UIViewContentModeScaleAspectFill]; }
источник
Если кажется, что UIButton не слушает настройки ограничения макета, проверьте, не превышают ли изображения размер кнопки. Всегда используйте изображения @ 2x и @ 3x для разрешений сетчатки.
источник
Эти две вещи (которые довольно сложно найти изначально) растянут ваше изображение UIButton до размера кнопки:
всегда следует пытаться установить это в раскадровке, а не в коде.
источник