使用UISCROLLVIEW實現圖片預覽

在項目中我們經常要實現圖片預覽這個功能,簡單的做法就是往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
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末揩徊,一起剝皮案震驚了整個濱河市腰鬼,隨后出現的幾起案子嵌赠,更是在濱河造成了極大的恐慌熄赡,老刑警劉巖姜挺,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異本谜,居然都是意外死亡初家,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門溜在,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掖肋,你說我怎么就攤上這事赏参“崖ǎ” “怎么了韧掩?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵紊浩,是天一觀的道長。 經常有香客問我滑臊,道長口芍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任雇卷,我火速辦了婚禮鬓椭,結果婚禮上,老公的妹妹穿的比我還像新娘关划。我一直安慰自己膘融,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布祭玉。 她就那樣靜靜地躺著,像睡著了一般春畔。 火紅的嫁衣襯著肌膚如雪脱货。 梳的紋絲不亂的頭發(fā)上岛都,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音振峻,去河邊找鬼臼疫。 笑死,一個胖子當著我的面吹牛扣孟,可吹牛的內容都是我干的烫堤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凤价,長吁一口氣:“原來是場噩夢啊……” “哼鸽斟!你這毒婦竟也來了?” 一聲冷哼從身側響起利诺,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤富蓄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慢逾,有當地人在樹林里發(fā)現了一具尸體立倍,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年侣滩,在試婚紗的時候發(fā)現自己被綠了口注。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡君珠,死狀恐怖寝志,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情葛躏,我是刑警寧澤澈段,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站舰攒,受9級特大地震影響败富,放射性物質發(fā)生泄漏。R本人自食惡果不足惜摩窃,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一兽叮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猾愿,春花似錦鹦聪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姻僧,卻和暖如春规丽,著一層夾襖步出監(jiān)牢的瞬間蒲牧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工赌莺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冰抢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓艘狭,卻偏偏與公主長得像挎扰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巢音,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容