通过更改内容框架更改单元格的高度

时间:2013-07-31 07:34:25

标签: ios objective-c uitableview

我可以制作更改行高的动画但UITableViewRowAnimationFade很难,因为它在动画时会闪烁

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Main VC";
    selectedIndexes = [NSMutableDictionary new];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self.tableView reloadData];
}

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath
{
    NSNumber *selectedIndex = [selectedIndexes objectForKey:indexPath];
return selectedIndex == nil ? NO : [selectedIndex boolValue];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static BOOL noFirst;
    if (!indexPath.row && !noFirst) {
        [selectedIndexes setObject:@(YES) forKey:indexPath];
        noFirst = YES;
    }
    if ([self cellIsSelected:indexPath]) {
        UIImage *cellImage = HelperDf.dataArray[indexPath.row][@"image"];
        CGFloat aspectRatioIndex =  cellImage.size.height / cellImage.size.width;
        return [Utils screenWidth:self.interfaceOrientation] * aspectRatioIndex;
    } else {
        return heightCell;
    }
}

我的didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath
{
    NSMutableSet *insideSet = [NSMutableSet new];
    [insideSet addObject:indexPath];
BOOL isSelected = ![self cellIsSelected:indexPath];
    for (NSIndexPath *keyIndexPath in selectedIndexes) {
        [insideSet addObject:keyIndexPath];
    }
    [selectedIndexes removeAllObjects];
[selectedIndexes setObject:@(isSelected) forKey:indexPath];
    [tableView reloadRowsAtIndexPaths:insideSet.allObjects withRowAnimation:UITableViewRowAnimationNone];
}

因此,如果我使用[tableView beginUpdates] [tableView endUpdates,则标签的更改框架和numberOfLinew会出现问题。我如何更改我在cellForRowAtIndexPath

中更改的标签和其他参数的帧
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MainCell";
    MainCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSDictionary *dataDictionary = HelperDf.dataArray[indexPath.row];
    cell.titleLabel.text = dataDictionary[@"title"];
    cell.descriptionLabel.width = [Utils screenWidth:self.interfaceOrientation] - 40;
    cell.descriptionLabel.text = dataDictionary[@"fullText"];
    if ([self cellIsSelected:indexPath]) {
        cell.sequeBtn.hidden = NO;
        cell.pictureView.contentMode = UIViewContentModeScaleToFill;
        cell.descriptionLabel.numberOfLines = 7;
    } else {
        cell.sequeBtn.hidden = YES;
        cell.pictureView.contentMode = UIViewContentModeScaleAspectFill;
        cell.descriptionLabel.numberOfLines = 2;
    }
    [cell.descriptionLabel sizeToFit];
    cell.pictureView.image = dataDictionary[@"image"];
    return cell;
}


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    MainCell *mainCell = (MainCell *)cell;
    mainCell.descriptionLabel.originY = mainCell.sequeBtn.hidden ? heightCell -  mainCell.descriptionLabel.height - 5 : mainCell.height - mainCell.sequeBtn.height - mainCell.descriptionLabel.height - 12;
}

1 个答案:

答案 0 :(得分:0)

这是我用来动态设置UITableViewCell高度的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
   NSDictionary* dict = [branchesArray objectAtIndex:indexPath.row];
   NSString* address = [NSString stringWithFormat:@"%@,%@\n%@\n%@\n%@",[dict objectForKey:@"locality"],[dict objectForKey:@"city"],[dict objectForKey:@"address"],[dict objectForKey:@"contactNumber"], [dict objectForKey:@"contactEmail"]];

    CGSize constraint = CGSizeMake(220, MAXFLOAT);

   CGSize size = [address sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14.0f] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];

   CGFloat height1 = MAX(size.height, 110.0f);
   return height1+20;
}

以及在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中设置框架