iOS 개발 TableView 이미지 최적화

이전에 한 회사 에서 친구 권 과 유사 한 기능 을 개 발 했 는데 그 전에 네 이 티 브 컨트롤 을 직접 사 용 했 고 CoreText 로 실현 하지 않 았 다(CoreText 로 그 리 는 것 도 좋 은 최적화 방안 이다).그림 에 대한 처 리 는 주로 다음 과 같은 처 리 를 했다(항목 에서 앞의 두 가 지 를 사용 했다.세 번 째 는 인터넷 에서 본 것 은 주로 이 세 곳 에서 유래 한 것 이다.http://www.jianshu.com/p/328e503900d0,
http://www.2cto.com/kf/201504/392433.html, https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html#):1.더 가 벼 운 layer 를 사용 하여 그림 을 표시 합 니 다.2.고정 크기 의 그림 을 다시 만 듭 니 다.3.tableView 가 굴 러 갈 때 그림 다운 로드 를 하지 않 습 니 다(직접 차지 하 는 그림 표시).스크롤 을 멈 출 때 그림 다운 로드 를 진행 합 니 다.현재 세 번 째 방법 은 다음 과 같 습 니 다.주요 코드:1.속성 정의
@property (nonatomic, strong) NSArray *array;
@property (nonatomic, strong) NSMutableArray *downImageArray;
@property (nonatomic, weak) UITableView *tableView;

2、viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];
    _downImageArray = [NSMutableArray array];
    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    tableView.delegate = self;
    tableView.dataSource = self;
    [tableView registerNib:[UINib nibWithNibName:@"TableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];
    [self.view addSubview:tableView];
    _tableView = tableView;
    _array = @[@"http://app.fssgjz.cn:5287/agent/M22quanmiannengfu.png",
               @"http://app.fssgjz.cn:5287/agent/5Ayishufengx.png",
               @"http://app.fssgjz.cn:5287/agent/fengxiong.png",
               @"http://app.fssgjz.cn:5287/agent/quban.png",
               @"http://app.fssgjz.cn:5287/agent/meibi.png",
               @"http://app.fssgjz.cn:5287/agent/meifu.png",
               @"http://app.fssgjz.cn:5287/agent/huanyanshu.png",
               @"http://app.fssgjz.cn:5287/agent/baogongshu.png",
               @"http://app.fssgjz.cn:5287/agent/action_ticket_main.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_zr.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_main2.png",
               
               @"http://app.fssgjz.cn:5287/agent/M22quanmiannengfu.png",
               @"http://app.fssgjz.cn:5287/agent/5Ayishufengx.png",
               @"http://app.fssgjz.cn:5287/agent/fengxiong.png",
               @"http://app.fssgjz.cn:5287/agent/quban.png",
               @"http://app.fssgjz.cn:5287/agent/meibi.png",
               @"http://app.fssgjz.cn:5287/agent/meifu.png",
               @"http://app.fssgjz.cn:5287/agent/huanyanshu.png",
               @"http://app.fssgjz.cn:5287/agent/baogongshu.png",
               @"http://app.fssgjz.cn:5287/agent/action_ticket_main.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_zr.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_main2.png",
               
               @"http://app.fssgjz.cn:5287/agent/M22quanmiannengfu.png",
               @"http://app.fssgjz.cn:5287/agent/5Ayishufengx.png",
               @"http://app.fssgjz.cn:5287/agent/fengxiong.png",
               @"http://app.fssgjz.cn:5287/agent/quban.png",
               @"http://app.fssgjz.cn:5287/agent/meibi.png",
               @"http://app.fssgjz.cn:5287/agent/meifu.png",
               @"http://app.fssgjz.cn:5287/agent/huanyanshu.png",
               @"http://app.fssgjz.cn:5287/agent/baogongshu.png",
               @"http://app.fssgjz.cn:5287/agent/action_ticket_main.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_zr.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_main2.png",
               
               @"http://app.fssgjz.cn:5287/agent/M22quanmiannengfu.png",
               @"http://app.fssgjz.cn:5287/agent/5Ayishufengx.png",
               @"http://app.fssgjz.cn:5287/agent/fengxiong.png",
               @"http://app.fssgjz.cn:5287/agent/quban.png",
               @"http://app.fssgjz.cn:5287/agent/meibi.png",
               @"http://app.fssgjz.cn:5287/agent/meifu.png",
               @"http://app.fssgjz.cn:5287/agent/huanyanshu.png",
               @"http://app.fssgjz.cn:5287/agent/baogongshu.png",
               @"http://app.fssgjz.cn:5287/agent/action_ticket_main.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_zr.png",
               @"http://app.fssgjz.cn:5287/agent/action_choose_main2.png"
               ];
}

3.tableView 코드 sdwebimage 는 다운로드 한 그림 에 캐 시 역할 을 합 니 다.downImageArray 는 이미 다운로드 한 NSIndxPath 를 저장 하 는 데 사 용 됩 니 다.tableView 속성 isDragging 은 빠르게 굴 러 가 고 있 음 을 표시 합 니 다.isDecelerating 은 느 린 속도 로 굴 러 가 고 있 음 을 표시 합 니 다.tableView 가 굴 러 가 고 있 고 이 cell 의 그림 이 다운로드 되 지 않 았 을 때 자리 잡 은 그림 을 직접 표시 합 니 다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    if ((self.tableView.isDragging || self.tableView.isDecelerating) && ![self.downImageArray containsObject:indexPath]) {
        cell.iconView.image = [UIImage imageNamed:@"1.jpg"];
        return cell;
    }
    [cell.iconView sd_setImageWithURL:[NSURL URLWithString:_array[indexPath.row]] placeholderImage:[UIImage imageNamed:@"1.jpg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        if (![self.downImageArray containsObject:indexPath]) {
            [self.downImageArray addObject:indexPath];
        }
    }];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 89.0;
}

5.tableView 스크롤,리 셋 처리
//      ,      
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (!decelerate) {
        [self reload];
    }
}

//      
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self reload];
}
//     
- (void)reload {
    NSArray *arr = [self.tableView indexPathsForVisibleRows];
 //         indexpath
    NSMutableArray *arrToReload = [NSMutableArray array];
    for (NSIndexPath *indexPath in arr) {
        //   cell         
        if (![self.downImageArray containsObject:indexPath]) {
            [arrToReload addObject:indexPath];
        }
    }
    [self.tableView reloadRowsAtIndexPaths:arrToReload withRowAnimation:UITableViewRowAnimationNone];
}
// cell                 
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *tableViewCell = (TableViewCell *)cell;
    [tableViewCell.iconView sd_cancelCurrentImageLoad];
}

애플 문서 에 도 이런 자료 가 있 습 니 다.https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html#
또한 일부 앱 은 더 원활 하 게 사용 하기 위해 tableView 가 빠르게 스크롤 하거나 스크롤 할 때 데 이 터 를 불 러 오지 않 습 니 다.vvebo 는 이렇게 처 리 됩 니 다.vvebo 주소:https://github.com/johnil/VVeboTableViewDemo

좋은 웹페이지 즐겨찾기