mirror of
https://github.com/ReactiveX/RxSwift.git
synced 2024-10-05 14:37:29 +03:00
Merge branch 'feature/scrollviewdelegatemethods' of https://github.com/AndrewSB/RxSwift into AndrewSB-feature/scrollviewdelegatemethods
This commit is contained in:
commit
22da0a6493
@ -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
|
||||||
|
@ -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.
|
||||||
///
|
///
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user