2014-11-11 3 views
1

У меня есть длинный ярлык, который является моим первым ярлыком, и я хочу поместить его в свою ячейку. Это то, что у меня есть, но оно не работает.Fit Text в UItableView Cell

У меня есть пользовательский UITabelviewCell с несколькими ярлыками в нем.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
switch (indexPath.row) { 
    case 0:{ 

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

     CGSize size = [diningHallTimes[indexPath.row][@"description"] sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

     CGFloat height = MAX(size.height, 44.0f); 

      return height + (CELL_CONTENT_MARGIN * 2) + 40; 
//   return myStringSize.height; 
      break; 
     } 
     default: 
      return 40; 
      break; 
    } 
} 

Вот ячейка для ряда

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

DiningInfoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

CGSize size = [diningHallTimes[indexPath.row][@"description"] sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

CGFloat height = MAX(size.height, 44.0f); 

CGFloat the = height + (CELL_CONTENT_MARGIN * 2); 
cell.descriptionLabel.numberOfLines = 0; 

[cell.descriptionLabel setFrame:CGRectMake(20, 0, 280, the)]; 

NSLog(@"%f", the); 


cell.descriptionLabel.text = diningHallTimes[indexPath.row][@"description"]; 
cell.daysLabel.text = diningHallTimes[indexPath.row][@"days"]; 
cell.timeLabel.text = diningHallTimes[indexPath.row][@"time"]; 

return cell; 
} 

Но это то, что моя клетка выглядит

enter image description here

Не знаю, почему это происходит, я бегу iOS8, но Мне нужно, чтобы он работал как на том, так и в другом месте. 7.

Спасибо за h elp заранее.

ответ

2

Вам нужно вычислить boundingRectWithSize: для текста метки. Также необходимо рассчитать количество строк, необходимых для обновленного контента. Попробуйте этот метод ниже для вычисления нового фрейма для метки.

- (UILabel *) updateLabelFrame:(UILabel *)label { 

    CGRect lblRect = label.frame; 
    CGSize maxSize = CGSizeMake(label.frame.size.width, MAXFLOAT); 

    CGRect labelRect = [label.text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:nil]; 

    CGFloat labelHeight = labelRect.size.height; 

    // For below line 16 is default height (The height before content is set). Change this value 
    // as per your requirement 

    int lines = labelHeight/16; // Here 16 is a fix height (default height) for label. 
    [label setNumberOfLines:lines]; 
    lblRect.size.height = labelHeight; 
    [label setFrame:lblRect]; 

    return label; 
} 

Edit:

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

Для вашего случая вам необходимо поместить этот метод в класс контроллера класса. Затем вызовите этот метод в -cellForRowAtIndexPath после обновления содержимого для метки. Смотрите ниже код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    DiningInfoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

    CGSize size = [diningHallTimes[indexPath.row][@"description"] sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

    CGFloat height = MAX(size.height, 44.0f); 

    CGFloat the = height + (CELL_CONTENT_MARGIN * 2); 
    cell.descriptionLabel.numberOfLines = 0; 

    [cell.descriptionLabel setFrame:CGRectMake(20, 0, 280, the)]; 

    NSLog(@"%f", the); 


    cell.descriptionLabel.text = diningHallTimes[indexPath.row][@"description"]; 
    cell.daysLabel.text = diningHallTimes[indexPath.row][@"days"]; 
    cell.timeLabel.text = diningHallTimes[indexPath.row][@"time"]; 

    // Update descriptionLabel height. 

    cell.descriptionLabel = [self updateLabelFrame:cell.descriptionLabel]; 

    return cell; 
} 
+0

хорошо, но я использую метку в пользовательской ячейке, поэтому self.label дает ошибку. Мне нужно иметь возможность использовать метку из ячейки. – iqueqiorio

+0

@iqueqiorio. Добавьте этот метод в свой контроллер и передайте метку в качестве аргумента в вышеуказанном методе. , Проверьте ответ. Я обновил метод с помощью аргументов. – Kampai

1

Вы должны установить ограничения Autolayout для метки и создать прототип ячейки с содержимым. И тогда вы должны вернуться, тогда вы должны получить высоту ячейки.

Для справки, вы можете увидеть следующее видео https://www.youtube.com/watch?v=6KImie4ZMwk

+0

Я не использую Автокомпоновка, это могло быть сделано без него? – iqueqiorio

+0

Это можно сделать с большим количеством работы без AL. Лично я бы использовал AL. Это сэкономит вам массу времени на написание кода, который не нужен. – Tander

1

Попробуйте [yourLabel sizeToFit] или вы можете использовать [yourLabel sizeThatFit:CGFrame];