目錄
- 特色一覽
- 使用示例_01
- 使用示例_02
- 如何自定義
- 核心代碼
- 結(jié)語
特色一覽
- 使用UICollectionView的復(fù)用機(jī)制
- 使用復(fù)用機(jī)制可有效提高性能身弊,無論播放多少張圖片辟汰,實(shí)際創(chuàng)建的控件永遠(yuǎn)只有兩個(gè)UICollectionViewCell列敲,有效減少內(nèi)存損耗
- 支持廣告輪播圖的自定義
- 本作品提供若干接口可以實(shí)現(xiàn)簡單的自定義
- 網(wǎng)絡(luò)圖片異步下載和緩存機(jī)制
- 網(wǎng)絡(luò)圖片采用子線程異步下載,不會(huì)造成卡頓莉擒,第一次下載時(shí)會(huì)自動(dòng)保存到沙盒酿炸,下次啟動(dòng)直接從沙盒獲取圖片
- 加載網(wǎng)絡(luò)圖片時(shí)可設(shè)置占位圖片
- 支持設(shè)置占位圖片,在網(wǎng)絡(luò)情況比較差的情況下可以先顯示其他相應(yīng)圖片
- 一行代碼實(shí)現(xiàn)點(diǎn)擊圖片的響應(yīng)事件
- 使用Block回調(diào)實(shí)現(xiàn)圖片的點(diǎn)擊響應(yīng)事件涨冀, 并返回被點(diǎn)擊圖片的相關(guān)信息
- 波浪刷新效果
- 使用波浪效果進(jìn)行刷新操作填硕,生動(dòng)有趣
使用示例_01
使用方法
- 下載并復(fù)制KHAdView文件夾下的源代碼到你的工程目錄;
- 初始化KHAdView鹿鳖;
- 一句代碼實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片, 設(shè)置占位圖片和響應(yīng)點(diǎn)擊事件扁眯;
說明 : ClickHandler這個(gè)block中返回的參數(shù)分別為圖片的索引, 圖片的來源(URL或圖片名), 以及圖片本身。
[self.khAdView setUpOnlineImagesWithSource:self.urlArr
PlaceHolder:[UIImage imageNamed:@"001"]
ClickHandler:^(NSInteger index, NSString *imgSrc, UIImage *img) {
//在這個(gè)block中設(shè)置點(diǎn)擊圖片后要進(jìn)行的操作
[weakSelf pushToImgViewControllerWithIndex:index Image:img ImageSource:imgSrc];
}];
- 或者一句代碼實(shí)現(xiàn)加載本地圖片和設(shè)置響應(yīng)點(diǎn)擊事件翅帜;
[self.khAdView setUpLocalImagesWithSource:self.localArr
ClickHandler:^(NSInteger index, NSString *imgSrc, UIImage *img) {
//在這個(gè)block中設(shè)置點(diǎn)擊圖片后要進(jìn)行的操作
[weakSelf pushToImgViewControllerWithIndex:index Image:img ImageSource:imgSrc];
}];
-
開啟或關(guān)閉圖片輪播的定時(shí)器姻檀。
[self.khAdView startTimer]; [self.khAdView stopTimer];
使用示例_02
使用方法
- 隱藏底部的PageControl, 再使用一行代碼初始化波浪View涝滴;
self.khAdView.hideBottomView = YES;
self.khAdView.hidePageControl = YES;
[self.khAdView enableWavingWithDuration:0.f
WaveSpeed:12.f
WaveHeight:12.f
WaveColor:[UIColor whiteColor]];
- 在scrollViewDidEndDecelerating代理方法中啟動(dòng)波動(dòng)效果绣版。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
[self.khAdView startWaving];
}
如何自定義:
- 改變控件的顏色
- 改變底部背景欄的顏色,默認(rèn)是黑色
self.khAdView.bottomViewColor = [UIColor redColor];
- 改變**PageControl**的指示顏色歼疮,默認(rèn)是白色
self.khAdView.pageIndicatorTintColor = [UIColor yellowColor];
- 改變當(dāng)前頁PageControl的指示顏色杂抽,默認(rèn)是紅色
self.khAdView.currentPageIndicatorTintColor = [UIColor blackColor];
- 改變底部背景欄的高度,默認(rèn)是30
self.khAdView.bottomViewHeight = 50;
- 改變底部背景欄的透明度韩脏,默認(rèn)是0.3
self.khAdView.alpha = 0.5;
- 改變定時(shí)器的時(shí)間間隔缩麸,默認(rèn)是2
self.khAdView.timeInterval = 1.f;
- 改變廣告視圖的滾動(dòng)方向,默認(rèn)是從右向左滾動(dòng)
self.khAdView.direction = KHScrollDirectionFromLeft;
核心代碼
本作品的核心代碼有三大部分:
- 通過UICollectionView實(shí)現(xiàn)循環(huán)輪播效果赡矢;
- 網(wǎng)絡(luò)圖片的異步下載和緩存機(jī)制杭朱;
- 波浪效果的實(shí)現(xiàn)。
由于篇幅有限吹散,在此只詳述第2部分的核心代碼弧械。有興趣詳細(xì)了解所有代碼的朋友可以到本人的GitHub地址下載。
- (void)downloadImages:(NSArray *)urlArr{
//遍歷所有的圖片url
for (NSInteger i = 0; i < urlArr.count; i++) {
NSString *imageUrl = urlArr[i];
//嘗試獲取內(nèi)存緩存中的圖片
UIImage *image = [self.imageDictM objectForKey:imageUrl];
//如果沒有內(nèi)存緩存空民,到沙盒中尋找緩存
if (!image) {
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [cachePath stringByAppendingString:[imageUrl lastPathComponent]];
BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
//如果沒有沙盒緩存刃唐,查看當(dāng)前子線程是否正在下載該圖片
if (!exist) {
[self.imageDictM setObject:self.placeHolderImg forKey:imageUrl];
NSOperation *downloadOP = [self.operationDictM objectForKey:imageUrl];
//如果沒有子線程緩存,開創(chuàng)子線程下載圖片
if (!downloadOP) {
NSBlockOperation *download = [NSBlockOperation blockOperationWithBlock:^{
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
UIImage *image = [UIImage imageWithData:imageData];
NSLog(@"下載圖片----%ld", i);
//容錯(cuò)處理
if (!image) {
[self.operationDictM removeObjectForKey:imageUrl];
return;
}
//保存下載好的圖片到內(nèi)存緩存和沙盒緩存中
[self.imageDictM setObject:image forKey:imageUrl];
[imageData writeToFile:filePath atomically:YES];
[self.operationDictM removeObjectForKey:imageUrl];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//如果子線程緩存數(shù)==0, 則所有圖片已經(jīng)下載完畢, 刷新視圖
NSInteger operationCount = self.operationDictM.count;
if (operationCount == 0) {
self.images = [self getDisplayImgs:self.imageDictM DataSource:urlArr];
[self.collectionView reloadData];
}
}];
}];
//保存子線程緩存
[self.operationDictM setObject:download forKey:imageUrl];
[self.queue addOperation:download];
}
}else{
//沙盒中有緩存時(shí)直接從沙盒中加載圖片
image = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];
[self.imageDictM setObject:image forKey:imageUrl];
NSLog(@"從沙盒中獲取圖片");
}
}else{
//內(nèi)存中有緩存時(shí)直接從內(nèi)存中加載圖片
[self.imageDictM setObject:image forKey:imageUrl];
NSLog(@"從內(nèi)存中獲取圖片");
}
}
}
結(jié)語
具體的代碼和Demo可參考GitHub地址袭景, 本作品后續(xù)會(huì)持續(xù)更新唁桩,并添加更多有趣的效果闭树,喜歡的朋友可以留下你的評論或提出你的改進(jìn)建議耸棒。