Netease-Music-Demo/wyy/DiscoverView/DiscoverNewsView.swift
2021-03-06 18:45:01 +08:00

145 lines
4.9 KiB
Swift

//
// DiscoverNewsView.swift
// wyy
//
// Created by on 2021/3/5.
//
import UIKit
class DiscoverNewsView: UIView, UIScrollViewDelegate {
let scrollView = UIScrollView()
let pageControl = UIPageControl()
var timer: Timer?
var pageImage = [UIImage]()
var scrollImageViews = [UIImageView]()
var currentIndex: Int = 0
init(){
super.init(frame: CGRect.zero)
pageImage = [UIImage(named: "p1")!,
UIImage(named: "p2")!,
UIImage(named: "p3")!,
UIImage(named: "p4")!,
UIImage(named: "p5")!]
addSubview(scrollView)
scrollView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(0)
make.width.equalTo(350)
make.height.equalTo(200)
}
scrollView.layer.cornerRadius = 5
scrollView.backgroundColor = .gray
scrollView.isPagingEnabled = true
scrollView.bounces = false
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
scrollView.contentSize = CGSize(width: 350 * 3, height: 200)
// scrollView.scrollRectToVisible(CGRect(x: 0, y: -150, width: 350, height: 200), animated: false)
scrollView.delegate = self
for index in -1 ... 1 {
let imageView = UIImageView(frame: CGRect(x: CGFloat(index + 1) * 350, y: 0, width: 350, height: 200))
imageView.isUserInteractionEnabled = true
imageView.contentMode = .scaleToFill
imageView.image = pageImage[(index + pageImage.count) % pageImage.count]
scrollImageViews.append(imageView)
scrollView.addSubview(imageView)
}
addSubview(pageControl)
pageControl.isUserInteractionEnabled = true
pageControl.pageIndicatorTintColor = UIColor.black
pageControl.currentPageIndicatorTintColor = UIColor.red
pageControl.numberOfPages = pageImage.count
pageControl.currentPage = 0
pageControl.snp.makeConstraints { make in
make.width.equalTo(200)
make.height.equalTo(20)
make.bottom.equalTo(scrollView.snp.bottom).offset(-10)
make.centerX.equalToSuperview()
}
pageControl.addTarget(self, action: #selector(pageClick(sender:)), for: .valueChanged)
startTimer()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func pageClick(sender: UIPageControl){
stopTimer()
if (sender.currentPage > currentIndex){
UIView.animate(withDuration: 0.4, animations: {
self.scrollView.contentOffset = CGPoint(x: self.scrollView.frame.width * 2, y: 0)
}, completion: { ok in
if ok {
self.refreshPage()
}
})
} else {
UIView.animate(withDuration: 0.4, animations: {
self.scrollView.contentOffset = CGPoint(x: 0, y: 0)
}, completion: { ok in
if ok {
self.refreshPage()
}
})
}
startTimer()
}
func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
}
func stopTimer(){
timer?.invalidate()
timer = nil
}
func refreshPage() {
let count = pageImage.count
let offset = scrollView.contentOffset
if offset.x > scrollView.frame.width {
currentIndex = (currentIndex + 1) % count
} else if offset.x < scrollView.frame.width {
currentIndex = (currentIndex - 1 + count) % count
}
let leftIndex = (currentIndex - 1 + count) % count
let rightIndex = (currentIndex + 1) % count
scrollImageViews[0].image = pageImage[leftIndex]
scrollImageViews[1].image = pageImage[currentIndex]
scrollImageViews[2].image = pageImage[rightIndex]
scrollView.setContentOffset(CGPoint(x: scrollView.frame.width, y: 0), animated: false)
pageControl.currentPage = currentIndex
}
@objc func timerAction() {
UIView.animate(withDuration: 0.5, animations: {
self.scrollView.contentOffset = CGPoint(x: self.scrollView.frame.width * 2, y: 0)
}, completion: { ok in
if ok {
self.refreshPage()
}
})
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
stopTimer()
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
startTimer()
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
refreshPage()
}
}