swift轮播图代码
import UIKit
private let CycleCellID = "CycleCellID"
class BannerCycleView: UIView {
var layout : UICollectionViewFlowLayout!
var collectionView :UICollectionView!
var pageContol : UIPageControl?
var cycleTimer : Timer?
let timeInterval : TimeInterval = 2
var cycleModels : [CycleModel]? {
didSet {
collectionView.reloadData()
pageContol?.numberOfPages = cycleModels?.count ?? 0
let indexPath = IndexPath(item: (cycleModels?.count ?? 0) * 100, section: 0)
collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
removeCycleTimer()
addCycleTimer()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension BannerCycleView {
func setupUI() {
self.layout = UICollectionViewFlowLayout()
self.layout.itemSize = CGSize(width: kScreenW, height: 200)
self.layout.minimumLineSpacing = 0
self.layout.minimumInteritemSpacing = 0
self.layout.scrollDirection = .horizontal
self.collectionView = UICollectionView.init(frame: self.bounds, collectionViewLayout: self.layout)
self.collectionView.isPagingEnabled = true
self.collectionView.showsHorizontalScrollIndicator = false
self.collectionView.delegate = self
self.collectionView.dataSource = self
self.collectionView .register(CollectionCycleCell.self, forCellWithReuseIdentifier: CycleCellID)
self.collectionView.backgroundColor = UIColor.white
self.addSubview(self.collectionView)
self.pageContol = UIPageControl(frame: CGRect(x: self.collectionView.center.x - 50 , y: 130, width: 100, height: 20))
self.addSubview(self.pageContol!)
}
}
extension BannerCycleView : UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return (cycleModels?.count ?? 0) * 10000
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CycleCellID, for: indexPath) as! CollectionCycleCell
print(cycleModels![indexPath.item % cycleModels!.count])
cell.cycleModel = cycleModels![indexPath.item % cycleModels!.count]
return cell
}
}
extension BannerCycleView : UICollectionViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// 计算偏移量
let offsetX = scrollView.contentOffset.x + scrollView.bounds.width * 0.5
// 计算页码当前页
pageContol?.currentPage = Int(offsetX / scrollView.bounds.width) % (cycleModels?.count ?? 1)
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
removeCycleTimer()
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
addCycleTimer()
}
}
extension BannerCycleView {
fileprivate func addCycleTimer(){
cycleTimer = Timer(timeInterval: 2.0, target: self, selector: #selector(self.scrollToNext), userInfo: nil, repeats: true)
RunLoop.main.add(cycleTimer!, forMode: .commonModes)
}
fileprivate func removeCycleTimer(){
cycleTimer?.invalidate()
cycleTimer = nil
}
@objc fileprivate func scrollToNext() {
collectionView.setContentOffset(CGPoint(x:collectionView.contentOffset.x + collectionView.bounds.width , y:0), animated: true)
}
}
// ------ CollectionCycleCell
import UIKit
class CollectionCycleCell: UICollectionViewCell {
var iconImageView: UIImageView!
var titleStringLabel : UILabel!
func setupUI() {
self.backgroundColor = UIColor.white
self.iconImageView = UIImageView()
self.iconImageView.frame = CGRect(x: 0, y: 0, width: kScreenW, height: 200)
self.titleStringLabel = UILabel()
self.titleStringLabel.text = ""
self.titleStringLabel.font = UIFont.systemFont(ofSize: 13)
self.titleStringLabel.frame = CGRect(x: 0, y: 163, width: iconImageView.frame.width, height: 20)
self.titleStringLabel.backgroundColor = UIColor.lightGray.withAlphaComponent(0.8)
self.addSubview(iconImageView)
self.iconImageView.addSubview(self.titleStringLabel)
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: 定义模型属性
var cycleModel : CycleModel? {
didSet {
titleStringLabel.text = cycleModel?.title
let iconURL = URL(string: cycleModel?.bigimg ?? "")!
iconImageView.kf.setImage(with: iconURL, placeholder: UIImage(named: "homepage_refresh_tv"))
}
}
}
//---- model
import UIKit
class CycleModel: NSObject {
var title : String = ""
var smallimg : String = ""
var bigimg : String = ""
init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
把埋怨的话放一放,把负能量收一收。太阳喜欢向日葵,人们也会喜欢上爱笑的你。习惯好的自己,一切都会好的。