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

Почему размер пользовательского изображения UIButton не изменяется с помощью кнопки?

Я установил его режим просмотра на Масштабирование до заполнения в Интерфейсном Разработчике, но, в отличие от изображения UIImageView, он не соблюдает этот параметр.

Я ищу не в том месте или это невозможно?


person willc2    schedule 30.06.2009    source источник
comment
Я обнаружил, что, хотя он не масштабирует изображение в IB, он масштабирует изображение во время выполнения.   -  person an0    schedule 10.12.2009
comment
это не обязательно верно ... если у вас есть img размером 80x80 пикселей с кнопкой 60x60 пикселей, он будет масштабировать кнопку в соответствии с размером изображения, тогда как многие люди хотят противоположного (масштабировать изображение в соответствии с меньшим размером кнопки) ... см. мой ответ на это сообщение, чтобы узнать, как это сделать: stackoverflow.com/questions/2658738/   -  person iwasrobbed    schedule 23.05.2010


Ответы (10)


Хотя это может быть не совсем то, что вам нужно, фоновое изображение масштабируется.

person teabot    schedule 30.06.2009
comment
Если я помещаю изображение в фоновый режим, я получаю правильное поведение, поэтому вы его решили, спасибо. - person willc2; 30.06.2009
comment
Если вы не хотите использовать фоновое изображение (потому что, скажем, вы хотите использовать разные изображения для разных состояний), вам необходимо установить свойство выравнивания. См .: stackoverflow .com / questions / 1957317 /. - person Chris; 18.11.2011
comment
что, если вы хотите, чтобы он масштабировался по размеру? тогда фоновое изображение, масштабируемое для заполнения, не будет подходящим - person user102008; 13.06.2012
comment
Это спасло мне жизнь (по крайней мере, пару часов) - person Adam; 15.06.2018
comment
ах, значит, не изображение, а фоновое изображение. Я забуду свое имя, прежде чем забуду это. - person Daniel Springer; 26.06.2019

Попробуй это:

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

В Swift:

button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
person Cao Huu Loc    schedule 15.10.2014
comment
Ты спас мне день! Браво .. Также убедитесь, что тип кнопки - custom - person Hyder; 12.06.2017
comment
Работал для меня - XCode 8, Swift 3, UIButton, созданный раскадровкой, векторное изображение / PDF-изображение как изображение кнопки - person xaphod; 15.07.2017

Не забудьте установить настройки Control Alignment для кнопки

здесь установите настройки выравнивания элемента управления для кнопки

person drpawelo    schedule 13.12.2016

Я знаю, что это устарело, но я думаю, что правильный ответ состоит в том, что вы должны установить режим содержимого для «скрытого» UIImageView, который находится внутри UIButton:

button.imageView.contentMode = UIViewContentModeScaleAspectFill;

Это изменит режим содержимого для представлений изображений, установленных с помощью:

[button setImage:yourAwesomeImage forState:UIControlStateNormal]; 
//Or any other state
person JP Illanes    schedule 17.06.2013
comment
у меня не работает :-( Мои изображения все еще не растянуты, чтобы заполнить ширину и высоту кнопки - person Orion Edwards; 16.09.2014
comment
Не работает на iOS8. Пытался установить его до и после добавления изображения на кнопку. self.button1.imageView.contentMode = UIViewContentModeScaleAspectFill; Пробовал scaleAscpetFill и scaleToFill, ничего не вышло. Решение Cao Huu Loc действительно работает. - person Martin Berger; 06.04.2015

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

От дизайна

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

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

Из кода

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

person Sandip Patel - SM    schedule 11.09.2015
comment
Забавно, во вьювере XIB это не выглядит масштабированным. Фактически, он увеличивает размер кнопки, но затем во время работы он масштабируется до необходимого размера. - person Joe C; 26.10.2015

Разработчик интерфейса

Чтобы изображения в UIButtons масштабировались так же, как UIViews в конструкторе интерфейсов, выполните следующие действия:

Выберите свой UIButton и в Инспекторе удостоверений добавьте следующее в Определенные пользователем атрибуты времени выполнения:

imageView.contentMode Number 1

Где число - это номер перечисления contentMode, например:

0 = Scale to fill 
1 = Aspect Fit 
2 = Aspect Fill
etc..

Затем откройте редактор Атрибутов для вашего UIButton и в разделе Контроль установите для Выравнивания значение Заливка (последняя кнопка справа) как по горизонтали, так и по вертикали.

SWIFT 3

Обратите внимание, что вы также можете сделать это в коде следующим образом:

button.imageView?.contentMode = .scaleAspectFit
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
person George Filippakos    schedule 20.05.2017
comment
Отличный ответ! Спасибо. - person rmvz3; 15.02.2018

Обновление этого сообщения даст полный ответ для Swift 5:

//Set button's image
let image = UIImage(systemName: "heart.fill") //Your image here
button.setImage(image, for: .normal)

//Optional: Remove background image if you added one on accident
button.setBackgroundImage(nil, for: .normal)

//Optional: Set button's title (displayed next to button's image)
button.setTitle(nil, for: .normal)

//The button's "content" includes the title label and image
//So we set the button's content to fill the button
//If title label is nil, the content will only show the image
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill

//Set button's image to desired content mode (aspectFit avoids distortion)
//This restricts the image from resizing to fill the entire content area
button.imageView?.contentMode = .scaleAspectFit
person nicksarno    schedule 18.04.2020
comment
button.contentVerticalAlignment = .fill button.contentHorizontalAlignment = .fill делает свою работу, спасибо - person Tai Le; 11.11.2020

Попробуйте установить для свойства Clip subviews в Интерфейсном Разработчике значение true.

Надеюсь, это поможет.

person Dshutsi    schedule 30.06.2009
comment
Увы, этого не произошло. Тем не менее, спасибо за попытку помочь. - person willc2; 30.06.2009

Лучшее решение, которое я нашел до сих пор в Swift 2.1, следующее:

self.imageButton.imageView?.clipsToBounds = true
self.imageButton.imageView?.contentMode = UIViewContentMode.ScaleAspectFit

Это приведет к масштабированию изображения, чтобы оно соответствовало формату изображения в imageView.

person Menno    schedule 05.02.2016

Просто получите настоящий UIimageview, поместите UIbutton поверх него и через меню макета установите его на задний план. Тогда вы сможете правильно масштабировать изображение.

person Rene    schedule 05.03.2010