swift首頁輪播 輕量級 超級緩存
用swift寫的首頁輪播控件
如果你覺得對你有幫助,請給個Star,寫了幾天也不容易, 您的支持是我前進的動力! github代碼地址
網上找了一些首頁輪播,寫的或多或少有一些問題,用著不舒服,自己用swift寫了一個輪播控件,有如下特點:
- 使用自己寫的網絡請求SSNetWorking,無需第三方庫
- 由于輪播圖一般較少,采用的plist存儲用SSImageFileManager去管理存儲
- 網絡請求下載圖片會在需要時請求下載,已下載完的圖片會緩存起來,再次啟動也不會再次請求,不會無故浪費用戶流量
- 輪播圖上需要點擊鏈接,只需要調用一個block便可加上點擊
使用方法
把SSCycleScroll文件夾拖入到工程中:
![]()
QQ20151124-0.pngdefaultBackground.jpg換成自己的背景,當沒有網絡時,會用本地的這一張圖輪播,imageDownload.plist請也要帶著,初始化時會用到,如果不用網絡圖片,只用SSCycleScrollView.swift這一個文件就可以了;
初始化一個SSCycleScrollView:
self.mainScrollView = SSCycleScrollView.init(frame: currentRect, animationDuration: 3, inputImageArray: self.scrollImageArray) self.view.addSubview(self.mainScrollView!)- 只需要要傳入一個image array就可以了,有網絡下載的,等下載完,更新SSCycleScrollView中的allImageArray就可以了;
- 可以這樣請求:
SSDownloadManager.sharedInstance.request(kMainScrollURL) { (finished, error) -> Void in if finished { /********** 所有圖片都下載完成后,reloadCycleScroll中的array **********/ self.reloadScrollImageArray() print("download image finished") } } self.addMainScrollView()下載完圖片后,reloadScrollImageArray:func reloadScrollImageArray() { let imageModel = SSImageDownloadModel.sharedInstance let imageCount = imageModel.imageList.count self.scrollImageArray.removeAll() if imageCount > 0 { for item in imageModel.imageList { if let imageUrl = item.imageCachePath { if imageUrl.characters.count > 0 { if let image = UIImage(contentsOfFile: imageUrl) { self.scrollImageArray.append(image) } } } } } if self.scrollImageArray.count > 0 { self.mainScrollView?.allImageArray = self.scrollImageArray } }注意點
使用前根據自己服務器中json格式,配置好本地的imageDown.plist, 和SSImageDownModel的SSImageDownloadItem,不要忘記info.plist中的App Transport Security Settings,以允許http連接。
原理詳解
如果愿意看,下面還能寫一點東西。就算你覺得這種下載方式或者是輪播控件不好用,對于對plist存儲不熟悉的人來說,這一篇也能學到plist的存儲,后期還會用更好的方式去存儲。
- 請求json時,會把服務器上最新的json文件拿下來,寫到本地plist中去;
- 對plist存儲讀寫時,是用md5值做這條數據的唯一標識;
- 對于每條數據,緩存的路徑為/tmp/imageCache/md5.jpg, 如果在緩存中沒有發現這個圖片,才會去網絡請求圖片;
- SSNetworking中,請求方法用的URLSession, 請求 json 時用的ephemeralSessionConfiguration 配置請求,每次請求,沒用緩存,如果用default,服務器中 son 修改后,可能請求不回來最新的。
SSCycScrollView
初始化后會啟動一個定時器,repeat調用一個timerFired方法,方法中每次對scrollview加一個自己寬度的offset:
func timerFired() { let xOffset = Int(self.contentOffset.x/kScreenWidth) let xOffsetFloat = CGFloat(xOffset) * kScreenWidth let newOffset = CGPointMake(xOffsetFloat + CGRectGetWidth(self.frame), self.contentOffset.y) self.setContentOffset(newOffset, animated: true) }沒有直接加xOffset, 而是對其做了一個換算,確保每次加的offset是自己寬度的整數倍。
在scrollViewDidScroll方法,每次計算前一個,當前,后一個index,確保index范圍為index >= 0 && index < allImageArray.count, 每次滾動后都會三個imageView中的image做重新賦值:self.previousDisplayView?.image = self.allImageArray[previousArrayIndex] self.currentDisplayView?.image = self.allImageArray[self.currentArrayIndex] self.lastDisplayView?.image = self.allImageArray[lastArrayIndex] self.contentOffset = CGPointMake(CGRectGetWidth(self.frame), 0)上面最后一行設置contenOffset非常重要,每次把scrollView的位置重置為1個自身寬度的offset。
小結
如果你覺得有不好的地方,可以提出來,大家一塊研究一下,歡迎常來我的倉庫,別忘記給個star!
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!