145 lines
4.9 KiB
Swift
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()
|
||
|
}
|
||
|
|
||
|
}
|