我用滚动视图制作Pagecontroller
我编写了以下代码,这里每3秒就会基于时间间隔自动滚动滚动视图。
如果我当时尝试手动滚动滚动视图,它也会根据时间间隔更改滚动。
但是我想在手动滚动时根据页面控制索引来移动滚动。
例如:如果当前的页面控件毒性为1,则用户手动将其滚动到第4个。根据我的说法,下一个滚动位置是第5个位置,但根据错误的时间,它不会再移至第5个位置。
var slides:[Slide] = [];
var offSet: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
slides = createSlides()
setupSlideScrollView(slides: slides)
pageControl.numberOfPages = slides.count
pageControl.currentPage = 0
view.bringSubview(toFront: pageControl)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)
}
@objc func autoScroll() {
let totalPossibleOffset = CGFloat(slides.count - 1) * self.view.bounds.size.width
if offSet == totalPossibleOffset {
offSet = 0 // come back to the first image after the last image
}
else {
offSet += self.view.bounds.size.width
}
DispatchQueue.main.async() {
UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {
self.scrollView.contentOffset.x = CGFloat(self.offSet)
}, completion: nil)
}
}
答案 0 :(得分:0)
该计时器正在运行,因此每3秒钟将调用autoScroll()
方法,该方法将执行ScrollView
的滚动,而与您手动滚动无关。
首先,将委托添加到您的viewController
class YourViewController: UIVieController, UIScrollViewDelegate {
// EXISTING CODE
}
并为计时器定义一个全局变量。在视图中进行设置,在StoryBoard中设置IBOutlet。
var timer: Timer!
@IBOutlet weak var scrollView: UIScrollView!
在您的viewDidLoad中进行设置
override func viewDidLoad() {
super.viewDidLoad()
slides = createSlides()
setupSlideScrollView(slides: slides)
pageControl.numberOfPages = slides.count
pageControl.currentPage = 0
view.bringSubview(toFront: pageControl)
// Set delegate here.
scrollView.delegate = self
timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)
}
因此,您将必须实现UIScrollViewDelegate
1)实现此委托方法,并检查计时器isValid
,然后invalidate()
。
Details Here和Here
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
if timer.isValid {
timer.invalidate()
}
}
2)滚动结束后,您将不得不再次安排计时器,以便每3秒开始调用autoScroll
。 Details Here
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
offset = scrollView.contentOffset.x
timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)
}
希望有帮助。