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
为什么要那样赋值,是一件有意思的事情。