YYKit-Example项目阅读——Web Image

514 阅读1分钟

YYKit源码学习笔记第三篇

正文

这是Example工程中Image的第三个展示项

效果

效果

网络图片加载

[_webImageView setImageWithURL:url
                       placeholder:nil
                           options:YYWebImageOptionProgressiveBlur | YYWebImageOptionShowNetworkActivity | YYWebImageOptionSetImageWithFadeAnimation
                          progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                              if (expectedSize > 0 && receivedSize > 0) {
                                  CGFloat progress = (CGFloat)receivedSize / expectedSize;
                                  progress = progress < 0 ? 0 : progress > 1 ? 1 : progress;
                                  if (_self.progressLayer.hidden) _self.progressLayer.hidden = NO;
                                  _self.progressLayer.strokeEnd = progress;
                              }
                       } transform:nil
                        completion:^(UIImage *image, NSURL *url, YYWebImageFromType from, YYWebImageStage stage, NSError *error) {
                           if (stage == YYWebImageStageFinished) {
                               _self.progressLayer.hidden = YES;
                               [_self.indicator stopAnimating];
                               _self.indicator.hidden = YES;
                               if (!image) _self.label.hidden = NO;
                           }
                       }];
                       

Reload

- (void)reload {
    [[YYImageCache sharedCache].memoryCache removeAllObjects];
    [[YYImageCache sharedCache].diskCache removeAllObjectsWithBlock:^{}];
    [self.tableView performSelector:@selector(reloadData) afterDelay:0.1];
}

滚动bouncing效果

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat viewHeight = scrollView.height + scrollView.contentInset.top;
    for (YYWebImageExampleCell *cell in [self.tableView visibleCells]) {
        CGFloat y = cell.centerY - scrollView.contentOffset.y; // cell.centerY = viewHeight / 2 + scrollView.contentOffset.y时, y = viewHeight / 2
        CGFloat p = y - viewHeight / 2; //  y = viewHeight / 2时, p = 0
        CGFloat scale = cos(p / viewHeight * 0.8) * 0.95; //  p / viewHeight = 0时(p = 0),scale = 1 * 0.95
        NSLog(@"\ncell.centerY:%f\n,scrollView.contentOffset.y:%f\n,p:%f\ncos:%f\n", cell.centerY, scrollView.contentOffset.y, p, cos(p / viewHeight));
        if (kiOS8Later) {
            [UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState animations:^{
                cell.webImageView.transform = CGAffineTransformMakeScale(scale, scale);
            } completion:NULL];
        } else {
            cell.webImageView.transform = CGAffineTransformMakeScale(scale, scale);
        }
    }
}

结语

这篇先不讨论网络图片加载的实现,反正YYKit的封装是面面俱到,一环套一环。在这个页面中,我更偏向于弄清楚图片滚动的bouncing效果是怎么实现的。首先,[self.tableView visibleCells]这个方法在我这就几乎没用过,涨知识了。其次,分析他一系列的y、p、scale为什么要那样赋值,是一件有意思的事情。