Как программно изменить размер UIButton до размера текста и сохранить хороший отступ? - PullRequest
1 голос
/ 31 августа 2011

У меня есть кнопка, которая создается динамически и требует изменения размера.У него достаточно места для роста, но вызов швов sizeToFit ничего не делает или, по крайней мере, недостаточно расширяет кнопку.

Как получить желаемый эффект?

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Проверьте метод NSString -sizeWithFont:. Он возвращает CGSize, который сообщит вам, какой размер вашего текста потребуется для кнопки. Затем вы можете настроить рамку кнопки на основе этого размера, добавив любой желаемый отступ к ширине и высоте рамки кнопки. Примерно так:

NSString *msg = @"The button label";
UIFont *font = [UIFont systemFontOfSize:17];
CGSize msgSize = [msg sizeWithFont:font];
CGRect frame = button.frame;
frame.size.width = msg.size.width+10;
frame.size.height = msg.size.height+10;
button.frame = frame;

(записано из памяти; не скомпилировано.: -)

Конечно, вы также должны установить заголовок кнопки и шрифт ...

1 голос
/ 15 июня 2015

В iOS 7 sizeWithFont: устарело. Теперь вы должны использовать sizeWithAttribute:.

Но я бы не решил эту проблему. Есть два способа сделать это:

1) Чтобы использовать [buttonToFit], убедитесь, что AutoLayout отключен. В противном случае вы не сможете настроить размер кнопки программным способом. Вам придется настроить размер ваших ограничений.

2) Однако этот ответ очень ограничен в использовании. В примере, который я собираюсь показать вам, кнопка исчезнет с экрана, потому что текст находится на одной строке. Чтобы изменить высоту вашей кнопки при ограничении ширины, используйте следующий код. Еще раз убедитесь, что автопереключение отключено или это не сработает.

    UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:14.0];
    NSString *text = @"This is a very long new title for the button to be sure, now I'm going to add even more";

    [self.testButton setTitle:text forState:UIControlStateNormal];
    self.testButton.titleLabel.font = font;

    CGFloat width = self.testButton.frame.size.width - 10;  //button width - padding width
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize size = rect.size;
    size.height = ceilf(size.height);
    size.width = ceilf(size.width);
    self.testButton.frame = CGRectMake(self.testButton.frame.origin.x, self.testButton.frame.origin.y, self.testButton.frame.size.width, size.height + 15);

Поскольку boundingRectWithSize передаст вам прямоугольник с нецелыми размерами, вы должны использовать ceilf для округления.

Я вычитаю 10 из ширины, прежде чем передать ее в boundingRectWithSize, чтобы создать отступ для моей кнопки.

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