自动轮播 + 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()
}
}