最近在作公司項目的時候,遇到了前端上傳多張圖片到七牛服務器後,前端在列表展現圖片適配的問題。一開始我設置的固定高度,由於圖片尺寸不是固定的,會出現不一樣程度的拉伸狀況,用戶體驗也很很差。經過設置圖片視圖contentMode這個屬性,雖然能保證圖片不被拉伸,但圖片會出現顯示不全的問題。前端
第一種方案是能夠實現圖片的適配問題,我採用了第二種。圖片都是網絡加載的,要想拿到image,就必需要將圖片下載下來,這樣就能夠獲取到圖片的尺寸。下面貼出我實現的關鍵步驟吧。git
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ImageViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier forIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSString *url = self.imageUrlArray[indexPath.row];
[cell.autoImageView sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:nil options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image.size.height) {
/** < 圖片寬度 > */
CGFloat imageW = [UIScreen mainScreen].bounds.size.width - 2 * 15;
/** <根據比例 計算圖片高度 > */
CGFloat ratio = image.size.height / image.size.width;
/** < 圖片高度 + 間距 > */
CGFloat imageH = ratio * imageW + 15;
/** < 緩存圖片高度 沒有緩存則緩存 刷新indexPath > */
if (![[self.heightDict allKeys] containsObject:@(indexPath.row)]) {
[self.heightDict setObject:@(imageH) forKey:@(indexPath.row)];
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
}
}];
return cell;
}
複製代碼
注意github
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [[self.heightDict objectForKey:@(indexPath.row)] floatValue];
}
複製代碼
到這裏,就已經實現了圖片自適應高度的需求了,具體詳情,請看測試UITableViewCellAutoImageHeight。實現這個需求,本身也折騰了一段時間,上面的方法如今也能知足項目的需求,可是在UI效果上感受仍是有一些不完美之處。若是大神有更好的實現方案和優化方法,但願能多多交流學習。若是之後有更好的實現方案,我也會在這篇文章中記錄下來。緩存
2017年還剩兩天,這篇文章也是今年寫的最後一篇文章吧,寫文章的初衷也是爲了記錄本身學習成長的點滴,同時也但願可以幫助到須要的人。2017就要結束了,本身的指望也未達到,但願在即將到來的2018年,本身更加努力,可以實現本身的指望與目標。奮鬥吧,少年!bash