Merge branch 'feature/scrollviewdelegatemethods' of https://github.com/AndrewSB/RxSwift into AndrewSB-feature/scrollviewdelegatemethods

This commit is contained in:
Krunoslav Zaher 2016-12-03 22:53:41 +01:00
commit 22da0a6493
3 changed files with 69 additions and 7 deletions

View File

@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
## Master ## Master
* Adds `didScroll` and `didZoom` `ControlEvent`s to `UIScrollView+Rx`
## [3.0.1](https://github.com/ReactiveX/RxSwift/releases/tag/3.0.1) (Xcode 8 / Swift 3.0 compatible) ## [3.0.1](https://github.com/ReactiveX/RxSwift/releases/tag/3.0.1) (Xcode 8 / Swift 3.0 compatible)
#### Anomalies #### Anomalies

View File

@ -52,6 +52,25 @@ extension Reactive where Base: UIScrollView {
} }
} }
/// Reactive wrapper for delegate method `scrollViewDidScroll`
public var didScroll: ControlEvent<Void> {
let source = RxScrollViewDelegateProxy.proxyForObject(base).contentOffsetSubject.map { _ in () }
return ControlEvent(events: source)
}
/// Reactive wrapper for delegate method `scrollViewDidZoom`
public var didZoom: ControlEvent<Void> {
let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidZoom)).map { _ in }
return ControlEvent(events: source)
}
/// Reactive wrapper for delegate method `scrollViewDidScrollToTop`
public var didScrollToTop: ControlEvent<Void> {
let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidScrollToTop(_:))).map { _ in }
return ControlEvent(events: source)
}
/// Installs delegate as forwarding delegate on `delegate`. /// Installs delegate as forwarding delegate on `delegate`.
/// Delegate won't be retained. /// Delegate won't be retained.
/// ///

View File

@ -15,14 +15,14 @@ import RxCocoa
import UIKit import UIKit
import XCTest import XCTest
class UIScrollViewTests : RxTest { class UIScrollViewTests : RxTest {}
}
extension UIScrollViewTests { extension UIScrollViewTests {
func testScrollEnabled_False() { func testScrollEnabled_False() {
let scrollView = UIScrollView(frame: CGRect.zero) let scrollView = UIScrollView()
scrollView.isScrollEnabled = true scrollView.isScrollEnabled = true
Observable.just(false).bindTo(scrollView.rx.isScrollEnabled).dispose() Observable.just(false).bindTo(scrollView.rx.isScrollEnabled).dispose()
XCTAssertTrue(scrollView.isScrollEnabled == false) XCTAssertTrue(scrollView.isScrollEnabled == false)
} }
@ -30,6 +30,7 @@ extension UIScrollViewTests {
func testScrollEnabled_True() { func testScrollEnabled_True() {
let scrollView = UIScrollView(frame: CGRect.zero) let scrollView = UIScrollView(frame: CGRect.zero)
scrollView.isScrollEnabled = false scrollView.isScrollEnabled = false
Observable.just(true).bindTo(scrollView.rx.isScrollEnabled).dispose() Observable.just(true).bindTo(scrollView.rx.isScrollEnabled).dispose()
XCTAssertTrue(scrollView.isScrollEnabled == true) XCTAssertTrue(scrollView.isScrollEnabled == true)
} }
@ -38,20 +39,60 @@ extension UIScrollViewTests {
let createView: () -> UIScrollView = { UIScrollView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) } let createView: () -> UIScrollView = { UIScrollView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx.contentOffset } ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx.contentOffset }
} }
func testScrollViewDidScroll() {
let scrollView = UIScrollView()
var didScroll = false
let subscription = scrollView.rx.didScroll.subscribe(onNext: {
didScroll = true
})
scrollView.delegate!.scrollViewDidScroll!(scrollView)
XCTAssertTrue(didScroll)
subscription.dispose()
}
func testScrollViewDidZoom() {
let scrollView = UIScrollView()
var didZoom = false
let subscription = scrollView.rx.didZoom.subscribe(onNext: {
didZoom = true
})
scrollView.delegate!.scrollViewDidZoom!(scrollView)
XCTAssertTrue(didZoom)
subscription.dispose()
}
func testScrollToTop() {
let scrollView = UIScrollView()
var didScrollToTop = false
let subscription = scrollView.rx.didScrollToTop.subscribe(onNext: {
didScrollToTop = true
})
scrollView.delegate!.scrollViewDidScrollToTop!(scrollView)
XCTAssertTrue(didScrollToTop)
subscription.dispose()
}
} }
@objc class MockScrollViewDelegate @objc class MockScrollViewDelegate
: NSObject : NSObject
, UIScrollViewDelegate { , UIScrollViewDelegate {}
}
extension UIScrollViewTests { extension UIScrollViewTests {
func testSetDelegateUsesWeakReference() { func testSetDelegateUsesWeakReference() {
let scrollView = UIScrollView()
var delegateDeallocated = false var delegateDeallocated = false
let scrollView = UIScrollView(frame: CGRect.zero)
autoreleasepool { autoreleasepool {
let delegate = MockScrollViewDelegate() let delegate = MockScrollViewDelegate()
_ = scrollView.rx.setDelegate(delegate) _ = scrollView.rx.setDelegate(delegate)