【问题标题】:Sizing a Custom UITableViewCell and included UIImageView based on Image Size根据图像大小调整自定义 UITableViewCell 并包含 UIImageView
【发布时间】:2011-11-11 20:25:09
【问题描述】:

我正在尝试在分组表视图中为 iPhone 应用程序自定义下面的 UITableViewCell。我想做的是让图像宽度占据整个单元格减去填充(280)和基于图像大小的高度变量。

目前我正在使用 SDWebImage 异步下载远程图像。在这种情况下,这可能不是正确的做法。我也无法弄清楚如何在初始化时为自定义单元格提供图像。图片 URL 存储在 DetailViewController 中的 self.beerPhoto 中。

我已经搜索了很多方法,但没有找到我正在寻找的东西。最接近的是:How to scale a UIImageView proportionally,但这种方法似乎要求单元格在初始化时具有图像,因为我试图使这段代码工作,但在初始化后设置图像会留下一个空白单元格。

当前代码包含我设置的常量,以近似纵向图像。实际上,有些图像是纵向的,有些是横向的。

如果您还需要了解任何其他信息,请告诉我。

自定义 UITableViewCell 的标题:

#import <UIKit/UIKit.h>


@interface BeerDetailHead : UITableViewCell {
    UILabel *beerName;
    UIImageView *beerImage;
}

@property(nonatomic, retain)UILabel *beerName;
@property(nonatomic, retain)UIImageView *beerImage;

@end

自定义 UITableViewCell 的相关实现部分

#import "BeerDetailHead.h"


@implementation BeerDetailHead

@synthesize beerName, beerImage;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        //beerName = [[UILabel alloc]init];
        //beerName.textAlignment = UITextAlignmentLeft;
        //beerName.font = [UIFont systemFontOfSize:14];
        beerImage = [[UIImageView alloc]init];
        //[self.contentView addSubview:beerName];
        [self.contentView addSubview:beerImage];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;
    CGRect frame;
    frame= CGRectMake(boundsX+10 ,10, 280, 375);
    beerImage.frame = frame;
}

DetailViewController 的 cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    NSArray *listData =[self.tableContents objectForKey:
                        [self.sortedKeys objectAtIndex:[indexPath section]]];

    NSLog(@"listData = %@", listData);

    NSUInteger row = [indexPath row];

    if ([self.sortedKeys objectAtIndex:[indexPath section]] == @"header"){
        static NSString *headerTableIdentifier = @"HeaderTableIdentifier";
        BeerDetailHead * headerCell = (BeerDetailHead*)[tableView
                                                        dequeueReusableCellWithIdentifier: headerTableIdentifier];

        if(headerCell == nil) {

            headerCell = [[[BeerDetailHead alloc] initWithFrame:CGRectZero reuseIdentifier:headerTableIdentifier] autorelease];                 
        }

        headerCell.beerName.text = [listData objectAtIndex:row];
        [headerCell.beerImage setImageWithURL:[NSURL URLWithString:self.beerPhoto]
                       placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
        //NSLog(@"frame = %@", headerCell.beerImage.frame);

        return headerCell;
    }
    else{
        //use standard UITableViewCell
    }
}

【问题讨论】:

    标签: objective-c ios image uitableview uiimageview


    【解决方案1】:

    实现tableView:heightForRowAtIndexPath:委托方法并从该方法返回计算出的每一行的高度。
    在您的 tableView 上加载每个图像调用 reloadData 后,或者如果您想要动画更改调用:

    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    

    此外,您可能希望将多个序列高度更新合并为一个。我会用一点延迟来执行此操作:

    // triggerUpdates calls the above code
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(triggerUpdates) object:nil];
    [self performSelector:@selector(triggerUpdates) withObject:nil afterDelay:0.1];
    

    【讨论】:

    • 我用一个常量实现了 tableView:heightForRowAtIndexPath;忘了在这里列出。截至目前,自定义 UITableViewCell 使用图像宽度、高度和 280 的恒定调整宽度来计算 UIImageView 框架的正确高度。在 viewDidAppear 中调用 reloadData 会给出正确的图像。但是,heightForRowAtIndexPath 是在图像具有正确高度之前计算的。仍在为高度制定适当的解决方案。
    • 只是好奇你为什么耽误了一点时间?有什么特别的原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2013-11-14
    • 2018-03-20
    • 1970-01-01
    • 2022-07-04
    相关资源
    最近更新 更多