根据页面控制器当前索引将滚动视图移至下一页

时间:2019-04-20 05:54:17

标签: ios swift scroll uipagecontrol

我用滚动视图制作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)
    }
}

1 个答案:

答案 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 HereHere

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if timer.isValid {
      timer.invalidate()
    }
}

2)滚动结束后,您将不得不再次安排计时器,以便每3秒开始调用autoScrollDetails Here

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
     offset = scrollView.contentOffset.x
     timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)
}

希望有帮助。