Как я могу изменить размер UIButton, чтобы он соответствовал тексту, не делая его шире экрана? - PullRequest
16 голосов
/ 10 февраля 2011

У меня есть кнопка UIB, которую я хочу изменить, чтобы вместить любой текст внутри нее. Он имеет ширину набора 280, но текст должен переноситься на следующую строку (и) и увеличивать высоту кнопки по мере необходимости.

Я установил разрывы строк в Word Wrap и попробовал sizeToFit, но это только делает кнопку более широкой, а не вертикальной.

Ответы [ 5 ]

33 голосов
/ 20 августа 2012

Убедитесь, что вы установили текст для своей кнопки следующим образом:

[myButton setTitle:@"my title" forState:UIControlStateNormal];

... и [myButton sizeToFit] должны работать как шарм.

7 голосов
/ 21 января 2013

[button sizeToFit] не работает для меня, но я нашел способ, используя только IB (xcode 4.5):

  1. Нажмите на UIButton
  2. вИнспектор размеров перетащите content hugging в 1 (как горизонтальное, так и вертикальное)
  3. , перетащите compression resistance в 1000 (для обоих)
  4. под кнопкой constraints UIB, нажмите Width и изменитеpriority до 250
  5. Сделайте то же самое для высоты
  6. Вы можете использовать UIButton 'inset для управления заполнением для левой / правой / верхней / нижней
2 голосов
/ 12 февраля 2011

Мне удалось заставить его работать в категории 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 голосов
/ 10 февраля 2011

Возможно, вы захотите взглянуть на Дополнения UIKit к документации NSString , которые включают методы измерения шрифта, ограниченные определенной шириной или размером блока.

Когда вы устанавливаете заголовок кнопки, вы можете измерить строку, используя, например, метод sizeWithFont: forWidth: lineBreakMode: , и обновить кадр вашей кнопки на основе возвращенного размера (возможно, с учетом некоторого заполнения по краям).

Извините, у меня нет конкретного примера для вас.

0 голосов
/ 01 марта 2015

Я сталкивался с подобной проблемой, имел ограниченную ширину для своих кнопок и хотел, чтобы они росли вертикально, в зависимости от объема текста, который я им дал.В итоге я получил простое решение, основанное на том, что я узнал из документации 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;
}

Здесь в основном происходит то, что кнопка делает недействительным свой собственный размер (только когда установленные границы действительно новые - это предотвращает бесконечный цикл), и когда система запрашивает размер внутреннего содержимого, я пересчитываю это на основе шириныкнопки. Дополнительная высота 20px для заполнения. Я пробовал много других способов, но так как мой макет основан на AutoLayout, я хотел что-то, что мне не нужно обновлять, когда устройство вращается или около того. Это просто работает.

Удачи! Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...