IOS:使用自定义uitableviewcell的动态高度 [英] IOS: dynamic height with a custom uitableviewcell

查看:117
本文介绍了IOS:使用自定义uitableviewcell的动态高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是ios开发的新手,到目前为止这是我的问题。我能够通过委托heightForRowAtIndexPath动态计算自定义单元格的高度。所以在第一次加载时,每件事都显示得非常好。

I am new at ios development and this is my problem thus far. I am able to dynamically calculate the height of a custom cell via the delegate "heightForRowAtIndexPath". So on the first load, every thing is display perfectly fine.

我的问题是,一旦我开始滚动,一切都搞砸了。我认为滚动heightForRowAtIndexPath时,每个单元格不再调用屏幕上显示,因此无法计算新的单元格高度。

My problem is as soon as I start scrolling, everything just messes up. I think that while scrolling the "heightForRowAtIndexPath" is no longer called per cell that get display on screen, so the new cell height cannot be calculated.

所以我一直在在这里坚持了一段时间。我想知道你们中是否有人可以伸出援助之手。提前谢谢。

So I've been stuck here for a while. I was wondering if any of you could lend me a hand. thank you in advance.

我会将代码发布到相关文件中。这些文件包括自定义单元格h和m文件。视图控制器m文件的相关功能。

I'll post the code to relevant files. These files include the custom cell h and m file. and relevant functions of the view controller m file.

// ######################################################
// HelpTableViewCell.h
#import <UIKit/UIKit.h>

@interface HelpTableViewCell : UITableViewCell  {
  IBOutlet UILabel *labelName;
  IBOutlet UILabel *labelDescription;

  IBOutlet UIView *viewBackground;
}

@property (nonatomic, retain) UILabel *labelName;
@property (nonatomic, retain) UILabel *labelDescription;

@property (nonatomic, retain) UIView *viewBackground;

@end

// ######################################################
// HelpTableViewCell.m
#import "HelpTableViewCell.h"

@implementation HelpTableViewCell

@synthesize labelName;
@synthesize labelDescription;

@synthesize viewBackground;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

  if (self) {
  }

  return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated  {

  self.labelName.lineBreakMode = UILineBreakModeWordWrap;
  self.labelName.numberOfLines = 0;
  self.labelName.font = [UIFont boldSystemFontOfSize:15];
  [self.labelName sizeToFit];

  self.labelDescription.lineBreakMode = UILineBreakModeWordWrap;
  self.labelDescription.numberOfLines = 0;
  self.labelDescription.font = [UIFont fontWithName:@"Arial" size:15];
  [self.labelDescription sizeToFit];

  [super setSelected:selected animated:animated];
}

- (void) dealloc  {
  [labelName release], labelName = nil;
  [labelDescription release], labelDescription = nil;

  [super dealloc];
}

@end


// ######################################################
// in my view controller m file
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {  
  static NSString *CellIdentifier = @"HelpTableViewCell";
  HelpTableViewCell *cell = (HelpTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil)  {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HelpTableViewCell" owner:nil options:nil];

    for (id currentObject in topLevelObjects) {
      if ([currentObject isKindOfClass:[UITableViewCell class]])  {
        cell = (HelpTableViewCell *) currentObject;
        break;
      }
    }

  }

  cell.labelName.text = [self.instructionName objectAtIndex:indexPath.row];
  cell.labelDescription.text = [self.instructionDescription objectAtIndex:indexPath.row];

  return cell;
}

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellText = [self.instructionDescription objectAtIndex:indexPath.row];
    UIFont *cellFont = [UIFont fontWithName:@"Arial" size:15];
    CGSize constraintSize = CGSizeMake(320.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 25;  
}


推荐答案

如果单元格中的文字要改变,你需要在tableView上调用 reloadData ,否则 tableView:heightForRowAtIndexPath :将不会被调用。

If the text in the cells is going to change, you will need to a call reloadData on your tableView when it does, otherwise the tableView:heightForRowAtIndexPath: won't be called.

tableView的工作方式是它在每次重新加载(以及重载变量)时收集所有行的高度。这就是iOS知道整个表的高度的方式。在抓取单个单元格时,它不再调用 tableView:heightForRowAtIndexPath :通常调用 reloadData 非常快,此方法与其变体不同,不会导致任何滚动。

The way the tableView works is that it gathers the heights for all rows at every reload (and the reload variants). This is how iOS knows the height of the entire table. It doesn't call tableView:heightForRowAtIndexPath: again when grabbing individual cells. Usually calling reloadData is quite quick and this method, unlike its variants, doesn't cause any scrolling.

参见 stackoverflow问题和答案背景。

如果你需要做很多工作来计算高度并且你有数百或数千行,就会出现问题。在一个用例中,我喜欢这样,我缓存行高计算以获得不错的性能。但如果那不是你的情况,那就用 reloadData 做一点自由。

Problems arise if you have to do a lot of work to calculate heights and you have hundreds or thousands of rows. In one use case I have like this, I cache the row height calculations to get decent performance. But if that's not your case, just be a little more liberal with reloadData.

这篇关于IOS:使用自定义uitableviewcell的动态高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆