Swift 3--本格的なタイミング無限マルチキャスト

7800 ワード

コピーは直接使用できます
//          
protocol DBScrollBannerViewDelegate{
//     
func handleTapAction(index:Int)->Void
}

//         
class DBScrollBannerView: UIView,UIScrollViewDelegate{
//    
var delegate : DBScrollBannerViewDelegate!

//    
let kScreenWidth = UIScreen.main.bounds.size.width

//         
var currentIndex : Int = 0

//   
var dataSource : [String]?

//          image(           imageView    )
var leftImageView , middleImageView , rightImageView : UIImageView?

//  imageView     
var scrollerView : UIScrollView?

//scrollView    
var scrollerViewWidth : CGFloat?
var scrollerViewHeight : CGFloat?

//    (   )
var pageControl : UIPageControl?

//       
var autoScrollTimer:Timer?

func relodataData(ImagesArr:[String]){
    //    
    self.dataSource =  ImagesArr
    //  imageView
    self.configureImageView()
    //      
    self.configurePageController()
    if ImagesArr.count > 1 {
        //         
        self.configureAutoScrollTimer()
    }else{
        self.scrollerView?.isScrollEnabled = false
    }

}

init(frame: CGRect, ImagesArr:[String]) {
    super.init(frame: frame)
    
    //     scrollerView  
    self.scrollerViewWidth = frame.width
    self.scrollerViewHeight = frame.height
    
    //    
    self.dataSource =  ImagesArr
    //  scrollerView
    self.configureScrollerView()
    //  imageView
    self.configureImageView()
    //      
    self.configurePageController()
    if ImagesArr.count > 1 {
        //         
        self.configureAutoScrollTimer()
    }else{
        self.scrollerView?.isScrollEnabled = false
    }
    self.backgroundColor = UIColor.gray
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

//  scrollerView
func configureScrollerView(){
    self.scrollerView = UIScrollView(frame: CGRect(x: 0,y: 0,
                                                   width: self.scrollerViewWidth!, height: self.scrollerViewHeight!))
    self.scrollerView?.delegate = self
    self.scrollerView?.contentSize = CGSize(width: self.scrollerViewWidth! * 3,
                                            height: self.scrollerViewHeight!)
    //              view   
    self.scrollerView?.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
    self.scrollerView?.isPagingEnabled = true
    self.scrollerView?.bounces = false
    self.addSubview(self.scrollerView!)
    
}
//  imageView
func configureImageView(){
    self.leftImageView = UIImageView(frame: CGRect(x: 0, y: 0,
                                                   width: self.scrollerViewWidth!, height: self.scrollerViewHeight!))
    self.middleImageView = UIImageView(frame: CGRect(x: self.scrollerViewWidth!, y: 0,
                                                     width: self.scrollerViewWidth!, height: self.scrollerViewHeight! ));
    self.rightImageView = UIImageView(frame: CGRect(x: 2*self.scrollerViewWidth!, y: 0,
                                                    width: self.scrollerViewWidth!, height: self.scrollerViewHeight!));
    self.scrollerView?.showsHorizontalScrollIndicator = false
    
    //          imageView   (           ,   ,     )
    if(self.dataSource?.count != 0){
        self.touchViewAction()
        resetImageViewSource()
    }else{
        //       ,   
        self.middleImageView?.image = UIImage(named: "img_05")
    }
    
    self.scrollerView?.addSubview(self.leftImageView!)
    self.scrollerView?.addSubview(self.middleImageView!)
    self.scrollerView?.addSubview(self.rightImageView!)
}

//      
func configurePageController() {
    self.pageControl = UIPageControl(frame: CGRect(x: kScreenWidth/2-60,
                                                   y: self.scrollerViewHeight! - 20, width: 120, height: 20))
    self.pageControl?.numberOfPages = (self.dataSource?.count)!
    self.pageControl?.isUserInteractionEnabled = false
    self.addSubview(self.pageControl!)
}

//         
func configureAutoScrollTimer() {
    
    //       ,        
    autoScrollTimer = Timer.scheduledTimer(timeInterval: 3, target: self,
                                           selector: #selector(letItScroll),
                                           userInfo: nil, repeats: true)
}

//       ,      
func letItScroll(){
    let offset = CGPoint(x: 2*scrollerViewWidth!, y: 0)
    self.scrollerView?.setContentOffset(offset, animated: true)
}

//           imageView   
func resetImageViewSource() {
    //           
    if self.currentIndex == 0 {
        self.leftImageView?.image = UIImage(named: self.dataSource!.last!)
        self.middleImageView?.image = UIImage(named: self.dataSource!.first!)
        let rightImageIndex = (self.dataSource?.count)!>1 ? 1 : 0 //  
        self.rightImageView?.image = UIImage(named: self.dataSource![rightImageIndex])
    }
        //            
    else if self.currentIndex == (self.dataSource?.count)! - 1 {
        self.leftImageView?.image = UIImage(named: self.dataSource![self.currentIndex-1])
        self.middleImageView?.image = UIImage(named: self.dataSource!.last!)
        self.rightImageView?.image = UIImage(named: self.dataSource!.first!)
    }
        //    
    else{
        self.leftImageView?.image = UIImage(named: self.dataSource![self.currentIndex-1])
        self.middleImageView?.image = UIImage(named: self.dataSource![self.currentIndex])
        self.rightImageView?.image = UIImage(named: self.dataSource![self.currentIndex+1])
    }
}

func touchViewAction(){
    //         
    let tap = UITapGestureRecognizer(target: self,
                                     action: #selector(handleTapAction(_:)))
    self.addGestureRecognizer(tap)
}
//      
func handleTapAction(_ tap:UITapGestureRecognizer)->Void{
       self.delegate.handleTapAction(index: self.currentIndex)
}


//scrollView       
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    //       
    let offset = scrollView.contentOffset.x
    
    if(self.dataSource?.count != 0){
        
        //      (     )
        if(offset >= self.scrollerViewWidth!*2){
            //     
            scrollView.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
            //    +1
            self.currentIndex = self.currentIndex + 1
            
            if self.currentIndex == self.dataSource?.count {
                self.currentIndex = 0
            }
        }
        
        //      (     )
        if(offset <= 0){
            //     
            scrollView.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
            //    -1
            self.currentIndex = self.currentIndex - 1
            
            if self.currentIndex == -1 {
                self.currentIndex = (self.dataSource?.count)! - 1
            }
        }
        
        //      imageView   
        resetImageViewSource()
        //          
        self.pageControl?.currentPage = self.currentIndex
    }
}

//        
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    //          (                     )
    autoScrollTimer?.invalidate()
}

//        
func scrollViewDidEndDragging(_ scrollView: UIScrollView,
                              willDecelerate decelerate: Bool) {
    //           
    configureAutoScrollTimer()
    
}

}

署名エージェントによるエージェントメソッドの実装
  bannerView = DBScrollBannerView.init(frame: .init(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 300), ImagesArr: ["img_01","img_02","img_03","img_04","img_05"])
    bannerView.delegate = self
    self.view.addSubview(bannerView)
    //       
    bannerView.relodataData(ImagesArr: ["",""])

func handleTapAction(index: Int) {
    
    print("==========\(index)")
}

demoアドレス