在項目中我們經常要實現圖片預覽這個功能,簡單的做法就是往scrollview中添加子控件以實現目的,但是一旦要預覽的圖片很多的時候,這樣的做法會創(chuàng)建很多多余的控件,性能上會大打折扣,下面為大家提供一個思路,來解決這種不開心的事情.
思路如下
** 前提我們只需要創(chuàng)建兩個圖片視圖,因為顯示的圖片時候我們只會同時顯示一張圖片,在圖片滑動的時候我們才會同時兩張圖片,照著這樣的思路走下去,首先我們得創(chuàng)建兩個數組,第一個數組用于存放已創(chuàng)建為使用的圖形控件對象,第二個用于存放活動中(顯示在屏幕中)的圖形對象.當滑動控件進行滑動的時候,首先檢查緩存數組中是否對象存在,有則取(取完之后需要移除)無則創(chuàng)建,并且都需要存放在活動中的數組中,當劃過一頁邊界的時候應當從活動數組中移除消失在視野中圖形控件并存放在緩存數組中,以此類推便可.**
下面是代碼實現
let screenBounds = UIScreen.mainScreen().bounds
typealias CallBack = (a:Int,b:Int)->Int
//可循環(huán)利用的ScrollView
class LooperPhoto: UIScrollView,UIScrollViewDelegate{
// 緩存的圖片控件
var cacheImages = NSMutableArray()
// 活動的圖片控件
var actionImages = NSMutableArray()
// var photos:[JSON]?
private var dataSources:[AnyObject]?
var imageType = ImageType.Web
var pageCount = 0{
didSet{
if pageCount>oldValue{
self.contentSize = CGSizeMake(CGFloat(pageCount)*CGRectGetWidth(self.bounds), 0)
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
initSetting()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
initSetting()
}
private func initSetting(){
self.showsHorizontalScrollIndicator = false
self.showsVerticalScrollIndicator = false
self.pagingEnabled = true
self.delegate = self
}
func setCurrentPage(page:Int){
self.setContentOffset(CGPointMake(CGFloat(page)*screenBounds.width, 0), animated: false)
}
func setImageDataSource(dataSouce:[AnyObject],imageType:ImageType){
self.pageCount = dataSouce.count
self.imageType = imageType
self.dataSources = dataSouce
showImageAtIndex(0)
}
func showImageAtIndex(index:Int){
var imageView:UIImageView?
if (cacheImages.count == 0){
imageView = getImageView(index)
}else{
imageView = cacheImages.firstObject as? UIImageView
imageView?.frame.origin.x = CGFloat(index)*self.bounds.width
cacheImages.removeObjectAtIndex(0)
}
setImageToImageView(index,imageView: imageView!)
imageView!.tag = index
actionImages.addObject(imageView!)
self.addSubview(imageView!)
}
private func setImageToImageView(index:Int,imageView:UIImageView){
let data:AnyObject = dataSources![index]
var image:UIImage?
switch imageType{
case .Local:
let alAsset = data as! ALAsset
image = UIImage(CGImage: alAsset.defaultRepresentation().fullScreenImage().takeUnretainedValue())
case .Web:
let imageUrl = data as! String
imageView.sd_setImageWithURL(NSURL(string: imageUrl))
case .Resource:
let resourceName = data as! String
image = UIImage(named: resourceName)
}
if (nil != image){
imageView.image = image!
}
}
func getImageView(index:Int)->UIImageView{
let width = CGRectGetWidth(self.bounds)
let imageView = UIImageView()
var frame = self.bounds
frame.origin.x = CGFloat(index)*width
imageView.frame = frame
imageView.contentMode = UIViewContentMode.ScaleAspectFit
return imageView
}
//總共就2個image控件
func scrollViewDidScroll(scrollView: UIScrollView) {
let scrollViewBounds = scrollView.bounds
let minX = CGRectGetMinX(scrollViewBounds)
let maxX = CGRectGetMaxX(scrollViewBounds)
var firstIndex = Int(minX/scrollViewBounds.width)
var lastIndex = Int(maxX/scrollViewBounds.width)
if firstIndex<0{
firstIndex = 0
}
if lastIndex >= pageCount{
lastIndex = pageCount-1
}
var tempImagesArrary = [UIImageView]()
for imageView in actionImages{
let index = imageView.tag
if index<firstIndex || index>lastIndex{
imageView.removeFromSuperview()
tempImagesArrary.append(imageView as! UIImageView)
cacheImages.addObject(imageView)
}
}
for imageView in tempImagesArrary{
actionImages.removeObject(imageView)
}
//TOO-DO 這里要將不顯示的imageView從ActionImages移除
for (var i = firstIndex;i<=lastIndex;i++){
var isShowNewImage = true
for imageview in actionImages{
let tagIndex = imageview.tag
if tagIndex == i{
isShowNewImage = false
}
}
if isShowNewImage{
showImageAtIndex(i)
}
}
}
enum ImageType{
case Local,Web,Resource
}
}