Add rx_animating to UIActivityIndicatorView

This commit is contained in:
persidskiy 2015-12-02 23:08:05 +03:00
parent 63127838ec
commit 39f7ea1475
8 changed files with 96 additions and 1 deletions

View File

@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
* Adds `ignoreElements` operator. * Adds `ignoreElements` operator.
* Adds `rx_attributedText` to `UILabel`. * Adds `rx_attributedText` to `UILabel`.
* Adds `rx_animating` to `UIActivityIndicatorView`.
--- ---

View File

@ -405,6 +405,14 @@ extension UISwitch {
} }
``` ```
```swift
extension UIActivityIndicatorView {
public var rx_animating: AnyObserver<Bool> {}
}
```
**OSX** **OSX**
```swift ```swift

View File

@ -7,6 +7,9 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
9BA1CBD31C0F7D550044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
9BA1CBFD1C0F84A10044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */; };
9D71C4D21BF08191006E8F59 /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88254061B8A752B00B02D69 /* UIButton+Rx.swift */; }; 9D71C4D21BF08191006E8F59 /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88254061B8A752B00B02D69 /* UIButton+Rx.swift */; };
B1B7C3BD1BDD39DB0076934E /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */; }; B1B7C3BD1BDD39DB0076934E /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */; };
B1B7C3BE1BDD39DB0076934E /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */; }; B1B7C3BE1BDD39DB0076934E /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */; };
@ -877,6 +880,7 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = "<group>"; };
A111CE961B91C97C00D0DCEE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; A111CE961B91C97C00D0DCEE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TakeLast.swift; sourceTree = "<group>"; }; B1B7C3BC1BDD39DB0076934E /* TakeLast.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TakeLast.swift; sourceTree = "<group>"; };
B1D8998E1BF653410027B05C /* Timeout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timeout.swift; sourceTree = "<group>"; }; B1D8998E1BF653410027B05C /* Timeout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timeout.swift; sourceTree = "<group>"; };
@ -1558,6 +1562,7 @@
C88254121B8A752B00B02D69 /* UITableView+Rx.swift */, C88254121B8A752B00B02D69 /* UITableView+Rx.swift */,
C88254131B8A752B00B02D69 /* UITextField+Rx.swift */, C88254131B8A752B00B02D69 /* UITextField+Rx.swift */,
C88254141B8A752B00B02D69 /* UITextView+Rx.swift */, C88254141B8A752B00B02D69 /* UITextView+Rx.swift */,
9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */,
); );
path = iOS; path = iOS;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2155,6 +2160,7 @@
C882541C1B8A752B00B02D69 /* RxActionSheetDelegateProxy.swift in Sources */, C882541C1B8A752B00B02D69 /* RxActionSheetDelegateProxy.swift in Sources */,
C8093ED51B8A732E0088E94D /* _RXDelegateProxy.m in Sources */, C8093ED51B8A732E0088E94D /* _RXDelegateProxy.m in Sources */,
C8093EF51B8A732E0088E94D /* NSObject+Rx.swift in Sources */, C8093EF51B8A732E0088E94D /* NSObject+Rx.swift in Sources */,
9BA1CBD31C0F7D550044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
C88254241B8A752B00B02D69 /* RxTextViewDelegateProxy.swift in Sources */, C88254241B8A752B00B02D69 /* RxTextViewDelegateProxy.swift in Sources */,
C88254271B8A752B00B02D69 /* UIBarButtonItem+Rx.swift in Sources */, C88254271B8A752B00B02D69 /* UIBarButtonItem+Rx.swift in Sources */,
C88254251B8A752B00B02D69 /* UIActionSheet+Rx.swift in Sources */, C88254251B8A752B00B02D69 /* UIActionSheet+Rx.swift in Sources */,
@ -2716,6 +2722,7 @@
C8F0C0251BBBFBB9001B112F /* RxActionSheetDelegateProxy.swift in Sources */, C8F0C0251BBBFBB9001B112F /* RxActionSheetDelegateProxy.swift in Sources */,
C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */, C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */,
C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */, C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */,
9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */, C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */,
C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */, C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */,
C8F0C02A1BBBFBB9001B112F /* UIActionSheet+Rx.swift in Sources */, C8F0C02A1BBBFBB9001B112F /* UIActionSheet+Rx.swift in Sources */,
@ -2802,6 +2809,7 @@
D2138C961BB9BEDA00339B5C /* NSURLSession+Rx.swift in Sources */, D2138C961BB9BEDA00339B5C /* NSURLSession+Rx.swift in Sources */,
D203C5051BB9C53E00D02D00 /* UICollectionView+Rx.swift in Sources */, D203C5051BB9C53E00D02D00 /* UICollectionView+Rx.swift in Sources */,
D2138C8D1BB9BECD00339B5C /* ControlProperty.swift in Sources */, D2138C8D1BB9BECD00339B5C /* ControlProperty.swift in Sources */,
9BA1CBFD1C0F84A10044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
D203C5071BB9C53E00D02D00 /* UIDatePicker+Rx.swift in Sources */, D203C5071BB9C53E00D02D00 /* UIDatePicker+Rx.swift in Sources */,
D2138C941BB9BEDA00339B5C /* NSObject+Rx+CoreGraphics.swift in Sources */, D2138C941BB9BEDA00339B5C /* NSObject+Rx+CoreGraphics.swift in Sources */,
D203C50D1BB9C53E00D02D00 /* UISegmentedControl+Rx.swift in Sources */, D203C50D1BB9C53E00D02D00 /* UISegmentedControl+Rx.swift in Sources */,

View File

@ -0,0 +1,42 @@
//
// UIActivityIndicatorView+Rx.swift
// Rx
//
// Created by Ivan Persidskiy on 02/12/15.
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
//
#if os(iOS) || os(tvOS)
import UIKit
#if !RX_NO_MODULE
import RxSwift
#endif
extension UIActivityIndicatorView {
/*
Bindable sink for `startAnimating()`, `stopAnimating()` methods.
*/
public var rx_animating: AnyObserver<Bool> {
return AnyObserver {event in
MainScheduler.ensureExecutingOnScheduler()
switch (event) {
case .Next(let value):
if value {
self.startAnimating()
} else {
self.stopAnimating()
}
case .Error(let error):
bindingErrorToInterface(error)
case .Completed:
break
}
}
}
}
#endif

View File

@ -17,6 +17,7 @@
07E300071B14995F00F00100 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E300061B14995F00F00100 /* TableViewController.swift */; }; 07E300071B14995F00F00100 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E300061B14995F00F00100 /* TableViewController.swift */; };
07E300091B149A2A00F00100 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E300081B149A2A00F00100 /* User.swift */; }; 07E300091B149A2A00F00100 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E300081B149A2A00F00100 /* User.swift */; };
07E3C2331B03605B0010338D /* Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E3C2321B03605B0010338D /* Dependencies.swift */; }; 07E3C2331B03605B0010338D /* Dependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E3C2321B03605B0010338D /* Dependencies.swift */; };
9B4612951C106CF100BBBB4E /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B4612941C106CF100BBBB4E /* UIActivityIndicatorView+Rx.swift */; };
B1604CB51BE49F8D002E1279 /* DownloadableImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1604CB41BE49F8D002E1279 /* DownloadableImage.swift */; }; B1604CB51BE49F8D002E1279 /* DownloadableImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1604CB41BE49F8D002E1279 /* DownloadableImage.swift */; };
B1604CC21BE5B895002E1279 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B18F3BE11BDB2E8F000AAC79 /* ReachabilityService.swift */; }; B1604CC21BE5B895002E1279 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B18F3BE11BDB2E8F000AAC79 /* ReachabilityService.swift */; };
B1604CC31BE5B8BD002E1279 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B18F3BE11BDB2E8F000AAC79 /* ReachabilityService.swift */; }; B1604CC31BE5B8BD002E1279 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B18F3BE11BDB2E8F000AAC79 /* ReachabilityService.swift */; };
@ -499,6 +500,7 @@
07E300061B14995F00F00100 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; }; 07E300061B14995F00F00100 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
07E300081B149A2A00F00100 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; }; 07E300081B149A2A00F00100 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
07E3C2321B03605B0010338D /* Dependencies.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Dependencies.swift; path = Examples/Dependencies.swift; sourceTree = "<group>"; }; 07E3C2321B03605B0010338D /* Dependencies.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Dependencies.swift; path = Examples/Dependencies.swift; sourceTree = "<group>"; };
9B4612941C106CF100BBBB4E /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = "<group>"; };
B1604CB41BE49F8D002E1279 /* DownloadableImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadableImage.swift; sourceTree = "<group>"; }; B1604CB41BE49F8D002E1279 /* DownloadableImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadableImage.swift; sourceTree = "<group>"; };
B1604CC81BE5BBFA002E1279 /* UIImageView+DownloadableImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+DownloadableImage.swift"; sourceTree = "<group>"; }; B1604CC81BE5BBFA002E1279 /* UIImageView+DownloadableImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+DownloadableImage.swift"; sourceTree = "<group>"; };
B18F3BBB1BD92EC8000AAC79 /* Reachability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = "<group>"; }; B18F3BBB1BD92EC8000AAC79 /* Reachability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = "<group>"; };
@ -1396,6 +1398,7 @@
C89465571BC6C2BC0055219D /* UITableView+Rx.swift */, C89465571BC6C2BC0055219D /* UITableView+Rx.swift */,
C89465581BC6C2BC0055219D /* UITextField+Rx.swift */, C89465581BC6C2BC0055219D /* UITextField+Rx.swift */,
C89465591BC6C2BC0055219D /* UITextView+Rx.swift */, C89465591BC6C2BC0055219D /* UITextView+Rx.swift */,
9B4612941C106CF100BBBB4E /* UIActivityIndicatorView+Rx.swift */,
); );
path = iOS; path = iOS;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1715,6 +1718,7 @@
files = ( files = (
C84CC58B1BDD486300E06A64 /* LockOwnerType.swift in Sources */, C84CC58B1BDD486300E06A64 /* LockOwnerType.swift in Sources */,
C89465971BC6C2BC0055219D /* UIScrollView+Rx.swift in Sources */, C89465971BC6C2BC0055219D /* UIScrollView+Rx.swift in Sources */,
9B4612951C106CF100BBBB4E /* UIActivityIndicatorView+Rx.swift in Sources */,
C8297E2F1B6CF905000589EA /* RxTableViewSectionedAnimatedDataSource.swift in Sources */, C8297E2F1B6CF905000589EA /* RxTableViewSectionedAnimatedDataSource.swift in Sources */,
C89464D41BC6C2B00055219D /* ObserveOn.swift in Sources */, C89464D41BC6C2B00055219D /* ObserveOn.swift in Sources */,
C894659B1BC6C2BC0055219D /* UIStepper+Rx.swift in Sources */, C894659B1BC6C2BC0055219D /* UIStepper+Rx.swift in Sources */,

View File

@ -39,6 +39,8 @@ class APIWrappersViewController: ViewController {
@IBOutlet weak var switcher: UISwitch! @IBOutlet weak var switcher: UISwitch!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
@IBOutlet weak var button: UIButton! @IBOutlet weak var button: UIButton!
@IBOutlet weak var slider: UISlider! @IBOutlet weak var slider: UISlider!
@ -145,6 +147,12 @@ class APIWrappersViewController: ViewController {
} }
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
// MARK: UIActivityIndicatorView
switcher.rx_value
.bindTo(activityIndicator.rx_animating)
.addDisposableTo(disposeBag)
// MARK: UIButton // MARK: UIButton

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="E5v-jn-n2n"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9060" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="E5v-jn-n2n">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/> <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
@ -817,6 +817,9 @@ This is only showcase app, not intended for production purposes.</string>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state> </state>
</button> </button>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="dBZ-FL-vel">
<rect key="frame" x="161" y="78" width="20" height="20"/>
</activityIndicatorView>
</subviews> </subviews>
<animations/> <animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@ -831,6 +834,7 @@ This is only showcase app, not intended for production purposes.</string>
<barButtonItem key="rightBarButtonItem" title="TapMe" id="PtG-IX-ax4"/> <barButtonItem key="rightBarButtonItem" title="TapMe" id="PtG-IX-ax4"/>
</navigationItem> </navigationItem>
<connections> <connections>
<outlet property="activityIndicator" destination="dBZ-FL-vel" id="ka4-oB-47r"/>
<outlet property="bbitem" destination="PtG-IX-ax4" id="Sl6-M4-8r0"/> <outlet property="bbitem" destination="PtG-IX-ax4" id="Sl6-M4-8r0"/>
<outlet property="button" destination="0br-EX-AUP" id="6RQ-bH-oin"/> <outlet property="button" destination="0br-EX-AUP" id="6RQ-bH-oin"/>
<outlet property="datePicker" destination="JEV-nj-tQA" id="LdZ-qr-RIy"/> <outlet property="datePicker" destination="JEV-nj-tQA" id="LdZ-qr-RIy"/>

View File

@ -313,6 +313,26 @@ extension ControlTests {
} }
} }
// UIActivityIndicatorView
extension ControlTests {
func testActivityIndicator_HasWeakReference() {
ensureControlObserverHasWeakReference(UIActivityIndicatorView(), { (view: UIActivityIndicatorView) -> AnyObserver<Bool> in view.rx_animating }, { Variable<Bool>(true).asObservable() })
}
func testActivityIndicator_NextElementsSetsValue() {
let subject = UIActivityIndicatorView()
let boolSequence = Variable<Bool>(false)
boolSequence.subscribe(subject.rx_animating)
boolSequence.value = true
XCTAssertTrue(subject.isAnimating(), "Expected animation to be started")
boolSequence.value = false
XCTAssertFalse(subject.isAnimating(), "Expected animation to be stopped")
}
}
#if os(iOS) #if os(iOS)