2015-09-11 3 views
1

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

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

Я установил numberOfLines в 0, а также установил lineBreakMode в NSLineBreakByWordWrapping. Это помогает ярлыку отображать текст на нескольких строках.

Я попытался отрегулировать высоту метки, как вы увидите в коде, но она не работает.

Как предотвратить перекрытие меток из-за многострочного текста в ярлыке?

Вот код для заполнения этикетки с мультилиниями:

//add all the directions to the uiview 
    for (int i = 0; i < self.recipe.directions.count; i++) 
    { 
     UILabel *label = [[UILabel alloc] initWithFrame: CGRectMake(0,(i+1)*25,280,25)]; 
     label.lineBreakMode = NSLineBreakByWordWrapping; //multiple lines in a label 
     label.numberOfLines = 0; 
     label.text =[NSString stringWithFormat: @"%@", self.recipe.directions[i]]; 
     [label sizeToFit]; // resize the width and height to fit the text 
     NSLog(@"Actual height is: %f", label.frame.size.height); // Use this for spacing any further elements 


     CGSize expectedLabelSize = [label.text sizeWithFont:label.font 
              constrainedToSize:label.frame.size 
               lineBreakMode:NSLineBreakByWordWrapping]; 
     //adjust the label the the new height. 
     CGRect newFrame = label.frame; 
     newFrame.size.height = expectedLabelSize.height; 
     label.frame = newFrame; 
     [self.directionsView addSubview:label]; 

    } 

ответ

2

Вместо инициализации этикетки с у позиции (i+1)*25, вы должны хранить нижнее положение вашего последнего лейбла

CGFloat lastLabelBottomCoordinate = 25; 
CGFloat spaceBetweenLines = 10; 
for (int i = 0; i < 10; i++) 
{ 
    UILabel *label = [[UILabel alloc] initWithFrame: CGRectMake(0, lastLabelBottomCoordinate + spaceBetweenLines,280,25)]; 
    label.lineBreakMode = NSLineBreakByWordWrapping; //multiple lines in a label 
    label.numberOfLines = 0; 
    label.text =[NSString stringWithFormat: @"This is a very long text to see if the text have more than 2 lines"]; 
    [label sizeToFit]; // resize the width and height to fit the text 
    NSLog(@"Actual height is: %f", label.frame.size.height); // Use this for spacing any further elements 


    CGSize expectedLabelSize = [label.text boundingRectWithSize:CGSizeMake(label.frame.size.width, MAXFLOAT) 
                 options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:@{NSFontAttributeName : label.font} 
                 context:nil].size; 
    //adjust the label the the new height. 
    CGRect newFrame = label.frame; 
    newFrame.size.height = expectedLabelSize.height; 
    label.frame = newFrame; 

    lastLabelBottomCoordinate = label.frame.origin.y + label.frame.size.height; 
    [self.view addSubview:label]; 

} 

Это как это выглядит:

enter image description here

+1

Спасибо. Это работает. Но расстояние между текстами слишком велико. Как я могу уменьшить его ?. Кроме того, sizeWithFont устарел. Что можно использовать вместо этого? –

+1

Решен вопрос о расстоянии. Просто инициализировано lastLabelBottomCoordinate = 25 –

+1

Я только что отредактировал свой ответ. Для интервала между метками вы должны изменить интервал между переменными меток. Для устаревшего метода теперь вам нужно использовать 'boundingRectWithSize: options: attributes: context:' method – lucaslt89

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