从uiimageview大小设置tableviewcell的高度

时间:2011-02-20 12:19:11

标签: uitableview

我有一个填充了自定义单元格的UITableView。 我用UIImageVIew创建了类型StripTableViewCell。

@interface StripTableViewCell : UITableViewCell {
    IBOutlet UIImageView *strip;
}

@property (nonatomic, retain) UIImageView *strip;

@end

使用新的UIImageView初始化StripTableViewCell:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code.
        strip = [[UIImageView alloc] init];
        [self.contentView addSubview:strip];
    }
    return self;
}

UIImageView的ContentMode设置为UIViewContentModeScaleAspectFill;使图像适合细胞的整个宽度。

- (void)layoutSubviews {
    [super layoutSubviews];
    strip.contentMode = UIViewContentModeScaleAspectFill;
    CGRect contentRect = self.contentView.bounds;
    CGRect frame;
    frame= CGRectMake(0, 0, contentRect.size.width, contentRect.size.height);

    strip.frame = frame;
}

单元格填充如下:

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

    static NSString *CellIdentifier = @"StripCell";

    StripTableViewCell *cell = (StripTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[StripTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSInteger row = [indexPath row];
    Strip *strip = [self.stripsArray objectAtIndex:row];
    UIImage *img = [[UIImage alloc] initWithData:strip.data];
    cell.strip.image = [img autorelease];

    return cell;
}

图像的高度可能不同,因此我必须将单元格的高度调整到imageview的高度。 现在,我的问题是我希望单元格高度适合imageview的高度。 我通过找到当前单元格并从该单元格返回imageview的高度来给它一个镜头,但它渲染的尺寸完全错误。

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
    StripTableViewCell *cell = (StripTableViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];

    UIImageView *picture = cell.strip;

    return picture.bounds.size.height; 
}

我的应用程序只会渲染第一个图像,而单元格的大小错误。 所以我想我的方法在这里有点不对劲。你们能帮助我朝正确的方向发展吗?

PS:在上述例子中不要介意记忆管理,这些都是从上下文中删除的。

2 个答案:

答案 0 :(得分:0)

这里有很多可能出错的地方,并且您没有包含任何显示如何在UITableViewCell子类中创建和初始化UIImageView的代码。确保正确设置“IBOutlet UIImageView * strip”的帧大小。请记住,UIImageView将根据UIImageView的框架和contentMode以及图像的大小显示图像。你说你设置了单元格的contentMode,但是你设置了UIImageView的contentMode吗?如果您希望图像在UIImageView中以完整大小显示,那么您需要修改UIImageView的帧大小以匹配您在其中设置的UIImage的边界。

编辑:你的自我回答解决的问题是你的行高是基于图像的高度,而不是 imageview的高度 。将图像设置为imageview不会改变imageview框架的大小!一旦你返回了行的正确高度,这将“流向”contentView的高度,并根据你的代码流向UIImageView的高度。

你可以通过在字典中缓存UIImage并在cellForRowAtIndexPath中重用它来解决双重创建问题。

答案 1 :(得分:0)

我实际上通过实现heightForRowAtIndexPath找到了一种方法。但它看起来有点难看,但现在是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger row = [indexPath row];
    Strip *strip = [self.stripsArray objectAtIndex:row];
    UIImage *img = [[[UIImage alloc] initWithData:strip.data] autorelease];
    CGImageRef image = img.CGImage;
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);
    float factor = self.view.bounds.size.width/(float)width;
    return height*factor;   
}

它是一个nes UIImage,它使用相同的数据来填充单元格中的UIImageView。从原始大小和UITableView的宽度我计算一个因子,我用它来相应地乘以高度。这有效,但它有点难看,我不认为这个解决方案表现得很好。

有更好的想法吗?