【发布时间】:2017-12-10 13:42:10
【问题描述】:
我需要 iCarousel 中 .linear 类型的无限自动滚动效果,我已经实现了 .cylinder 类型的自动滚动,但我无法在 .linear 类型中实现此效果。
这是我在 .cylinder 类型中实现自动滚动的代码
carousel.type = .linear
carousel.autoscroll = -0.4;
carousel.reloadData()
【问题讨论】:
我需要 iCarousel 中 .linear 类型的无限自动滚动效果,我已经实现了 .cylinder 类型的自动滚动,但我无法在 .linear 类型中实现此效果。
这是我在 .cylinder 类型中实现自动滚动的代码
carousel.type = .linear
carousel.autoscroll = -0.4;
carousel.reloadData()
【问题讨论】:
是的,carousel.type = .linear 在linear 的情况下不起作用,因此您必须像这样创建一个自己的滚动计时器:
self.timer = NSTimer.scheduledTimerWithTimeInterval(6, target: self, selector: #selector(self.handleTimer), userInfo: nil, repeats: true)
func handleTimer(){
if itemsScroll.count != 0{
if itemsScroll.count-1 == index{
index = 0
}
else {
index += 1
}
}
let x = CGFloat(index)
if index == 0 {
carousel.scrollToOffset(x, duration: 0)
}
else {
carousel.scrollToOffset(x, duration: 2)
}
}
index 用于获取轮播数据源的当前数据。
【讨论】:
感谢 @salman 在 Salman 的回答的帮助下得到答案,当轮播类型为线性时,我得到了一个无限解决方案的解决方案,而不会出现抽搐问题
请按照以下步骤操作。
1.定义手柄滚动的计时器
_ = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.handleTimer), userInfo: nil, repeats: true)
2。编写轮播的委托方法,并借助 wrap 处理 wrap 类型,我们解决了 jerk 问题。
func carousel(_ carousel: iCarousel, valueFor option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {
switch option {
case .wrap:
return 1
default:
return value
}
}
3.处理滚动的方法
func handleTimer() {
var newIndex = self.carousel.currentItemIndex + 1
if newIndex > self.carousel.numberOfItems {
newIndex = 0
}
carousel.scrollToItem(at: newIndex, duration: 0.5)
}
【讨论】: