ios Динамические метки размеров - PullRequest
28 голосов
/ 07 февраля 2012

Я пытался выполнить поиск в Интернете, но не нашел четкого ответа на свой вопрос, поэтому я пришел за советом к вашему эксперту.У меня есть вид с 2 ярлыками на нем.Первая метка используется для обозначения аббревиатуры имени, 2-3 буквы.а вторая метка показывает полное имя.

Вопрос, который у меня возник, заключается в том, был ли способ динамического изменения размера метки на основе заданного типа шрифта, размера и длины строки?Я спрашиваю, потому что я хотел бы, чтобы вторая метка была близка к первой без слишком большого пустого пространства между двумя или без первой метки, перекрывающей вторую.

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

Любые советы приветствуются.

Ответы [ 5 ]

64 голосов
/ 07 февраля 2012

Вы можете рассчитать размер, в котором будет отображаться ваша строка, а затем установить размер рамки UILabel на этот размер, см. Следующий код в качестве образца -

//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Обновление -

Используйте взамен sizeWithAttributes:, что теперь занимает NSDictionary.Передайте пару с ключом UITextAttributeFont и вашим объектом шрифта следующим образом:

CGSize size = [string sizeWithAttributes:
                       @{NSFontAttributeName:
                         [UIFont systemFontOfSize:17.0f]}];

Проверьте Замена устаревшего sizeWithFont: в iOS 7? для получения более подробной информации

16 голосов
/ 09 ноября 2012

Это также сделает свое дело и примет во внимание приписанный текст

label.attributedText = attrString;
CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX);
CGSize requiredSize = [label sizeThatFits:maximumLabelSize];
CGRect labelFrame = label.frame;
labelFrame.size.height = requiredSize.height;
label.frame = labelFrame;
10 голосов
/ 12 сентября 2013

'sizeWithFont:' устарело: сначала устарело в iOS 7.0.

так что попробуйте sizeWithAttributes

- (void)viewDidLoad
{
    [super viewDidLoad];

    label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)];

    label.backgroundColor = [UIColor blueColor];

     const CGFloat fontSize = 30;
     UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
     UIColor *foregroundColor = [UIColor blackColor];

     attrs = [NSDictionary dictionaryWithObjectsAndKeys:
     regularFont, NSFontAttributeName,
     foregroundColor, NSForegroundColorAttributeName
     , nil];

     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
     initWithString:@"Test Text"
     attributes:attrs];

     [label setAttributedText:attributedText];
     [self.view addSubview:label];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <--

    CGRect newFrame = label.frame;
    newFrame.size.width = expectedLabelSize.width;
    label.frame = newFrame;

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
                                                 initWithString:@"Longer Test Text"
                                                 attributes:attrs];

    [label setAttributedText:attributedText];
}
8 голосов
/ 12 марта 2014

Поскольку sizeWithFont: устарело в iOS 7 , вам необходимо использовать sizeWithAttributes (как объяснил maver здесь ).Чтобы упростить код, вы можете добавить метод, который вы можете использовать следующим образом:

-(CGRect)rectForText:(NSString *)text 
           usingFont:(UIFont *)font 
       boundedBySize:(CGSize)maxSize
{
    NSAttributedString *attrString =
        [[NSAttributedString alloc] initWithString:text
                                        attributes:@{ NSFontAttributeName:font}];

    return [attrString boundingRectWithSize:maxSize
                                    options:NSStringDrawingUsesLineFragmentOrigin
                                    context:nil];
}

и использовать его

CGSize maximumLabelSize = CGSizeMake(280,9999);
UIFont *font = [UIFont systemFontOfSize:20];
CGRect titleRect = [self rectForText:post.title // <- your text here 
                           usingFont:font
                       boundedBySize:maximumLabelSize];
7 голосов
/ 28 февраля 2013

В дополнение к ответу Саураба. У меня была такая же проблема, и вы должны добавить эту строку
[yourLabel setNumberOfLines:0];
, чтобы весь текст отображался в X строках.

...