2011-02-10 3 views
14

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

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

ответ

2

мне удалось получить его работу в категории 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

Возможно, вы захотите посмотреть на UIKit Additions to NSString documentation, который включает методы измерения шрифтов, ограниченные определенной шириной или размером окна.

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

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

+0

Вы привели меня в правильном направлении ... спасибо! – TigerCoding

31

Убедитесь, что вы установите текст на кнопке этот путь :

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

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

+3

Работает для меня. Благодарю. – Prazi

+15

Я думаю, что это может некорректно работать на кнопках с типом = custom – marmor

5

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

  1. Кликните на UIButton
  2. в размере инспектора сопротивления content hugging до 1 (оба горизонтальная и вертикальная)
  3. сопротивление compression resistance 1000 (для обоих)
  4. под этой UIButton в constraints нажмите на Width и изменить priority до 250
  5. Сделайте то же самое для Height
  6. Вы можете использовать UIButton «s inset контролировать отступы для левого/правого/верх/низ
+0

Пробовал ли вы использовать вставку? Если я использую вставку, кажется, что автоопределение не учитывается при расчете ожидаемой ширины, так что ширина кнопки увеличивается, но ее недостаточно для размещения текста + левая правая вставка – saurabh

0

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

Смежные вопросы