如何在UITableView静态单元格中动态更改单元格高度

时间:2014-08-21 07:50:47

标签: ios objective-c uitableview

我使用UITableViewController代替detailView来显示一个实体细节。我在viewDidLoad方法中填充了PFQuery中的一行数据。我有一个单元格,我使用标签,我想根据NSString大小更改大小。我检查了很多答案,但都与indexPath有关,这是动态的,我有静态单元格。 My label显示完整的字符串,但我的单元格已修复。如何更改单元格的高度?请帮我纠正这个问题。

这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    PFQuery *query = [PFQuery queryWithClassName:@"Entities"];
    [query whereKey:@"name" equalTo:entityName];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            PFFile *thumbnail = [objects[0]  objectForKey:@"image"];
            detailsImageView.image = [UIImage imageNamed:@"loader.gif"];
            detailsImageView.file = thumbnail;
            [detailsImageView loadInBackground];
            detailLabel.numberOfLines = 0; // this label need dynamic height and its cell
            detailLabel.text = [objects[0]  objectForKey:@"descriptionLarge"];
            [detailLabel sizeToFit];
        } else {
            NSString *errorString = [[error userInfo] objectForKey:@"error"];
            NSLog(@"Error: %@", errorString);
        }
    }];
}

我试图通过选择单个单元格来执行以下操作,但它给了我UITableView错误,因为我没有定义tableView,如何定义或者如果您有任何其他好的解决方案请告诉我。

static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

我对批评编码质量持开放态度,因此您的反馈对我有价值。

4 个答案:

答案 0 :(得分:16)

如果是IOS 8 OR 9,则有一个简单的解决方法。

  1. 设置UILabel的约束。 (上,左,下,右)
  2. 将UILabel的行设置为0
  3. 在ViewController的viewDidLoad方法中添加以下代码:
  4. tableView.estimatedRowHeight = 68.0
    tableView.rowHeight = UITableViewAutomaticDimension
    
    1. 覆盖功能:
    2. override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
          return UITableViewAutomaticDimension
      }
      

答案 1 :(得分:3)

如果您使用的是自动布局。将顶部,左侧和右侧约束添加到您的标签中。

然后在heightForRowAtIndexPath创建您的单元格

static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

在设置值

后,将值设置为标签并计算标签的大小
    [cell layoutIfNeeded];
    return cell.label.frame.origin.y+cell.label.frame.size.height;

这将为您提供标签的确切高度,并且您的单元格高度将相同

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
            cell.titleLabel.text=@"YOUR TEXT";
            [cell layoutIfNeeded];
            return cell.titleLabel.frame.origin.y+cell.titleLabel.frame.size.height;
}

答案 2 :(得分:1)

以下是我的工作方式。

// this will set height of the row
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   String *yourLongString = "Long text here";
   UILabel *mLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,30)];
                                                                   your size will change here
   mLabel.hidden = YES;
   mLabel.text = yourLongString;
   [mLabel sizeToFit];
           ^^^^^^^^ this is very important

   return mLabel.frame.size.height;
}

现在在cellForRowAtIndexPath根据单元格的高度调整实际标签的高度。

如果你不清楚,请告诉我。

答案 3 :(得分:1)

我一直在尝试从很多天来实现这一目标,但事实并非如此。我尝试了Fahim的回答并得到了线索,我从其他不同的答案得到了并且能够完成它。 我在代码中添加了以下函数来获取标签的确切大小

-(CGFloat)getLabelHeightForText:(NSString *)text andWidth:(CGFloat)labelWidth
{

    CGSize maximumSize = CGSizeMake(labelWidth, 10000);
    NSLog(@"crossing getLabelheightForText");

    //provide appropriate font and font size
    CGSize labelHeighSize = [text sizeWithFont: [UIFont fontWithName:@"Trebuchet MS" size:17.0f]
                             constrainedToSize:maximumSize
                                 lineBreakMode:NSLineBreakByTruncatingTail];
    return labelHeighSize.height;
}

比我添加了indexPath,返回的所有单元格大小只显示一个单元格大小。

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    switch (indexPath.section)
    {
        case 0:
        {
            if (indexPath.row == 0)  // category name size
                return 44.0;   
            if (indexPath.row == 1)  // image size
                return 204;
        }
        default:
            return 44.0       
    }
}

但在此之后我获得了完美的标签大小,但仍然有更多的事要做,因为我使用PFQuery和tableView indexPath首先运行,这就是为什么它无法更新我的表,我仍然无法调整单元格大小。这里是重新加载我的tableView并解决我的问题的魔术线

[self.tableView reloadData];

虽然问题很简单,但它有很多东西,所以我把它作为回复来帮助其他人。