4

我创建了一个带有表格视图的应用程序。它在每个单元格中使用一个视图和一个标签。但是,如果我在 (!cell) 代码中创建视图和单元格,它会返回空单元格,如果我删除 (!cell) 条件,它会显示数据但不采用动态高度。谁能帮帮我吗。

- (void)viewDidLoad{ 
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", LanguageFile]];

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfFile:DataPath];

self.reloadArray = [tempDict objectForKey:@"Rows"];}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [self.reloadArray count];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// Get data for the current row
  NSString *textData = [reloadArray objectAtIndex:indexPath.section]

CGFloat dataTextHeight = [self getLabelHeightForIndex:textData];

    if(dataTextHeight < 44)
    {
        dataTextHeight = 44;
    }

    return dataTextHeight;
}

-(CGFloat)getLabelHeightForIndex:(NSString *)string
{
CGSize maximumSize = CGSizeMake(280, 10000);

CGSize labelHeightSize = [string sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14.0f] constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

if(labelHeightSize.height < 44){
    labelHeightSize.height = 44;
}

return labelHeightSize.height;
}



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

static NSString *CellIdentifier = @"Cell";

static const int textViewTag = 1, textLabelTag = 2;

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"standard_back.png"]];

img.frame = tableView.frame;
tableView.backgroundView = img;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (!cell) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    // First view
    UIView *textView = [[UIView alloc] initWithFrame: CGRectMake(0.0, 0.0, 280.0, 36.00)];
    textView.tag = textViewTag;
    textView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    [cell.contentView addSubview:textView];

    // First label
    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 270.0, 36.00)];
    textLabel.tag = textLabelTag;
    textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14.0f];
    textLabel.textColor = [UIColor whiteColor];
    textLabel.backgroundColor = [UIColor clearColor];
    textLabel.numberOfLines = 0;
    textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    // textLabel.clipsToBounds = YES;
    [cell.contentView addSubview:textLabel];
}


    NSString *textData = [reloadArray objectAtIndex:(indexPath.section)];

    CGFloat dataTextHeight = [self getLabelHeightForIndex:textData];

    UIView *textView = [cell.contentView viewWithTag:textViewTag];
    CGRect textViewFrame = textView.frame;
    textView.frame = CGRectMake(0.0, 0.0, textViewFrame.size.width, dataTextHeight);

    UILabel *textLabel = [cell.contentView viewWithTag:textLabelTag];
    CGRect textLabelFrame = textLabel.frame;
    textLabel.frame = CGRectMake(10.0, 0.0, textLabelFrame.size.width, dataTextHeight);
    textLabel.text = textData;
    textLabel.backgroundColor= [UIColor clearColor];
    textLabel.textAlignment = NSTextAlignmentCenter;


cell.backgroundColor = [UIColor colorWithWhite:0 alpha:.65];
cell.textLabel.numberOfLines = 0; // Multiline
cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

return cell;
}

提前致谢。

4

3 回答 3

6

我看到了很多解决方案,但都是错误的或不完整的。你可以用 viewDidLoad 和 autolayout 中的 5 行来解决所有问题。这对于目标 C:

_tableView.delegate = self;
_tableView.dataSource = self;
self.tableView.estimatedRowHeight = 80;//the estimatedRowHeight but if is more this autoincremented with autolayout
self.tableView.rowHeight = UITableViewAutomaticDimension;
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0) ;

对于 Swift 2.0:

 self.tableView.estimatedRowHeight = 80
 self.tableView.rowHeight = UITableViewAutomaticDimension      
 self.tableView.setNeedsLayout()
 self.tableView.layoutIfNeeded()
 self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0)

现在使用 xib 或在 Storyboard 中的 tableview 中创建单元格有了这个,您无需再实现或覆盖。(不要忘记数字 os 行 0)和底部标签(约束)降级“Content Hugging Priority -- Vertical to 250”

在此处输入图像描述

您可以在下一个 url 中下载代码: https ://github.com/jposes22/exampleTableCellCustomHeight

参考资料:http ://candycode.io/automatically-resizing-uitableviewcells-with-dynamic-text-height-using-auto-layout/

于 2016-02-07T12:09:36.920 回答
3

这是我在我的应用程序中使用的代码的一部分。它对我有用。如果你需要帮助,请联系我。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
CGSize constraintSize = {230.0, 20000}; //230 is cell width & 20000 is max height for cell
CGSize neededSize = [ [NSString stringWithFormat:@"%@",[cellar objectAtIndex:indexPath.row]] sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Medium" size:15.0f] constrainedToSize:constraintSize  lineBreakMode:UILineBreakModeCharacterWrap];


return MAX(45, neededSize.height +33);


}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

{        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


}


CGSize constraintSize = {230.0, 20000};


UILabel* label = [[UILabel alloc] init];

[label setNumberOfLines:0];

label.backgroundColor = [UIColor clearColor];

[label setFont:[UIFont fontWithName:@"HelveticaNeue-Medium" size:15.0f]];

label.adjustsFontSizeToFitWidth = NO;
CGSize neededSize = [ [NSString stringWithFormat:@"%@",[cellar objectAtIndex:indexPath.row] ] sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Medium" size:15.0f] constrainedToSize:constraintSize  lineBreakMode:UILineBreakModeCharacterWrap];
// NSLog(@"Height%f",neededSize.height);
//NSLog(@"width%f",neededSize.width);
[label setText:[NSString stringWithFormat:@"%@",[cellar objectAtIndex:indexPath.row] ]];

[label setFrame:CGRectMake(10, 2, 230, MAX(neededSize.height+30, 44.0f))];

[[cell contentView] addSubview:label];




cell.selectionStyle=UITableViewCellSelectionStyleNone;


return cell;


}

希望能帮助到你。!!!

于 2013-03-25T09:55:05.130 回答
0
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     return "your content height";
}
于 2016-07-19T12:17:55.830 回答