Swift学习笔记(十四):自动轮播 + Timer的使用

261 阅读1分钟

自动轮播 + Timer的使用

// 为了便于代码管理,用一个扩展,专门处理定时器相关内容

extension MyBannerView {


    //开启定时器
    func startTimer() {

        endTimer()

        timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { [weak self] _ in

            self?.next()

        })

    }

    
    // 结束定时器
    func endTimer() {

        timer?.invalidate()

        timer = nil

    }


    //轮播到下一页
    func next() {

        let idx = Int((myCollectionView?.contentOffset.x)! / (myCollectionView?.frame.size.width)!)

        myCollectionView?.scrollToItem(at: IndexPath(row: idx + 1, section: 0),

                     at: UICollectionView.ScrollPosition(rawValue: 0),

                     animated: true)

    }


    // 用户手指触摸停止定时器
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        endTimer()

    }

    
    // 松开后重启定时器
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

        startTimer()

    }

    
    // 当执行 setContentOffset 或者 scrollRectVisible 完成时,且 animated = true 时,该方法会被执行
    // 注:如果 animated = false 该方法是不会被调用的
    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

        redirectPosition()

    }

}