Skip to content

Instantly share code, notes, and snippets.

@hgsan
Last active May 16, 2019 05:29
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hgsan/2741165f41c9a0251f2982ab98815c9c to your computer and use it in GitHub Desktop.
Save hgsan/2741165f41c9a0251f2982ab98815c9c to your computer and use it in GitHub Desktop.
manage UIPageControl and UIScrollView with RxSwift
@IBOutlet weak var pageControll: UIPageControl!
@IBOutlet weak var scrollView: UIScrollView!
var scrollViewPageIndex :Int {
set {
let contentX = scrollView.width * CGFloat(newValue)
DispatchQueue.main.async {
UIView.animate(withDuration: 0.2, animations: { [weak self] _ in
self?.scrollView.contentOffset = CGPoint.init(x: contentX, y: 0)
})
}
}
get {
return Int(scrollView.contentOffset.x / scrollView.width)
}
}
var selectedPageIndex = Variable(Int())
final let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupSubViews()
}
private func setupSubViews() {
selectedPageIndex.asObservable().bindTo(pageControll.rx.currentPage).addDisposableTo(bag)
scrollView.rx.contentOffset.bindNext { [weak self] (point:CGPoint) in
guard let _ = self?.scrollView.width else {
return
}
if Int(point.x.truncatingRemainder(dividingBy: (self?.scrollView.width)!)) != 0 {
return
}
self?.selectedPageIndex.value = (self?.scrollViewPageIndex)!
}.addDisposableTo(bag)
}
@IBAction func pageControlValueChanged(_ sender: UIPageControl) {
scrollViewPageIndex = sender.currentPage
}
@ccwasden
Copy link

ccwasden commented Mar 8, 2018

If anyone wants a more succinct version:

let frame = scrollView.rx.frameDidChange.startWith(scrollView.frame)
scrollView.rx.contentOffset
    .withLatestFrom(frame) { ($0, $1) }
    .filter { (_, frame) in frame.width > 0 }
    .map { (offset, frame) in Int(offset.x / frame.width) }
    .distinctUntilChanged()
    .bind(to: pageControl.rx.currentPage)
    .disposed(by: disposeBag)

@markst
Copy link

markst commented May 16, 2019

@ccwasden can you reference to frameDidChange code?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment