В конструкторе интерфейса, удерживая Command+, =вы измените размер кнопки, чтобы соответствовать ее тексту. Мне было интересно, если это было возможно сделать программно, прежде чем кнопка была добавлена в представление.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Ответы:
В Xcode 4.5 и выше это теперь может быть сделано с помощью ' Auto-layout / Constraints '.
Основные преимущества:
Несколько недостатков:
Самое классное, что мы можем сосредоточиться на объявлении намерения, такого как:
Вот простой учебник, чтобы познакомиться с автоматическим макетом.
Для более подробной информации .
Сначала это займет некоторое время, но, похоже, оно того стоит.
источник
В UIKit есть дополнения к классу NSString, чтобы получить от данного объекта NSString размер, который он примет при визуализации определенным шрифтом.
Документы были здесь . Теперь это здесь под устаревшим.
Короче, если вы идете:
... вы установили рамку кнопки на высоту и ширину отрисовываемой строки.
Возможно, вы захотите поэкспериментировать с некоторым буферным пространством вокруг этого CGSize, но вы начнете с правильного места.
источник
Способ сделать это в коде:
Если вы создаете подклассы и хотите добавить дополнительные правила, вы можете переопределить:
источник
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Также, если вы обновите текст позже, не забудьте вызвать его еще раз.sizeToFit()
не уважает титульные вставки.Если ваша кнопка была создана с помощью Interface Builder, и вы меняете заголовок в коде, вы можете сделать это:
источник
Swift:
Здесь важно знать, когда вы будете вызывать
.sizeToFit()
, это должно быть после установки текста для отображения, чтобы он мог прочитать необходимый размер, если вы позже обновите текст, а затем вызовите его снова.источник
Чтобы сделать это с помощью autolayout, попробуйте установить ограничение переменной ширины:
Вам также может понадобиться скорректировать свои результаты
Content Hugging Priority
иContent Compression Resistance Priority
получить нужные вам результаты.UILabel полностью автоматически измеряет себя :
Эта UILabel просто устанавливается по центру на экране (только два ограничения, горизонтальное / вертикальное):
Изменяет ширину полностью автоматически:
Вам не нужно устанавливать какой - либо ширины или высоты - это полностью автоматический.
Обратите внимание, что маленькие желтые квадраты просто прикреплены («интервал» от нуля). Они автоматически перемещаются при изменении размера UILabel.
Добавление ограничения «> =» устанавливает минимальную ширину для UILabel:
источник
Если вы хотите изменить размер текста в отличие от кнопки, вы можете использовать ...
источник
sizeToFit не работает правильно. вместо:
Вы также можете добавить
contentInset
к кнопке:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
источник
Просто:
UIView
как обертку с автоматическим макетом для просмотра вокруг.UILabel
в эту обертку. Добавьте ограничения, которые прикрепят ярлык к краям оболочки.UIButton
в свою обертку, затем просто добавьте те же ограничения, что и дляUILabel
.источник
Swift 4.2
Слава богу, это решено. После установки текста для кнопки вы можете получить intrinsicContentSize, который является естественным размером из UIView (официальный документ здесь ). Для UIButton вы можете использовать его, как показано ниже.
Для вашей информации я отрегулировал ширину, чтобы она выглядела правильно.
имитатор
UIB-кнопки с intrinsicContentSize
Источник: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
источник
У меня есть некоторые дополнительные потребности, связанные с этим постом,
sizeToFit
который не решает. Мне нужно было держать кнопку по центру в исходном месте, независимо от текста. Я также никогда не хочу, чтобы кнопка была больше, чем ее оригинальный размер.Итак, я размещаю макет кнопки для ее максимального размера, сохраняю этот размер в контроллере и использую следующий метод для изменения размера кнопки при изменении текста:
источник
Этот класс кнопок с автоматическим изменением размера текста (для Xamarin, но может быть переписан для другого языка)
источник
Почему-то
func sizeToFit()
у меня не работает. Моя установка - я использую кнопку внутри,UITableViewCell
и я использую автоматическое расположение.Что сработало для меня:
intrinsicContentSize
ширину, потому что в соответствии с этим документом авто макет не знает оintrinsicContentSize
. Установите ограничениеintrinsicContentSize
ширины на ширинуВот два названия из
Debug View Hierachry
источник
Честно говоря, я думаю, что это действительно позор, что в раскадровке нет простого флажка, чтобы сказать, что вы хотите изменить размер кнопок, чтобы разместить текст. Ну ... что угодно.
Вот простейшее решение с использованием раскадровки.
Поместите UILabel внутри UIView. Установите ограничения, чтобы прикрепить его к краям UIView.
Поместите свой UIButton внутри UIView. Установите те же ограничения, чтобы прикрепить его к краям UIView.
Установите 0 для количества строк UILabel.
Настройте торговые точки.
источник