Как изменить размер UIButton, чтобы он соответствовал тексту без расширения экрана?
У меня есть UIButton, который я хочу изменить, чтобы соответствовать любому тексту внутри. Он имеет заданную ширину 280, но текст должен переноситься на следующую строку (строки) и увеличивать высоту кнопки по мере необходимости.
Я установил разрывы строк в Word Wrap и попробовал sizeToFit, но это делает кнопку более широкой, а не вертикальной.
Ответы
Ответ 1
Мне удалось заставить его работать в категории UIButton:
@interface UIButton (ExpandsVertically)
- (CGSize)sizeThatFits:(CGSize)size;
@end
@implementation UIButton (Expandable)
- (CGSize)sizeThatFits:(CGSize)size {
// for the width, I subtract 24 for the border
// for the height, I use a large value that will be reduced when the size is returned from sizeWithFont
CGSize tempSize = CGSizeMake(size.width - 24, 1000);
CGSize stringSize = [self.titleLabel.text
sizeWithFont:self.titleLabel.font
constrainedToSize:tempSize
lineBreakMode:UILineBreakModeWordWrap];
return CGSizeMake(size.width - 24, stringSize.height);
}
@end
Если кто-то использует это, обязательно установите:
myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Ответ 2
Убедитесь, что текст на кнопке установлен таким образом:
[myButton setTitle:@"my title" forState:UIControlStateNormal];
... и [myButton sizeToFit]
должны работать как шарм.
Ответ 3
[button sizeToFit]
не работал у меня, но я нашел способ использовать только IB (xcode 4.5):
- Нажмите
UIButton
- в Инспекторе размеров перетащите
content hugging
в 1 (как по горизонтали, так и по вертикали)
- перетащите
compression resistance
в 1000 (для обоих)
- под UIButton
constraints
нажмите Width
и измените priority
на 250
- Сделайте то же самое для Height
- Вы можете использовать
UIButton
inset
для управления дополнением для левого/правого/верхнего/нижнего
Ответ 4
Вы можете посмотреть UIKit Дополнения к документации NSString, которая включает методы измерения шрифта, ограниченные определенной шириной или размером окна.
Когда вы устанавливаете заголовок кнопки, вы можете измерить строку, используя метод sizeWithFont: forWidth: lineBreakMode:, например, и обновить рамку кнопки на основе возвращаемого размера (возможно, для некоторых дополнений по краям).
Извините, у меня нет конкретного примера для вас.
Ответ 5
Я столкнулся с подобной проблемой, имел ограниченную ширину для своих кнопок и хотел, чтобы они выросли вертикально, в зависимости от количества текста, который я им дал.
Я закончил с простым решением, основанным на том, что я узнал в документах Apple (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html)
Я подклассифицировал UIButton
и переопределил две функции:
- (void)setBounds:(CGRect)bounds {
if (!CGRectEqualToRect(bounds, self.bounds)) {
[self invalidateIntrinsicContentSize];
}
[super setBounds:bounds];
}
- (CGSize)intrinsicContentSize {
//
CGSize size;
self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x,
self.titleLabel.frame.origin.y,
self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right,
0);
size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size];
size = CGSizeMake(size.width, size.height + 20);
return size;
}
Что в основном происходит здесь, так это то, что кнопка аннулирует свой внутренний размер (только когда набор ограничений фактически является новым - это предотвращает бесконечный цикл), и когда система запрашивает собственный размер содержимого, я пересчитываю этот байт по ширине кнопки. Дополнительная высота 20 пикселей для заполнения.
Я пробовал много других способов, но поскольку мой макет основан на AutoLayout, мне нужно что-то, что мне не нужно обновлять, когда устройство вращается или так. Это просто работает.
Удачи!
Z.
Ответ 6
Сделайте сопротивление сжатию содержимого ВЫСОКИМ для кнопки, которую вы не хотите сжимать, и установите сопротивление на НИЗКОЕ для того, что находится рядом с вашими кнопками. Для получения дополнительной информации о сжатии контента/приоритетах сопротивления объятиям проверьте этого плохого парня https://krakendev.io/blog/autolayout-magic-like-harry-potter-but-real. Мистер воздушный шарик действительно доводит его до конца, проясняя логику этого. Это, вероятно, одно из различий между младшим разработчиком и опытным.