动态改变 Objective C 中单元格的高度

2023-12-06

我创建了一个带有表格视图的应用程序。它在每个单元格中使用视图和标签。但是,如果我在 (!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;
}

提前致谢。


我看到了很多解决方案,但都是错误的或不完整的。 viewDidLoad 和自动布局中的 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) ;

对于斯威夫特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 中创建单元格 有了这个,您无需再执行任何操作或覆盖。 (不要忘记数字操作系统行 0)和底部标签(约束)降级“内容拥抱优先级 - 垂直到 250”

enter image description here

您可以在以下网址下载代码:https://github.com/jposes22/exampleTableCellCustomHeight

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态改变 Objective C 中单元格的高度 的相关文章

随机推荐