非等高cell,根据图片宽高,排布tableview

来源:互联网 发布:tinyumbrella java 编辑:程序博客网 时间:2024/06/05 05:44

有2种情况:

1,服务端接口返回图片的宽高,这种比较简单,直接在

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

这个方法中根据图片宽高来返回cell的高度,简单处理下即可

2,服务端接口不返回图片的宽高,这种情况的话,一开始设置个cell的默认高度,在图片下载完成后刷新该行,重新设置cell的高度。具体代码如下:

开始是调用接口得到DetailModel的数组,设置DetailModel实例的imageUrl属性[self.tableViewreloadData];

tableviewcontroller的部分实现:

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

    DetailCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellID];

    cell.selectionStyle =UITableViewCellSelectionStyleNone;

    

    DetailModel *detailModel = [self.arrobjectAtIndex:indexPath.row];

    

    if (detailModel.imageSize.width && detailModel.imageSize.height) {

        CGRect frame = cell.image.frame;

        frame.size.height325 * detailModel.imageSize.height / detailModel.imageSize.width;

        cell.image.frame = frame;

        

        [cell.imagesd_setImageWithURL:[NSURLURLWithString:detailModel.imageUrl]placeholderImage:[UIImageimageNamed:@"loading"] ];

    } else {

        // 防止placeholder的图片拉伸

        CGRect frame = cell.image.frame;

        frame.size.height =225;

        cell.image.frame = frame;

        

        [cell.imagesd_setImageWithURL:[NSURLURLWithString:detailModel.imageUrl]placeholderImage:[UIImageimageNamed:@"loading"]completed:^(UIImage *image,NSError *error, SDImageCacheType cacheType,NSURL *imageURL) {

            

            NSLog(@"%@===%s===%@", [NSThreadcurrentThread], __func__,NSStringFromCGSize(image.size));

            

            if (image && image.size.height && image.size.width) {

                detailModel.imageSize = image.size;

                CGRect frame = cell.image.frame;

                frame.size.height325 * image.size.height / image.size.width;

                cell.image.frame = frame;

                // 防止数组越界的崩溃,使用异步方法去刷新cell

                dispatch_async(dispatch_get_main_queue(), ^{

                    NSLog(@"%@ %@", [NSThreadcurrentThread], indexPath);

                    [self.tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationNone];

                });

            }

            

        }];

    }

    return cell;

}


#pragma mark- UITableViewDelegate

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    DetailModel *detailModel =self.arr[indexPath.row];

    CGSize size = detailModel.imageSize;

    if (size.width && size.height) {

        return325 * size.height / size.width +20;

    } else {

        return225 + 20;

    }

}



DetailCell的实现:

DetailCell.h

#import <UIKit/UIKit.h>

@interface DetailCell : UITableViewCell

/** 底部显示的大图 */

@property (nonatomic,weak) UIImageView *image;

@end


DetailCell.m

#import "DetailCell.h"

@implementation DetailCell

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

    self = [superinitWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {

        //底部显示的大图片

        UIImageView *image = [[UIImageViewalloc] initWithFrame:CGRectMake(10,10, 325,225)];

        image.backgroundColor = [UIColorlightGrayColor];


        [selfaddSubview:image];

        self.image = image;

    }

    returnself;

}

@end



DetailModel的实现:

DetailModel.h

#import <UIKit/UIKit.h>

@interface DetailModel : NSObject

@property (nonatomic,copy) NSString *imageUrl;

@property (nonatomic,assign) CGSize imageSize;

@end


DetailModel.m

#import "DetailModel.h"

@implementation DetailModel

@end






0 0
原创粉丝点击