Как изменить размер 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. Мистер воздушный шарик действительно доводит его до конца, проясняя логику этого. Это, вероятно, одно из различий между младшим разработчиком и опытным.