UITableViewCell自适应网络不规则图片和文字组合的高度
wbdy4196
8年前
<p><img src="https://simg.open-open.com/show/3cac4ecb832d2c1720f6afb052ec30ad.png"></p> <p>列表样式</p> <p>有时我们会需要对cell的图片和文字进行显示并完美自适配其大小,下面用我有限的知识做了个适配,看着好像还能用,哈哈</p> <p>直接上code</p> <p>001 在tableview的获取cell高度的方法里写调用自定义cell的一个方法</p> <pre> <code class="language-objectivec">- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 计算cell内容的高度 TableViewCell *cell = (TableViewCell *)[self tableView:_tableView cellForRowAtIndexPath:indexPath]; return [cell cellForHeight]; }</code></pre> <p>002 接下来开始重点喽</p> <p>自定义TableViewCell的.h文件, 做主要控件</p> <pre> <code class="language-objectivec">@interface TableViewCell : UITableViewCell @property (nonatomic, strong) UILabel *title; @property (nonatomic, strong) UIImageView *photo; @property (nonatomic, strong) UILabel *describe; @property (nonatomic, assign) CGSize imageSize; @property (nonatomic, assign) CGSize describeSize; @property (nonatomic, strong) DataModel *model; - (void)setModel:(DataModel *)model; // 获取cell的高度的方法 - (CGFloat)cellForHeight; @end</code></pre> <p>003 在.m文件里进行赋值</p> <pre> <code class="language-objectivec">- (void)setModel:(DataModel *)model { self.title.text = model.title; // 给图片赋值 [self setImageURLSize:model.imageURL]; // 给文字赋值 [self setreviewContentText:model.describe]; }</code></pre> <p>003__01 文字的自适应高度</p> <pre> <code class="language-objectivec">//赋值 and 自动换行,计算出cell的高度 -(void)setreviewContentText:(NSString*)text { //获得当前cell高度 CGRect frame = [self frame]; //文本赋值 self.describe.text = text; //设置label的最大行数 self.describe.numberOfLines = 0; CGSize size = CGSizeMake(self.width-30, 1000); self.describeSize = [self.describe.text sizeWithFont:self.describe.font constrainedToSize:size lineBreakMode:NSLineBreakByClipping]; self.describe.frame = CGRectMake(self.describe.frame.origin.x, self.photo.bottom + 10, _describe.width, _describeSize.height); frame.size.height = _describe.height; self.frame = frame; }</code></pre> <p>003__02 网络不规则图片的自适应高度,记得导入SDWebImage</p> <pre> <code class="language-objectivec">-(void)setImageURLSize:(NSString*)imageURL { // 先从缓存中查找图片 UIImage *image = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey: imageURL]; // 没有找到已下载的图片就使用默认的占位图,当然高度也是默认的高度了,除了高度不固定的文字部分。 if (!image) { image = [UIImage imageNamed:@"Wechat"]; // 图片不存在,下载图片 [self downloadImage:imageURL]; } else { self.photo.image = image; //手动计算cell CGFloat imgHeight = image.size.height * [UIScreen mainScreen].bounds.size.width / image.size.width; _photo.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width , imgHeight); _imageSize.height = imgHeight; } }</code></pre> <p>图片不存在,下载图片</p> <pre> <code class="language-objectivec">- (void)downloadImage:(NSString*)imageURL { // 利用 SDWebImage 框架提供的功能下载图片 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageURL] options:(SDWebImageDownloaderUseNSURLCache) progress:^(NSInteger receivedSize, NSInteger expectedSize) { } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { [[SDImageCache sharedImageCache] storeImage:image forKey:imageURL toDisk:YES]; dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程做操做 // 请求完成 刷新代码 [[NSNotificationCenter defaultCenter] postNotificationName:@"reload" object:nil]; }); }]; }</code></pre> <p>004 在列表页收到刷新通知,并刷新列表</p> <pre> <code class="language-objectivec">// 接受通知并刷新tableview [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reload:) name:@"reload" object:nil]; - (void)reload:(UIButton *)button { [_tableView reloadData]; }</code></pre> <p>到此就欧了</p> <p><img src="https://simg.open-open.com/show/31c425479aac227ee61fd9d03d6933a0.gif"></p> <p>1135.gif</p> <p><a href="/misc/goto?guid=4959732717769784877" rel="nofollow,noindex"><strong>点击下载Demo</strong> </a></p> <p> </p> <p>来自:http://www.jianshu.com/p/d010949b40b4</p> <p> </p>