SWIFTはbanner無限マルチキャストを実現

4342 ワード

実現構想.
コード実装
class AppBannerView: UIScrollView,UIScrollViewDelegate{

    
    var pageChangeDelegate:PageChangeDelegate?
    //     page
    var currentPage = 0
    var photos:[String]?
    var autoScroll = true
    var nsTimer:NSTimer?
    
    
    init(frame:CGRect,photos:[String]!){
         self.photos = photos
         super.init(frame: frame)
         initView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func awakeFromNib() {
        initView()
    }
    
    func initView(){
        
        self.delegate = self
        self.pagingEnabled = true
        self.showsHorizontalScrollIndicator = false
        self.showsVerticalScrollIndicator = true
        for (var i = 0;i<3;i++){
           let view = UIImageView(frame: CGRectMake(self.bounds.width*CGFloat(i), 0, self.bounds.width, self.bounds.height))
            view.contentMode = UIViewContentMode.ScaleToFill
            
            var imageUrl:NSURL?
            if i == 0{
                imageUrl = NSURL(string: photos![photos!.count-1])
            }else if i == 2{
                imageUrl = NSURL(string: photos![1])
            }else{
                imageUrl = NSURL(string: photos![0])
            }
            
            view.sd_setImageWithURL(imageUrl)
            self.addSubview(view)
            
        }
        
         self.contentSize = CGSizeMake(self.bounds.width*CGFloat(photos!.count), 0)
         self.setContentOffset(CGPoint(x: self.bounds.width, y: 0), animated: false)
        
        if autoScroll{
           
        nsTimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("startScroll"), userInfo: nil, repeats: true)
        }
    }
    
    
    func showPageIndex(index:Int){
        
        if index > currentPage{
         
            self.setContentOffset(CGPointMake(self.bounds.width*2, 0), animated: true)
        }else{
            self.setContentOffset(CGPointMake(0, 0), animated: true)
        }
    }
    
    func setDataSource(photos:[String]!){
        
        self.photos = photos
    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        if abs((scrollView.contentOffset.x - self.bounds.width)) >= self.bounds.width{
            
            if scrollView.contentOffset.x == 0{
                currentPage  = currentPage - 1
                if currentPage == -1 {
                    
                    currentPage = photos!.count-1
                }
            }else{
                
                currentPage =  currentPage + 1
                
                if currentPage == photos!.count{
                    
                    currentPage = 0
                }
                
            }
            pageChangeDelegate?.pageChange(currentPage)
            
            self.setContentOffset(CGPoint(x: self.bounds.width, y: 0), animated: false)
            let imageView =  self.subviews[1] as! UIImageView
            imageView.sd_setImageWithURL(NSURL(string: photos![currentPage])!)
            let leftImageView = self.subviews[0] as! UIImageView
            if currentPage-1 == -1{
                
                leftImageView.sd_setImageWithURL(NSURL(string: photos![photos!.count-1]))
            }else{
                leftImageView.sd_setImageWithURL(NSURL(string: photos![currentPage-1]))
            }
            let rightImageView = self.subviews[2] as! UIImageView
            if currentPage+1 == photos!.count {
                rightImageView.sd_setImageWithURL(NSURL(string: photos![0]))
            }else{
                rightImageView.sd_setImageWithURL(NSURL(string: photos![currentPage+1]))
            }
        }
        
        
    }
    
    
    func startScroll(){

        self.showPageIndex(currentPage+1)
    }
    
    func stopScroll(){
        
       nsTimer?.invalidate()
    }
    
    
    
    //             
    
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        
    
    }
    
    
    func setBannerViewAutoScroll(autoScroll:Bool){
    
        self.autoScroll = autoScroll
        
        if !autoScroll{
            
            stopScroll()
        }
        
    }
    
   
    
}

protocol PageChangeDelegate{
    
    func pageChange(index:Int)
}