2015-11-18 2 views
2

До сих пор я работал над вычислением пользовательской высоты ячеек. Мне нужно изменить размер ячейки автоматически после сбора данных.Вычислить высоту метки автоматически в соответствии с линией текста

self.countLabel и и self.descriptionLabel принимают только одну строку текста, с другой стороны, self.detailLabel может содержать несколько строк. Таким образом, приведенные ниже коды - это то, как я устанавливаю ограничения.

enter image description here

CustomCell.m

- (void)initView 
{ 
    self.countLabel = [UILabel new]; 
    self.countLabel.text = @"AAAAAA"; 
    self.countLabel.font = [UIFont fontWithPixel:22]; 
    self.countLabel.numberOfLines = 1; 
    [self.contentView addSubview:self.countLabel]; 

    self.detailLabel = [UILabel new]; 
    self.detailLabel.text = @"Number of people: "; 
    self.detailLabel.font = [UIFont fontWithPixel:22]; 
    self.detailLabel.textColor = [UIColor qu_grayColor]; 
    [self.contentView addSubview:self.detailLabel]; 

    self.descriptionLabel = [UILabel new]; 
    self.descriptionLabel.numberOfLines = 1; 
    self.descriptionLabel.text = @"ABCDEFGHIJKLM"; 
    self.descriptionLabel.font = [UIFont fontWithPixel:26]; 
    [self.contentView addSubview:self.descriptionLabel]; 

    [self.countLabel mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.equalTo(self.contentView).offset(20); 
     make.top.equalTo(self.contentView).offset(5); 
     make.right.equalTo(self.contentView).offset(-10); 
    }]; 

    [self.detailLabel mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.equalTo(self.contentView).offset(20); 
     make.top.equalTo(self.countLabel.mas_bottom); 
     make.bottom.equalTo(self.descriptionLabel.mas_top); 
     make.right.equalTo(self.contentView).offset(-10); 
    }]; 

    [self.descriptionLabel mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.equalTo(self.contentView).offset(10); 
     make.right.equalTo(self.contentView).offset(-10); 
     make.bottom.equalTo(self.contentView).offset(-15); 

    }]; 
} 
+0

Если вы ориентируетесь на iOS 9+, это можно легко сделать с помощью stackviews. Вам нужно будет добавить метки в виде вертикального стека. Расположите представление стека в ячейке, используя автозапуск. – TheAppMentor

+0

@TheAppMentor Oop, это приложение должно поддерживать до iOS7.0. –

ответ

0
self.detailLabel.text = @"Number of peoples: "; 
self.detailLabel.font = [UIFont fontWithPixel:22]; 
... 
[self setLabelHeight:self.detailLabel]; 


- (void)setLabelHeight:(UILabel *)label { 
    CGFloat fixedWidth = label.frame.size.width; 
    CGSize newSize = [label sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; 
    CGRect newFrame = label.frame; 
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); 
    label.frame = newFrame; 
} 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //if indexPath.row == detailsLabelRow 
    //return self.detailLabel.height 
    //else 
    //return 1 line height 
} 
+0

К сожалению, это не сработает. –

+0

@Wongzigii после извлечения данных и установки текста для меток. Если вы вызываете '[self.tableView reloadData]', это не работает? –

+0

также сделать 'label.numberOfLines = 0;' –

0

вы должны установить количество строк на ноль первой наличие нескольких строк в UILabel.

self.countLabel.numberOfLines = 0; 

затем после установки метода текстового вызова ниже.

[self.countLabel sizeToFit]; 

или вы можете создать класс категории и добавить ниже метод в этом классе.

-(void)setText:(NSString *)text { 
    [super setText:text]; 
    [self sizeToFit]; 
} 

Это будет полезно, если вам не нужно называть его повсюду.

+0

Я пробовал ваш, но не помогал. –

0

использование приписывали строка

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

//Calculating height on base of length of text 
    UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
    NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
    initWithString:YOURSTRING //[NSString string withformat:@"\n Yourstring"] \n for: number of lines require for static label in cell 
    attributes:@ 
    { 
    NSFontAttributeName: font 
    }]; 
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){CELL_CONTENT_WIDTH, CGFLOAT_MAX} 
               options:NSStringDrawingUsesLineFragmentOrigin 
               context:nil]; 
    CGSize size = rect.size; 

    // NSString *height = [NSString stringWithFormat: @"%.2f", ceilf(size.height)+22]; 
    return (ceilf(size.height)+22)*0.6; //change 0.6 to 0.9 according to the difference in required and extra calculted height, it works for me every time 
} 
0

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Define Your Cell Here 

    //Setting Properties of Labels Here Like this 
    cell.countLabel.font = [UIFont systemFontOfSize:22]; 
    cell.countLabel.numberOfLines = 0; 

    cell.detailLabel.font = [UIFont systemFontOfSize:22]; 
    cell.detailLabel.numberOfLines = 0; 

    cell.descriptionLabel.numberOfLines = 0; 
    cell.descriptionLabel.font = [UIFont systemFontOfSize:26]; 

    //Setting label's Text Here 
    cell.countLabel.text = @"AAAAAA"; 
    cell.detailLabel.text = @"Number of people: "; 
    cell.descriptionLabel.text = @"ABCDEFGHIJKLM"; 

    //Setting Label's Dynamic Height Using setlableFrame Method 
    cell.countLabel = [self setlableFrame:cell.countLabel fontSize:22]; 
    cell.detailLabel = [self setlableFrame:cell.detailLabel fontSize:22]; 
    cell.descriptionLabel = [self setlableFrame:cell.descriptionLabel fontSize:26]; 

    //Setting Label's Frame According to Above Label 
    cell.detailLabel.frame = CGRectMake(cell.detailLabel.frame.origin.x,  cell.countLabel.frame.size.height + cell.countLabel.frame.origin.y, cell.detailLabel.frame.size.width, cell.detailLabel.frame.size.height); 

    cell.descriptionLabel.frame = CGRectMake (cell.descriptionLabel.frame.origin.x, cell.detailLabel.frame.size.height + cell.detailLabel.frame.origin.y, cell.descriptionLabel.frame.size.width, cell.descriptionLabel.frame.size.height); 

     return cell; 
} 

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat myCellHeight = 0;//For Cell Height 

    //For countLabel 
    UILabel * myLabel = [[UILabel alloc] init]; 
    myLabel.frame = CGRectMake(0, 0, 290, 21.0);//here set frame same as countLabel label's frame. make sure that, You must have setting width same as that label, otherwise you don't have accuracy for this. 
    myLabel.numberOfLines = 0; 
    myLabel.text = @"AAAAAA"; 
    myLabel = [self setlableFrame:myLabel fontSize:22.0]; 

    //Adding Height of countLabel 
    myCellHeight = myLabel.frame.size.height; 

    //For detailLabel 
    myLabel.text = @"Number of people: "; 
    myLabel = [self setlableFrame:myLabel fontSize:22.0]; 

    //Adding Height of detailLabel 
    myCellHeight = myCellHeight + myLabel.frame.size.height; 

    //For descriptionLabel 
    myLabel.text = @"ABCDEFGHIJKLM"; 
    myLabel = [self setlableFrame:myLabel fontSize:26.0]; 

    //Adding Height of detailLabel 
    myCellHeight = myCellHeight + myLabel.frame.size.height; 

    return myCellHeight; 
} 

Этот метод используется для создания динамической высоты этикетки в соответствии с текстом.

//for setting the dynamic height of labels 
-(UILabel *)setlableFrame:(UILabel*)myLabel fontSize:(float)size 
{ 
    CGSize possibleSize = [myLabel.text sizeWithFont:[UIFont systemFontOfSize: size] constrainedToSize:CGSizeMake(myLabel.frame.size.width, 9999) lineBreakMode:NSLineBreakByWordWrapping]; 

    CGRect newFrame = myLabel.frame; 
    newFrame.size.height = possibleSize.height; 
    //If you want dynamic width of label, then uncomment following line 
    //newFrame.size.width = possibleSize.width; 
    myLabel.frame = newFrame; 
    return myLabel; 
} 
0

Вам не нужно делать какие-либо изменения динамической высоты. Просто установите ограничения для всех меток, указав высоту, которая больше, чем минимальная высота метки и другие ограничения выравнивания с вертикальным выравниванием между ними. Также не забудьте установить к Lines собственности и Фиксированный размер шрифта для Autoshrink собственности. Теперь, когда вы назначаете длинный текст этикетки, просто вызовите

[self.view layoutIfNeeded]; 

и метки увеличит их высоту в соответствии с текстом внутри.

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