变量UITableViewCell高度不起作用

时间:2015-09-14 16:46:34

标签: ios objective-c uitableview

我正在尝试使用可变单元格高度的UITableView。高度应基于从服务器获取的图像的高度。我虽然遇到了一些困难。这是代码:

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    CGFloat height = (0.5*(self.view.frame.size.width-10))+100;
    UILabel *heightLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width-35, 30)];
    heightLabel.text = [self.streams[indexPath.row] excerpt];
    heightLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
    heightLabel.numberOfLines = 3;
    [heightLabel sizeToFit];
    height = height + heightLabel.frame.size.height;

    NSLog(@"Cell height is %f", height);

    cell.backgroundColor = [UIColor colorWithRed:248.0/255.0 green:248.0/255.0 blue:248.0/255.0 alpha:1.0];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, self.view.frame.size.width-20, cell.frame.size.height-20)];
    backgroundView.backgroundColor = [UIColor whiteColor];
    backgroundView.tag = 1;

    [cell addSubview:backgroundView];

    NSURL *imageLink = [NSURL URLWithString:[self.streams[indexPath.row] image]];

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, self.view.frame.size.width-20, 0.5*(self.view.frame.size.width-10))];
    __block UIActivityIndicatorView *activityIndicator;
    __weak UIImageView *weakImageView = imageView;
    imageView.tag = 2;
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.clipsToBounds = YES;
    [cell addSubview:imageView];

    UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, imageView.frame.origin.y + imageView.frame.size.height + 10, self.view.frame.size.width-35, 30)];
    nameLabel.text = [self.streams[indexPath.row] name];
    nameLabel.textColor = [UIColor blackColor];
    nameLabel.textAlignment = NSTextAlignmentLeft;
    nameLabel.font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16];
    nameLabel.numberOfLines = 2;
    [nameLabel sizeToFit];
    nameLabel.tag = 3;
    [cell addSubview:nameLabel];

    UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, nameLabel.frame.origin.y + nameLabel.frame.size.height + 5, self.view.frame.size.width-35, 30)];
    descLabel.text = [NSString stringWithFormat:@"Posted by %@", [self.streams[indexPath.row] author]];
    descLabel.textColor = [UIColor colorWithRed:193.0/255.0 green:193.0/255.0 blue:193.0/255.0 alpha:1.0];
    descLabel.textAlignment = NSTextAlignmentLeft;
    descLabel.font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:12];
    descLabel.numberOfLines = 2;
    [descLabel sizeToFit];
    descLabel.tag = 5;
    [cell addSubview:descLabel];

    UILabel *websiteLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, descLabel.frame.origin.y + descLabel.frame.size.height + 5, self.view.frame.size.width-35, 30)];
    websiteLabel.text = [self.streams[indexPath.row] excerpt];
    websiteLabel.textColor = [UIColor colorWithRed:119.0/255.0 green:119.0/255.0 blue:119.0/255.0 alpha:1.0];
    websiteLabel.textAlignment = NSTextAlignmentLeft;
    websiteLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
   websiteLabel.numberOfLines = 3;
    [websiteLabel sizeToFit];
    websiteLabel.tag = 4;
    [cell addSubview:websiteLabel];

    [imageView sd_setImageWithURL: imageLink
             placeholderImage:[UIImage imageNamed:@"default.png"]
                      options:SDWebImageProgressiveDownload
                     progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                         if (!activityIndicator) {
                             [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]];
                             activityIndicator.center = weakImageView.center;
                             [activityIndicator startAnimating];
                         }
                     }
                    completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                        if (image) {
                            float newHeight;

                            @try {
                                [activityIndicator removeFromSuperview];
                                activityIndicator = nil;
                                float oldWidth = image.size.width;
                                float scaleFactor = imageView.frame.size.width / oldWidth;

                                newHeight = image.size.height * scaleFactor;
                            }
                            @catch (NSException *exception) {
                                newHeight = 0.5*(self.view.frame.size.width-10);
                            }
                            @finally {
                                imageView.image = image;
                                imageView.frame = CGRectMake(10, 10, self.view.frame.size.width-20, newHeight);
                                nameLabel.frame = CGRectMake(15, imageView.frame.origin.y + newHeight + 10, self.view.frame.size.width-35, 30);
                                [nameLabel sizeToFit];
                                descLabel.frame = CGRectMake(15, nameLabel.frame.origin.y + nameLabel.frame.size.height + 5, self.view.frame.size.width-35, 30);
                                [descLabel sizeToFit];
                                websiteLabel.frame = CGRectMake(15, descLabel.frame.origin.y + descLabel.frame.size.height + 5, self.view.frame.size.width-35, 30);
                                [websiteLabel sizeToFit];
                                UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
                                [self.tableView beginUpdates];
                                [cell setFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, newHeight+nameLabel.frame.size.height+descLabel.frame.size.height+websiteLabel.frame.size.height+50)];
                                [self.tableView endUpdates];
                                backgroundView.frame = CGRectMake(10, 10, self.view.frame.size.width-20, newHeight+nameLabel.frame.size.height+descLabel.frame.size.height+websiteLabel.frame.size.height+25);
                            }
                        }
                    }];

return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100.0f;
}

我做错了什么?目前,细胞正在重叠......

1 个答案:

答案 0 :(得分:0)

如果您的单元格高度可变,则应设置AutomaticDimension

viewDidLoad中的

设置了这个:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100

您可以删除heightForRowAtIndexPath或将其设置为自动

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension; //works only about iOS 8
}