├── Example
├── Screens
│ ├── screen1.png
│ └── screen2.png
├── RNLoadingButtonDemo
│ ├── Imagens
│ │ ├── icon_favorito2_off.png
│ │ ├── icon_favorito_off.png
│ │ ├── icon_favorito_on.png
│ │ ├── icon_favorito_off@2x.png
│ │ ├── icon_favorito_on@2x.png
│ │ ├── bgd_button_red_136x36.png
│ │ ├── btn_background_141x36.png
│ │ ├── btn_background_290x36.png
│ │ ├── icon_favorito2_off@2x.png
│ │ ├── bgd_button_red_136x36@2x.png
│ │ ├── btn_background_141x36@2x.png
│ │ └── btn_background_290x36@2x.png
│ ├── Images.xcassets
│ │ ├── LaunchImage.launchimage
│ │ │ ├── Default.png
│ │ │ ├── Default-568h@2x.png
│ │ │ ├── Default-667h@2x.png
│ │ │ ├── Default-736h@3x.png
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── CHANGELOG.md
│ ├── Info.plist
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── ViewControllerDemo.swift
│ └── ViewControllerDemo.xib
├── RNLoadingButtonDemo.xcodeproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── project.pbxproj
└── RNLoadingButtonDemoTests
│ ├── Info.plist
│ └── RNButtomWithLoadingTests.swift
├── RNLoadingButton.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── RNLoadingButton_Info.plist
└── project.pbxproj
├── CHANGELOG.md
├── RNLoadingButton.podspec
├── LICENSE
├── Package.swift
├── README.md
├── .gitignore
└── Sources
└── LoadingButton.swift
/Example/Screens/screen1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/Screens/screen1.png
--------------------------------------------------------------------------------
/Example/Screens/screen2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/Screens/screen2.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito2_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito2_off.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito_off.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito_on.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito_off@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito_off@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito_on@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito_on@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/bgd_button_red_136x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/bgd_button_red_136x36.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/btn_background_141x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/btn_background_141x36.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/btn_background_290x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/btn_background_290x36.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/icon_favorito2_off@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/icon_favorito2_off@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/bgd_button_red_136x36@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/bgd_button_red_136x36@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/btn_background_141x36@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/btn_background_141x36@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Imagens/btn_background_290x36@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Imagens/btn_background_290x36@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default.png
--------------------------------------------------------------------------------
/RNLoadingButton.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-736h@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/souzainf3/RNLoadingButton-Swift/HEAD/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Default-736h@3x.png
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # RNLoadingButton-Swift - CHANGELOG
2 |
3 |
4 | ## 4.0.2
5 | • Add attributed title support
6 |
7 | ## 4.0.1
8 | • Fix swift 3.0 class access modifier
9 |
10 | ## 4.0.0
11 | • Version in Swift 3.0
12 |
13 | ## 3.2.0
14 | • Swift 2.3 support
15 |
16 | ## 3.0.1
17 | • Fix podspec
18 |
19 | ## 3.0.0
20 | • Version in Swift 2.0
21 |
22 | ## 2.0.0
23 | • Version in Swift 1.2
24 |
25 | ## 1.0
26 | • First Version with Swift 1.0
27 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # RNLoadingButton-Swift - CHANGELOG
2 |
3 | ## 5.0.0
4 | • Swift 4
5 | • Fixed issues generated by Xcode 9
6 |
7 | ## 4.1.0
8 | • Color for activity indicator
9 | • Code refactored
10 |
11 | ## 4.0.1
12 | • Fix swift 3.0 class access modifier
13 |
14 | ## 4.0.0
15 | • Version in Swift 3.0
16 |
17 | ## 3.2.0
18 | • Swift 2.3 support
19 |
20 | ## 3.0.1
21 | • Fix podspec
22 |
23 | ## 3.0.0
24 | • Version in Swift 2.0
25 |
26 | ## 2.0.0
27 | • Version in Swift 1.2
28 |
29 | ## 1.0
30 | • First Version with Swift 1.0
31 |
--------------------------------------------------------------------------------
/RNLoadingButton.xcodeproj/RNLoadingButton_Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | CFBundleDevelopmentRegion
5 | en
6 | CFBundleExecutable
7 | $(EXECUTABLE_NAME)
8 | CFBundleIdentifier
9 | $(PRODUCT_BUNDLE_IDENTIFIER)
10 | CFBundleInfoDictionaryVersion
11 | 6.0
12 | CFBundleName
13 | $(PRODUCT_NAME)
14 | CFBundlePackageType
15 | FMWK
16 | CFBundleShortVersionString
17 | 1.0
18 | CFBundleSignature
19 | ????
20 | CFBundleVersion
21 | $(CURRENT_PROJECT_VERSION)
22 | NSPrincipalClass
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemoTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | com.romilsonnunes.${PRODUCT_NAME:rfc1034identifier}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/RNLoadingButton.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "RNLoadingButton"
3 | s.version = "6.1.0"
4 |
5 | s.summary = "An easy-to-use UIButton subclass with an activity indicator."
6 |
7 | s.description = <<-DESC
8 | The activity state is configurable and can hide the image or text while the activity indicator is displaying . You can Also choose the position of easily activity indicator or Set It up with a spacing..
9 | DESC
10 |
11 | s.homepage = "https://github.com/souzainf3/RNLoadingButton-Swift"
12 | s.license = { :type => "MIT", :file => "LICENSE" }
13 | s.author = { "Romilson Nunes" => "souzainf3@yahoo.com.br" }
14 | s.social_media_url = "http://twitter.com/souzainf3"
15 | s.platform = :ios, "11.0"
16 | s.source = { :git => "https://github.com/souzainf3/RNLoadingButton-Swift.git", :tag => s.version.to_s }
17 | s.swift_version = '5.0'
18 |
19 | s.source_files = "Sources/*"
20 | s.frameworks = "UIKit"
21 | s.requires_arc = true
22 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '5.0' }
23 |
24 | end
25 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemoTests/RNButtomWithLoadingTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RNButtomWithLoadingTests.swift
3 | // RNButtomWithLoadingTests
4 | //
5 | // Created by Alexandre on 06/06/14.
6 | // Copyright (c) 2014 Alexandre. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class RNButtomWithLoadingTests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 | // Put setup code here. This method is called before the invocation of each test method in the class.
16 | }
17 |
18 | override func tearDown() {
19 | // Put teardown code here. This method is called after the invocation of each test method in the class.
20 | super.tearDown()
21 | }
22 |
23 | func testExample() {
24 | // This is an example of a functional test case.
25 | XCTAssert(true, "Pass")
26 | }
27 |
28 | func testPerformanceExample() {
29 | // This is an example of a performance test case.
30 | self.measureBlock() {
31 | // Put the code you want to measure the time of here.
32 | }
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014 Romilson Nunes
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version: 5.7
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "RNLoadingButton",
8 | products: [
9 | // Products define the executables and libraries a package produces, and make them visible to other packages.
10 | .library(
11 | name: "RNLoadingButton",
12 | targets: ["RNLoadingButton"]),
13 | ],
14 | dependencies: [
15 | // Dependencies declare other packages that this package depends on.
16 | // .package(url: /* package url */, from: "1.0.0"),
17 | ],
18 | targets: [
19 | // Targets are the basic building blocks of a package. A target can define a module or a test suite.
20 | // Targets can depend on other targets in this package, and on products in packages this package depends on.
21 | .target(
22 | name: "RNLoadingButton",
23 | dependencies: [],
24 | path: "Sources"
25 | ),
26 | .testTarget(
27 | name: "RNLoadingButtonTests",
28 | dependencies: ["RNLoadingButton"],
29 | path: "Tests"
30 | ),
31 | ]
32 | )
33 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "ipad",
35 | "size" : "29x29",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "ipad",
40 | "size" : "29x29",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "40x40",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "40x40",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "76x76",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "76x76",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RNLoadingButton
2 |
3 | RNLoadingButotn is based an easy-to-use UIButton subclass with an activity indicator.
4 | Objective-C version [RNLoadingButton](https://github.com/souzainf3/RNLoadingButton).
5 |
6 | The activity state is configurable and can hide the image or text while the activity indicator is displaying .
7 | You can Also choose the position of easily activity indicator or Set It up with a spacing.
8 |
9 |
10 |
11 |
12 | 
13 | 
14 |
15 |
16 | ## Adding RNLoadingButton
17 |
18 |
19 | #### Swift Package Manager (SPM)
20 |
21 | Open Swift Package Manager, copy https://github.com/souzainf3/RNLoadingButton-Swift to the search bar
22 | For version, you may use tags or master branch.
23 |
24 | #### Cocoapods
25 |
26 | 1. Add a pod entry for RNActivityView to your Podfile `pod 'RNLoadingButton'`
27 | 2. Install the pod(s) by running `pod install`.
28 |
29 | #### Manually
30 |
31 | 1. Drag `LoadingButton.swift` to your project
32 |
33 |
34 | ## Using RNLoadingButton
35 |
36 | `RNLoadingView` is available in Interface Builder
37 |
38 | ```swift
39 | //Mark: Buttons From Nib
40 | // Configure State
41 | btn1.hideTextWhenLoading = false
42 | btn1.isLoading = false
43 | btn1.activityIndicatorAlignment = .right
44 | btn1.activityIndicatorEdgeInsets = UIEdgeInsets(top: 0, left: 50, bottom: 0, right: 10)
45 | btn1.setTitleColor(UIColor(white: 0.673, alpha: 1.0), for: UIControlState.disabled)
46 | btn1.setTitle("connecting", for: UIControlState.disabled)
47 | btn1.activityIndicatorColor = .blue // Change the activity indicator color
48 | ```
49 |
50 |
51 | ### Properties
52 |
53 | * Loading state
54 | ```swift
55 | isLoading: Bool
56 | ```
57 |
58 | * Hide image when loading is visible
59 | ```swift
60 | hideImageWhenLoading: Bool
61 | ```
62 |
63 | * Hide text when loading is visible
64 | ```swift
65 | hideTextWhenLoading: Bool
66 | ```
67 |
68 | * Edge Insets to set activity indicator frame. Default is .zero
69 | ```swift
70 | activityIndicatorEdgeInsets: UIEdgeInsets
71 | ```
72 |
73 | * Activity Indicator Alingment. Default is '.center'
74 | ```swift
75 | activityIndicatorAlignment: ActivityIndicatorAlignment
76 | ```
77 |
78 | * Activity Indicator style. Default is '.gray'
79 | ```swift
80 | activityIndicatorViewStyle: UIActivityIndicatorViewStyle
81 | ```
82 |
83 | * Color to activityIndicatorView. Default is 'nil'
84 | ```swift
85 | activityIndicatorColor: UIColor
86 | ```
87 |
88 |
89 | ##### Apps using this control (send your to souzainf3@yahoo.com.br )
90 | - [Zee - Personal Finances](https://itunes.apple.com/us/app/id422694086).
91 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // RNButtomWithLoading
4 | //
5 | // Created by Romilson Nunes on 06/06/14.
6 | // Copyright (c) 2014 Romilson Nunes. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 |
18 | self.window = UIWindow(frame: UIScreen.main.bounds)
19 | // Override point for customization after application launch.
20 | self.window!.backgroundColor = UIColor.white
21 |
22 |
23 | let controllerDemo = ViewControllerDemo(nibName: "ViewControllerDemo", bundle: Bundle.main)
24 | self.window!.rootViewController = controllerDemo
25 |
26 | self.window!.makeKeyAndVisible()
27 | return true
28 | }
29 |
30 | func applicationWillResignActive(_ application: UIApplication) {
31 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
32 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
33 | }
34 |
35 | func applicationDidEnterBackground(_ application: UIApplication) {
36 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
37 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
38 | }
39 |
40 | func applicationWillEnterForeground(_ application: UIApplication) {
41 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
42 | }
43 |
44 | func applicationDidBecomeActive(_ application: UIApplication) {
45 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
46 | }
47 |
48 | func applicationWillTerminate(_ application: UIApplication) {
49 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
50 | }
51 |
52 |
53 | }
54 |
55 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/ViewControllerDemo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewControllerDemo.swift
3 | // RNButtomWithLoading
4 | //
5 | // Created by Romilson Nunes on 06/08/14.
6 | // Copyright (c) 2014 Romilson. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class ViewControllerDemo: UIViewController {
12 |
13 | @IBOutlet private(set) var button1: LoadingButton!
14 | @IBOutlet private(set) var button2: LoadingButton!
15 |
16 |
17 | // MARK: - Initializers
18 |
19 | override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
20 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
21 | // Custom initialization
22 | }
23 |
24 | required init?(coder aDecoder: NSCoder) {
25 | fatalError("init(coder:) has not been implemented")
26 | }
27 |
28 |
29 | // MARK: - Lifecycle
30 |
31 | override func viewDidLoad() {
32 | super.viewDidLoad()
33 |
34 | //Mark: Buttons From Nib
35 | // Configure State
36 | let disabledColor = UIColor(white: 0.673, alpha: 1.0)
37 |
38 | button1.hideTextWhenLoading = false
39 | button1.isLoading = false
40 | button1.activityIndicatorAlignment = .right
41 | button1.activityIndicatorEdgeInsets = UIEdgeInsets(top: 0, left: 50, bottom: 0, right: 10)
42 | button1.setTitleColor(disabledColor, for: .disabled)
43 | button1.layer.borderWidth = 1
44 | button1.layer.borderColor = UIColor.white.cgColor
45 | button1.layer.cornerRadius = 10
46 |
47 | // create the attributed string
48 | let attributedString = NSMutableAttributedString(
49 | string: "connecting",
50 | attributes: [
51 | NSAttributedString.Key.foregroundColor : disabledColor,
52 | ]
53 | )
54 | button1.setAttributedTitle(attributedString, for: .disabled)
55 |
56 | button2.hideTextWhenLoading = false
57 | button2.isLoading = false
58 | button2.activityIndicatorAlignment = .left
59 | button2.activityIndicatorViewStyle = UIActivityIndicatorView.Style.gray
60 | button2.activityIndicatorEdgeInsets = UIEdgeInsets.init(top: 0, left: 10, bottom: 0, right: 0)
61 | button2.layer.borderWidth = 1
62 | button2.layer.borderColor = UIColor.white.cgColor
63 | button2.layer.cornerRadius = 10
64 |
65 | button2.setTitle("Loading", for: UIControl.State.disabled)
66 | }
67 |
68 | private func randomAttributes(button: LoadingButton) {
69 |
70 | buttonTapAction(button)
71 |
72 | DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
73 | // your function here
74 | self.randomAttributes(button: button)
75 | }
76 | }
77 |
78 |
79 | // MARK: - Actions
80 |
81 | @IBAction private func buttonTapAction(_ button: LoadingButton) {
82 | button.isLoading = !button.isLoading
83 | button.activityIndicatorAlignment = .center
84 | button.hideImageWhenLoading = true
85 |
86 | }
87 |
88 | @IBAction private func doTap(_ sender: LoadingButton) {
89 |
90 | sender.isEnabled = false
91 | sender.isLoading = true;
92 |
93 | if sender.tag == 3 {
94 | sender.hideImageWhenLoading = true
95 | }
96 |
97 | DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
98 | sender.isEnabled = true
99 | sender.isLoading = false
100 |
101 | if sender.tag == 3 {
102 | sender.isSelected = !sender.isSelected
103 | }
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/Images.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "extent" : "full-screen",
5 | "idiom" : "iphone",
6 | "subtype" : "736h",
7 | "filename" : "Default-736h@3x.png",
8 | "minimum-system-version" : "8.0",
9 | "orientation" : "portrait",
10 | "scale" : "3x"
11 | },
12 | {
13 | "orientation" : "landscape",
14 | "idiom" : "iphone",
15 | "extent" : "full-screen",
16 | "minimum-system-version" : "8.0",
17 | "subtype" : "736h",
18 | "scale" : "3x"
19 | },
20 | {
21 | "extent" : "full-screen",
22 | "idiom" : "iphone",
23 | "subtype" : "667h",
24 | "filename" : "Default-667h@2x.png",
25 | "minimum-system-version" : "8.0",
26 | "orientation" : "portrait",
27 | "scale" : "2x"
28 | },
29 | {
30 | "orientation" : "portrait",
31 | "idiom" : "iphone",
32 | "extent" : "full-screen",
33 | "minimum-system-version" : "7.0",
34 | "filename" : "Default.png",
35 | "scale" : "2x"
36 | },
37 | {
38 | "extent" : "full-screen",
39 | "idiom" : "iphone",
40 | "subtype" : "retina4",
41 | "filename" : "Default-568h@2x.png",
42 | "minimum-system-version" : "7.0",
43 | "orientation" : "portrait",
44 | "scale" : "2x"
45 | },
46 | {
47 | "orientation" : "portrait",
48 | "idiom" : "ipad",
49 | "extent" : "full-screen",
50 | "minimum-system-version" : "7.0",
51 | "scale" : "1x"
52 | },
53 | {
54 | "orientation" : "landscape",
55 | "idiom" : "ipad",
56 | "extent" : "full-screen",
57 | "minimum-system-version" : "7.0",
58 | "scale" : "1x"
59 | },
60 | {
61 | "orientation" : "portrait",
62 | "idiom" : "ipad",
63 | "extent" : "full-screen",
64 | "minimum-system-version" : "7.0",
65 | "scale" : "2x"
66 | },
67 | {
68 | "orientation" : "landscape",
69 | "idiom" : "ipad",
70 | "extent" : "full-screen",
71 | "minimum-system-version" : "7.0",
72 | "scale" : "2x"
73 | },
74 | {
75 | "orientation" : "portrait",
76 | "idiom" : "iphone",
77 | "extent" : "full-screen",
78 | "scale" : "1x"
79 | },
80 | {
81 | "orientation" : "portrait",
82 | "idiom" : "iphone",
83 | "extent" : "full-screen",
84 | "scale" : "2x"
85 | },
86 | {
87 | "orientation" : "portrait",
88 | "idiom" : "iphone",
89 | "extent" : "full-screen",
90 | "subtype" : "retina4",
91 | "scale" : "2x"
92 | },
93 | {
94 | "orientation" : "portrait",
95 | "idiom" : "ipad",
96 | "extent" : "to-status-bar",
97 | "scale" : "1x"
98 | },
99 | {
100 | "orientation" : "portrait",
101 | "idiom" : "ipad",
102 | "extent" : "full-screen",
103 | "scale" : "1x"
104 | },
105 | {
106 | "orientation" : "landscape",
107 | "idiom" : "ipad",
108 | "extent" : "to-status-bar",
109 | "scale" : "1x"
110 | },
111 | {
112 | "orientation" : "landscape",
113 | "idiom" : "ipad",
114 | "extent" : "full-screen",
115 | "scale" : "1x"
116 | },
117 | {
118 | "orientation" : "portrait",
119 | "idiom" : "ipad",
120 | "extent" : "to-status-bar",
121 | "scale" : "2x"
122 | },
123 | {
124 | "orientation" : "portrait",
125 | "idiom" : "ipad",
126 | "extent" : "full-screen",
127 | "scale" : "2x"
128 | },
129 | {
130 | "orientation" : "landscape",
131 | "idiom" : "ipad",
132 | "extent" : "to-status-bar",
133 | "scale" : "2x"
134 | },
135 | {
136 | "orientation" : "landscape",
137 | "idiom" : "ipad",
138 | "extent" : "full-screen",
139 | "scale" : "2x"
140 | }
141 | ],
142 | "info" : {
143 | "version" : 1,
144 | "author" : "xcode"
145 | }
146 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io/api/xcode,swift,objective-c,osx
2 |
3 | .DS_Store
4 | /.build
5 | /Packages
6 | /*.xcodeproj
7 | xcuserdata/
8 | DerivedData/
9 | .swiftpm/config/registries.json
10 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
11 | .netrc
12 |
13 |
14 | ### Xcode ###
15 | # Xcode
16 | #
17 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
18 |
19 | ## Build generated
20 | build/
21 | DerivedData
22 |
23 | ## Various settings
24 | *.pbxuser
25 | !default.pbxuser
26 | *.mode1v3
27 | !default.mode1v3
28 | *.mode2v3
29 | !default.mode2v3
30 | *.perspectivev3
31 | !default.perspectivev3
32 | xcuserdata
33 | xcshareddata
34 |
35 | ## Other
36 | *.xccheckout
37 | *.moved-aside
38 | *.xcuserstate
39 | <<<<<<< HEAD
40 | *.xcscmblueprint
41 |
42 | ## Obj-C/Swift specific
43 | *.hmap
44 | *.ipa
45 |
46 | # CocoaPods
47 | #
48 | # We recommend against adding the Pods directory to your .gitignore. However
49 | # you should judge for yourself, the pros and cons are mentioned at:
50 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
51 | #
52 | #Pods/
53 |
54 | # Carthage
55 | #
56 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
57 | # Carthage/Checkouts
58 |
59 | Carthage/Build
60 |
61 | ### Objective-C Patch ###
62 | *.xcscmblueprint
63 |
64 |
65 | ### Xcode ###
66 | =======
67 |
68 |
69 | ### Swift ###
70 | >>>>>>> develop
71 | # Xcode
72 | #
73 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
74 |
75 | ## Build generated
76 | build/
77 | DerivedData
78 |
79 | ## Various settings
80 | *.pbxuser
81 | !default.pbxuser
82 | *.mode1v3
83 | !default.mode1v3
84 | *.mode2v3
85 | !default.mode2v3
86 | *.perspectivev3
87 | !default.perspectivev3
88 | xcuserdata
89 |
90 | ## Other
91 | *.xccheckout
92 | *.moved-aside
93 | *.xcuserstate
94 | <<<<<<< HEAD
95 |
96 |
97 | ### Swift ###
98 | =======
99 | *.xcscmblueprint
100 |
101 | ## Obj-C/Swift specific
102 | *.hmap
103 | *.ipa
104 |
105 | # CocoaPods
106 | #
107 | # We recommend against adding the Pods directory to your .gitignore. However
108 | # you should judge for yourself, the pros and cons are mentioned at:
109 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
110 | #
111 | # Pods/
112 |
113 | # Carthage
114 | #
115 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
116 | # Carthage/Checkouts
117 |
118 | Carthage/Build
119 |
120 |
121 | ### Objective-C ###
122 | >>>>>>> develop
123 | # Xcode
124 | #
125 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
126 |
127 | ## Build generated
128 | build/
129 | DerivedData
130 |
131 | ## Various settings
132 | *.pbxuser
133 | !default.pbxuser
134 | *.mode1v3
135 | !default.mode1v3
136 | *.mode2v3
137 | !default.mode2v3
138 | *.perspectivev3
139 | !default.perspectivev3
140 | xcuserdata
141 |
142 | ## Other
143 | *.xccheckout
144 | *.moved-aside
145 | *.xcuserstate
146 | *.xcscmblueprint
147 |
148 | ## Obj-C/Swift specific
149 | *.hmap
150 | *.ipa
151 |
152 | # CocoaPods
153 | #
154 | # We recommend against adding the Pods directory to your .gitignore. However
155 | # you should judge for yourself, the pros and cons are mentioned at:
156 | <<<<<<< HEAD
157 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
158 | #
159 | # Pods/
160 | =======
161 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
162 | #
163 | #Pods/
164 | >>>>>>> develop
165 |
166 | # Carthage
167 | #
168 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
169 | # Carthage/Checkouts
170 |
171 | Carthage/Build
172 |
173 | <<<<<<< HEAD
174 | =======
175 | ### Objective-C Patch ###
176 | *.xcscmblueprint
177 |
178 | >>>>>>> develop
179 |
180 | ### OSX ###
181 | .DS_Store
182 | .AppleDouble
183 | .LSOverride
184 |
185 | # Icon must end with two \r
186 | Icon
187 |
188 |
189 | # Thumbnails
190 | ._*
191 |
192 | # Files that might appear in the root of a volume
193 | .DocumentRevisions-V100
194 | .fseventsd
195 | .Spotlight-V100
196 | .TemporaryItems
197 | .Trashes
198 | .VolumeIcon.icns
199 |
200 | # Directories potentially created on remote AFP share
201 | .AppleDB
202 | .AppleDesktop
203 | Network Trash Folder
204 | Temporary Items
205 | .apdisk
206 |
207 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo/ViewControllerDemo.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
42 |
63 |
84 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
--------------------------------------------------------------------------------
/RNLoadingButton.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = "1";
4 | objectVersion = "46";
5 | objects = {
6 | "OBJ_1" = {
7 | isa = "PBXProject";
8 | attributes = {
9 | LastSwiftMigration = "9999";
10 | LastUpgradeCheck = "9999";
11 | };
12 | buildConfigurationList = "OBJ_2";
13 | compatibilityVersion = "Xcode 3.2";
14 | developmentRegion = "en";
15 | hasScannedForEncodings = "0";
16 | knownRegions = (
17 | "en"
18 | );
19 | mainGroup = "OBJ_5";
20 | productRefGroup = "OBJ_10";
21 | projectDirPath = ".";
22 | targets = (
23 | "rnloadingbutton::RNLoadingButton",
24 | "rnloadingbutton::SwiftPMPackageDescription"
25 | );
26 | };
27 | "OBJ_10" = {
28 | isa = "PBXGroup";
29 | children = (
30 | "rnloadingbutton::RNLoadingButton::Product"
31 | );
32 | name = "Products";
33 | path = "";
34 | sourceTree = "BUILT_PRODUCTS_DIR";
35 | };
36 | "OBJ_12" = {
37 | isa = "PBXFileReference";
38 | path = "Example";
39 | sourceTree = "SOURCE_ROOT";
40 | };
41 | "OBJ_13" = {
42 | isa = "PBXFileReference";
43 | path = "LICENSE";
44 | sourceTree = "";
45 | };
46 | "OBJ_14" = {
47 | isa = "PBXFileReference";
48 | path = "CHANGELOG.md";
49 | sourceTree = "";
50 | };
51 | "OBJ_15" = {
52 | isa = "PBXFileReference";
53 | path = "README.md";
54 | sourceTree = "";
55 | };
56 | "OBJ_16" = {
57 | isa = "PBXFileReference";
58 | path = "RNLoadingButton.podspec";
59 | sourceTree = "";
60 | };
61 | "OBJ_18" = {
62 | isa = "XCConfigurationList";
63 | buildConfigurations = (
64 | "OBJ_19",
65 | "OBJ_20"
66 | );
67 | defaultConfigurationIsVisible = "0";
68 | defaultConfigurationName = "Release";
69 | };
70 | "OBJ_19" = {
71 | isa = "XCBuildConfiguration";
72 | buildSettings = {
73 | CURRENT_PROJECT_VERSION = "1";
74 | DRIVERKIT_DEPLOYMENT_TARGET = "19.0";
75 | ENABLE_TESTABILITY = "YES";
76 | FRAMEWORK_SEARCH_PATHS = (
77 | "$(inherited)",
78 | "$(PLATFORM_DIR)/Developer/Library/Frameworks"
79 | );
80 | HEADER_SEARCH_PATHS = (
81 | "$(inherited)"
82 | );
83 | INFOPLIST_FILE = "RNLoadingButton.xcodeproj/RNLoadingButton_Info.plist";
84 | IPHONEOS_DEPLOYMENT_TARGET = "11.0";
85 | LD_RUNPATH_SEARCH_PATHS = (
86 | "$(inherited)",
87 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"
88 | );
89 | MACOSX_DEPLOYMENT_TARGET = "10.13";
90 | OTHER_CFLAGS = (
91 | "$(inherited)"
92 | );
93 | OTHER_LDFLAGS = (
94 | "$(inherited)"
95 | );
96 | OTHER_SWIFT_FLAGS = (
97 | "$(inherited)"
98 | );
99 | PRODUCT_BUNDLE_IDENTIFIER = "RNLoadingButton";
100 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
101 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
102 | SKIP_INSTALL = "YES";
103 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = (
104 | "$(inherited)"
105 | );
106 | SWIFT_VERSION = "5.0";
107 | TARGET_NAME = "RNLoadingButton";
108 | TVOS_DEPLOYMENT_TARGET = "11.0";
109 | WATCHOS_DEPLOYMENT_TARGET = "4.0";
110 | };
111 | name = "Debug";
112 | };
113 | "OBJ_2" = {
114 | isa = "XCConfigurationList";
115 | buildConfigurations = (
116 | "OBJ_3",
117 | "OBJ_4"
118 | );
119 | defaultConfigurationIsVisible = "0";
120 | defaultConfigurationName = "Release";
121 | };
122 | "OBJ_20" = {
123 | isa = "XCBuildConfiguration";
124 | buildSettings = {
125 | CURRENT_PROJECT_VERSION = "1";
126 | DRIVERKIT_DEPLOYMENT_TARGET = "19.0";
127 | ENABLE_TESTABILITY = "YES";
128 | FRAMEWORK_SEARCH_PATHS = (
129 | "$(inherited)",
130 | "$(PLATFORM_DIR)/Developer/Library/Frameworks"
131 | );
132 | HEADER_SEARCH_PATHS = (
133 | "$(inherited)"
134 | );
135 | INFOPLIST_FILE = "RNLoadingButton.xcodeproj/RNLoadingButton_Info.plist";
136 | IPHONEOS_DEPLOYMENT_TARGET = "11.0";
137 | LD_RUNPATH_SEARCH_PATHS = (
138 | "$(inherited)",
139 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx"
140 | );
141 | MACOSX_DEPLOYMENT_TARGET = "10.13";
142 | OTHER_CFLAGS = (
143 | "$(inherited)"
144 | );
145 | OTHER_LDFLAGS = (
146 | "$(inherited)"
147 | );
148 | OTHER_SWIFT_FLAGS = (
149 | "$(inherited)"
150 | );
151 | PRODUCT_BUNDLE_IDENTIFIER = "RNLoadingButton";
152 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
153 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
154 | SKIP_INSTALL = "YES";
155 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = (
156 | "$(inherited)"
157 | );
158 | SWIFT_VERSION = "5.0";
159 | TARGET_NAME = "RNLoadingButton";
160 | TVOS_DEPLOYMENT_TARGET = "11.0";
161 | WATCHOS_DEPLOYMENT_TARGET = "4.0";
162 | };
163 | name = "Release";
164 | };
165 | "OBJ_21" = {
166 | isa = "PBXSourcesBuildPhase";
167 | files = (
168 | "OBJ_22"
169 | );
170 | };
171 | "OBJ_22" = {
172 | isa = "PBXBuildFile";
173 | fileRef = "OBJ_8";
174 | };
175 | "OBJ_23" = {
176 | isa = "PBXFrameworksBuildPhase";
177 | files = (
178 | );
179 | };
180 | "OBJ_25" = {
181 | isa = "XCConfigurationList";
182 | buildConfigurations = (
183 | "OBJ_26",
184 | "OBJ_27"
185 | );
186 | defaultConfigurationIsVisible = "0";
187 | defaultConfigurationName = "Release";
188 | };
189 | "OBJ_26" = {
190 | isa = "XCBuildConfiguration";
191 | buildSettings = {
192 | LD = "/usr/bin/true";
193 | OTHER_SWIFT_FLAGS = (
194 | "-swift-version",
195 | "5",
196 | "-I",
197 | "$(TOOLCHAIN_DIR)/usr/lib/swift/pm/ManifestAPI",
198 | "-sdk",
199 | "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk",
200 | "-package-description-version",
201 | "5.7.0"
202 | );
203 | SWIFT_VERSION = "5.0";
204 | };
205 | name = "Debug";
206 | };
207 | "OBJ_27" = {
208 | isa = "XCBuildConfiguration";
209 | buildSettings = {
210 | LD = "/usr/bin/true";
211 | OTHER_SWIFT_FLAGS = (
212 | "-swift-version",
213 | "5",
214 | "-I",
215 | "$(TOOLCHAIN_DIR)/usr/lib/swift/pm/ManifestAPI",
216 | "-sdk",
217 | "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk",
218 | "-package-description-version",
219 | "5.7.0"
220 | );
221 | SWIFT_VERSION = "5.0";
222 | };
223 | name = "Release";
224 | };
225 | "OBJ_28" = {
226 | isa = "PBXSourcesBuildPhase";
227 | files = (
228 | "OBJ_29"
229 | );
230 | };
231 | "OBJ_29" = {
232 | isa = "PBXBuildFile";
233 | fileRef = "OBJ_6";
234 | };
235 | "OBJ_3" = {
236 | isa = "XCBuildConfiguration";
237 | buildSettings = {
238 | CLANG_ENABLE_OBJC_ARC = "YES";
239 | COMBINE_HIDPI_IMAGES = "YES";
240 | COPY_PHASE_STRIP = "NO";
241 | DEBUG_INFORMATION_FORMAT = "dwarf";
242 | DYLIB_INSTALL_NAME_BASE = "@rpath";
243 | ENABLE_NS_ASSERTIONS = "YES";
244 | GCC_OPTIMIZATION_LEVEL = "0";
245 | GCC_PREPROCESSOR_DEFINITIONS = (
246 | "$(inherited)",
247 | "SWIFT_PACKAGE=1",
248 | "DEBUG=1"
249 | );
250 | MACOSX_DEPLOYMENT_TARGET = "10.10";
251 | ONLY_ACTIVE_ARCH = "YES";
252 | OTHER_SWIFT_FLAGS = (
253 | "$(inherited)",
254 | "-DXcode"
255 | );
256 | PRODUCT_NAME = "$(TARGET_NAME)";
257 | SDKROOT = "macosx";
258 | SUPPORTED_PLATFORMS = (
259 | "$(AVAILABLE_PLATFORMS)"
260 | );
261 | SUPPORTS_MACCATALYST = "YES";
262 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = (
263 | "$(inherited)",
264 | "SWIFT_PACKAGE",
265 | "DEBUG"
266 | );
267 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
268 | USE_HEADERMAP = "NO";
269 | };
270 | name = "Debug";
271 | };
272 | "OBJ_4" = {
273 | isa = "XCBuildConfiguration";
274 | buildSettings = {
275 | CLANG_ENABLE_OBJC_ARC = "YES";
276 | COMBINE_HIDPI_IMAGES = "YES";
277 | COPY_PHASE_STRIP = "YES";
278 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
279 | DYLIB_INSTALL_NAME_BASE = "@rpath";
280 | GCC_OPTIMIZATION_LEVEL = "s";
281 | GCC_PREPROCESSOR_DEFINITIONS = (
282 | "$(inherited)",
283 | "SWIFT_PACKAGE=1"
284 | );
285 | MACOSX_DEPLOYMENT_TARGET = "10.10";
286 | OTHER_SWIFT_FLAGS = (
287 | "$(inherited)",
288 | "-DXcode"
289 | );
290 | PRODUCT_NAME = "$(TARGET_NAME)";
291 | SDKROOT = "macosx";
292 | SUPPORTED_PLATFORMS = (
293 | "$(AVAILABLE_PLATFORMS)"
294 | );
295 | SUPPORTS_MACCATALYST = "YES";
296 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = (
297 | "$(inherited)",
298 | "SWIFT_PACKAGE"
299 | );
300 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
301 | USE_HEADERMAP = "NO";
302 | };
303 | name = "Release";
304 | };
305 | "OBJ_5" = {
306 | isa = "PBXGroup";
307 | children = (
308 | "OBJ_6",
309 | "OBJ_7",
310 | "OBJ_9",
311 | "OBJ_10",
312 | "OBJ_12",
313 | "OBJ_13",
314 | "OBJ_14",
315 | "OBJ_15",
316 | "OBJ_16"
317 | );
318 | path = "";
319 | sourceTree = "";
320 | };
321 | "OBJ_6" = {
322 | isa = "PBXFileReference";
323 | explicitFileType = "sourcecode.swift";
324 | path = "Package.swift";
325 | sourceTree = "";
326 | };
327 | "OBJ_7" = {
328 | isa = "PBXGroup";
329 | children = (
330 | "OBJ_8"
331 | );
332 | name = "Sources";
333 | path = "Sources";
334 | sourceTree = "SOURCE_ROOT";
335 | };
336 | "OBJ_8" = {
337 | isa = "PBXFileReference";
338 | path = "LoadingButton.swift";
339 | sourceTree = "";
340 | };
341 | "OBJ_9" = {
342 | isa = "PBXGroup";
343 | children = (
344 | );
345 | name = "Tests";
346 | path = "";
347 | sourceTree = "SOURCE_ROOT";
348 | };
349 | "rnloadingbutton::RNLoadingButton" = {
350 | isa = "PBXNativeTarget";
351 | buildConfigurationList = "OBJ_18";
352 | buildPhases = (
353 | "OBJ_21",
354 | "OBJ_23"
355 | );
356 | dependencies = (
357 | );
358 | name = "RNLoadingButton";
359 | productName = "RNLoadingButton";
360 | productReference = "rnloadingbutton::RNLoadingButton::Product";
361 | productType = "com.apple.product-type.framework";
362 | };
363 | "rnloadingbutton::RNLoadingButton::Product" = {
364 | isa = "PBXFileReference";
365 | path = "RNLoadingButton.framework";
366 | sourceTree = "BUILT_PRODUCTS_DIR";
367 | };
368 | "rnloadingbutton::SwiftPMPackageDescription" = {
369 | isa = "PBXNativeTarget";
370 | buildConfigurationList = "OBJ_25";
371 | buildPhases = (
372 | "OBJ_28"
373 | );
374 | dependencies = (
375 | );
376 | name = "RNLoadingButtonPackageDescription";
377 | productName = "RNLoadingButtonPackageDescription";
378 | productType = "com.apple.product-type.framework";
379 | };
380 | };
381 | rootObject = "OBJ_1";
382 | }
383 |
--------------------------------------------------------------------------------
/Sources/LoadingButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingButton.swift
3 | // LoadingButton
4 | //
5 | // Created by Romilson Nunes on 06/06/14.
6 | // Copyright (c) 2014 Romilson Nunes. All rights reserved.
7 | //
8 |
9 | #if canImport(UIKit)
10 | import UIKit
11 |
12 | @objc public enum ActivityIndicatorAlignment: Int {
13 | case left, center, right
14 | }
15 |
16 | open class LoadingButton: UIButton {
17 |
18 | /// Loading state. Default value is `false`
19 | @IBInspectable
20 | open var isLoading: Bool = false {
21 | didSet {
22 | #if !TARGET_INTERFACE_BUILDER
23 | configureControl(for: currentControlState())
24 | #else
25 | self.setNeedsDisplay()
26 | #endif
27 | }
28 | }
29 |
30 | /// Hide image when loading is visible. Default value is `true`
31 | @IBInspectable open var hideImageWhenLoading: Bool = true {
32 | didSet {
33 | configureControl(for: currentControlState())
34 | }
35 | }
36 |
37 | /// Hide text when loading is visible. Default value is `true`
38 | @IBInspectable open var hideTextWhenLoading: Bool = true {
39 | didSet {
40 | configureControl(for: currentControlState())
41 | }
42 | }
43 |
44 | /// Edge Insets to set activity indicator frame. Default value is `.zero`.
45 | open var activityIndicatorEdgeInsets: UIEdgeInsets = .zero
46 |
47 | /// Activity Indicator Alingment. Default is '.center'
48 | @IBInspectable open var activityIndicatorAlignment: ActivityIndicatorAlignment = .center {
49 | didSet {
50 | self.setNeedsLayout()
51 | }
52 | }
53 |
54 | /// Activity Indicator style. Default value is `.gray`
55 | open var activityIndicatorViewStyle: UIActivityIndicatorView.Style = .gray {
56 | didSet {
57 | self.setNeedsLayout()
58 | }
59 | }
60 |
61 | /// Color to activityIndicatorView. Default value is `nil`
62 | @IBInspectable open var activityIndicatorColor: UIColor? {
63 | didSet {
64 | self.setNeedsLayout()
65 | }
66 | }
67 |
68 |
69 | // MARK: - Privates Properties
70 |
71 | private let activityIndicatorView = UIActivityIndicatorView(style: .gray)
72 |
73 | typealias ControlStateDictionary = [UInt: Any]
74 |
75 | private var imagens = ControlStateDictionary()
76 | private var titles = ControlStateDictionary()
77 | private var attributedTitles = ControlStateDictionary()
78 |
79 |
80 | // MARK: - Initializers
81 |
82 | #if !TARGET_INTERFACE_BUILDER
83 | deinit {
84 | self.removeObservers()
85 | }
86 |
87 | override init(frame: CGRect) {
88 | super.init(frame: frame)
89 |
90 | self.setupActivityIndicator()
91 | commonInit()
92 | }
93 |
94 | required public init?(coder aDecoder: NSCoder) {
95 | super.init(coder: aDecoder)
96 | commonInit()
97 | }
98 |
99 | override open func awakeFromNib() {
100 | super.awakeFromNib()
101 |
102 | setupActivityIndicator()
103 |
104 | let states: [UIControl.State] = [.normal, .highlighted, .disabled, .selected]
105 |
106 | /// Store default values
107 | states.forEach {
108 | // Images - Icons
109 | if let imageForState = super.image(for: $0) {
110 | self.store(imageForState, in: &self.imagens, for: $0)
111 | }
112 |
113 | // Title - Texts
114 | if let titleForState = super.title(for: $0) {
115 | self.store(titleForState, in: &self.titles, for: $0)
116 | }
117 |
118 | // Attributed Title - Texts
119 | if let attributedTitle = super.attributedTitle(for: $0) {
120 | self.store(attributedTitle, in: &self.attributedTitles, for: $0)
121 | }
122 | }
123 |
124 | configureControl(for: currentControlState())
125 | }
126 |
127 | #endif
128 |
129 | override open func prepareForInterfaceBuilder() {
130 | super.prepareForInterfaceBuilder()
131 |
132 | #if TARGET_INTERFACE_BUILDER
133 | // this code will execute only in IB
134 | self.setupActivityIndicator()
135 | commonInit()
136 | #endif
137 | }
138 |
139 |
140 | // MARK: - Initializers Helpers
141 |
142 | fileprivate func commonInit() {
143 | self.adjustsImageWhenHighlighted = true
144 | self.storeDefaultValues()
145 | #if !TARGET_INTERFACE_BUILDER
146 | self.addObservers()
147 | #endif
148 | }
149 |
150 | private func storeDefaultValues() {
151 | let states: [UIControl.State] = [.normal, .highlighted, .disabled, .selected]
152 | _ = states.map({
153 | // Images for State
154 | self.imagens[$0.rawValue] = super.image(for: $0)
155 |
156 | // Title for States
157 | self.titles[$0.rawValue] = super.title(for: $0)
158 |
159 | /// Attributed Title for States
160 | self.attributedTitles[$0.rawValue] = super.attributedTitle(for: $0)
161 | })
162 | }
163 |
164 | // MARK: - Relayout
165 |
166 | override open func layoutSubviews() {
167 | super.layoutSubviews()
168 |
169 | self.activityIndicatorView.style = self.activityIndicatorViewStyle
170 | self.activityIndicatorView.color = self.activityIndicatorColor
171 | self.activityIndicatorView.frame = self.frameForActivityIndicator()
172 | self.bringSubviewToFront(self.activityIndicatorView)
173 | }
174 |
175 |
176 | // MARK: - Internal Methods
177 |
178 | fileprivate func setupActivityIndicator() {
179 | self.activityIndicatorView.hidesWhenStopped = true
180 | self.activityIndicatorView.startAnimating()
181 | self.addSubview(self.activityIndicatorView)
182 | self.activityIndicatorView.isUserInteractionEnabled = false
183 | }
184 |
185 | fileprivate func currentControlState() -> UIControl.State {
186 | var controlState = UIControl.State.normal.rawValue
187 | if self.isSelected {
188 | controlState += UIControl.State.selected.rawValue
189 | }
190 | if self.isHighlighted {
191 | controlState += UIControl.State.highlighted.rawValue
192 | }
193 | if !self.isEnabled {
194 | controlState += UIControl.State.disabled.rawValue
195 | }
196 | return UIControl.State(rawValue: controlState)
197 | }
198 |
199 | fileprivate func setControlState(_ value: AnyObject, dic: inout ControlStateDictionary, state: UIControl.State) {
200 | dic[state.rawValue] = value
201 | configureControl(for: currentControlState())
202 | }
203 |
204 | fileprivate func setImage(_ image:UIImage, state:UIControl.State) {
205 | setControlState(image, dic: &self.imagens, state: state)
206 | }
207 |
208 |
209 | // MARK: - Override Setters & Getters
210 |
211 | override open func setTitle(_ title: String?, for state: UIControl.State) {
212 | self.store(title, in: &self.titles, for: state)
213 | if super.title(for: state) != title {
214 | super.setTitle(title, for: state)
215 | }
216 | self.setNeedsLayout()
217 | }
218 |
219 | open override func setAttributedTitle(_ title: NSAttributedString?, for state: UIControl.State) {
220 | self.store(title, in: &self.attributedTitles, for: state)
221 | if super.attributedTitle(for: state) != title {
222 | super.setAttributedTitle(title, for: state)
223 | }
224 | self.setNeedsLayout()
225 | }
226 |
227 | override open func setImage(_ image: UIImage?, for state: UIControl.State) {
228 | self.store(image, in: &self.imagens, for: state)
229 | if super.image(for: state) != image {
230 | super.setImage(image, for: state)
231 | }
232 | self.setNeedsLayout()
233 | }
234 |
235 | override open func title(for state: UIControl.State) -> String? {
236 | return getValueFrom(type: String.self, on: self.titles, for: state)
237 | }
238 |
239 | open override func attributedTitle(for state: UIControl.State) -> NSAttributedString? {
240 | return getValueFrom(type: NSAttributedString.self, on: self.attributedTitles, for: state)
241 | }
242 |
243 | override open func image(for state: UIControl.State) -> UIImage? {
244 | return getValueFrom(type: UIImage.self, on: self.imagens, for: state)
245 | }
246 |
247 |
248 | // MARK: - Private Methods
249 |
250 | private func configureControl(for state: UIControl.State) {
251 | if self.isLoading {
252 | self.activityIndicatorView.startAnimating()
253 |
254 | if self.hideImageWhenLoading {
255 |
256 | var imgTmp:UIImage? = nil
257 | if let img = self.image(for: UIControl.State.normal) {
258 | imgTmp = UIImage.clearImage(size: img.size, scale: img.scale)
259 | }
260 |
261 | super.setImage(imgTmp, for: UIControl.State.normal)
262 | super.setImage(imgTmp, for: UIControl.State.selected)
263 |
264 | super.setImage(imgTmp, for: state)
265 | super.imageView?.image = imgTmp
266 |
267 | } else {
268 | super.setImage(self.image(for: state), for: state)
269 | }
270 |
271 | if (self.hideTextWhenLoading) {
272 | super.setTitle(nil, for: state)
273 | super.setAttributedTitle(nil, for: state)
274 | super.titleLabel?.text = nil
275 | } else {
276 | super.setTitle(self.title(for: state) , for: state)
277 | super.titleLabel?.text = self.title(for: state)
278 | super.setAttributedTitle(self.attributedTitle(for: state), for: state)
279 | }
280 |
281 | } else {
282 | self.activityIndicatorView.stopAnimating()
283 | super.setImage(self.image(for: state), for: state)
284 | super.imageView?.image = self.image(for: state)
285 | super.setTitle(self.title(for: state), for: state)
286 | super.titleLabel?.text = self.title(for: state)
287 | super.setAttributedTitle(self.attributedTitle(for: state), for: state)
288 | }
289 |
290 | self.setNeedsLayout()
291 | self.setNeedsDisplay()
292 | }
293 |
294 | private func frameForActivityIndicator() -> CGRect {
295 |
296 | var frame:CGRect = CGRect.zero
297 | frame.size = self.activityIndicatorView.frame.size
298 | frame.origin.y = (self.frame.size.height - frame.size.height) / 2
299 |
300 | switch self.activityIndicatorAlignment {
301 |
302 | case .left:
303 | frame.origin.x += self.activityIndicatorEdgeInsets.left
304 | frame.origin.y += self.activityIndicatorEdgeInsets.top
305 |
306 | case .center:
307 | frame.origin.x = (self.frame.size.width - frame.size.width) / 2
308 |
309 | case .right:
310 | var lengthOccupied:CFloat = 0
311 | var x:CFloat = 0
312 | let imageView:UIImageView = self.imageView!
313 | let titleLabel:UILabel = self.titleLabel!
314 |
315 | //let xa = CGFloat(UInt(arc4random_uniform(UInt32(UInt(imageView.frame.size.width) * 5))))// - self.gameView.bounds.size.width * 2
316 |
317 | if (imageView.image != nil && titleLabel.text != nil) {
318 | lengthOccupied = Float(imageView.frame.size.width + titleLabel.frame.size.width)
319 |
320 | if (imageView.frame.origin.x > titleLabel.frame.origin.x) {
321 | lengthOccupied += Float(imageView.frame.origin.x)
322 | } else {
323 | lengthOccupied += Float(titleLabel.frame.origin.x)
324 | }
325 |
326 | } else if (imageView.image != nil) {
327 | lengthOccupied = Float(imageView.frame.size.width + imageView.frame.origin.x)
328 | } else if (titleLabel.text != nil) {
329 | lengthOccupied = Float(titleLabel.frame.size.width + imageView.frame.origin.x)
330 | } else if (attributedTitle(for: currentControlState()) != nil){
331 | let attributedString = attributedTitle(for: currentControlState())
332 | lengthOccupied = Float(attributedString!.size().width)
333 | }
334 |
335 | x = Float(lengthOccupied) + Float(self.activityIndicatorEdgeInsets.left)
336 | if (Float(x) + Float(frame.size.width) > Float(self.frame.size.width)) {
337 | x = Float(self.frame.size.width) - Float(frame.size.width + self.activityIndicatorEdgeInsets.right)
338 | } else if (Float(x + Float(frame.size.width)) > Float(self.frame.size.width - self.activityIndicatorEdgeInsets.right)) {
339 | x = Float(self.frame.size.width) - (Float(frame.size.width) + Float(self.activityIndicatorEdgeInsets.right))
340 | } else {
341 | // default to placing the indicator at 3/4 the buttons length, making sure it doesn't touch the button content
342 | let contentRightEdge = (lengthOccupied / 2) + (Float(self.frame.width) / 2)
343 | let threeFourthsButtonWidth = 3 * (Float(self.frame.width) / 4)
344 | x = max(contentRightEdge, threeFourthsButtonWidth)
345 | }
346 |
347 | frame.origin.x = CGFloat(x)
348 | }
349 |
350 | return frame
351 | }
352 |
353 |
354 | // MARK: - Store and recorver values
355 |
356 | /** Value in Dictionary for control State */
357 | private func getValueFrom(type: T.Type, on dic: ControlStateDictionary, for state: UIControl.State) -> T? {
358 | if let value = dic[state.rawValue] as? T {
359 | return value
360 | }
361 | return dic[UIControl.State.normal.rawValue] as? T
362 | }
363 |
364 | private func store(_ value: T?, in dic: inout ControlStateDictionary, for state: UIControl.State) {
365 | if let _value = value as AnyObject? {
366 | dic[state.rawValue] = _value
367 | } else {
368 | dic.removeValue(forKey: state.rawValue)
369 | }
370 | }
371 |
372 |
373 | // MARK: - KVO - Key-value Observer
374 |
375 | open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
376 | configureControl(for: currentControlState())
377 | }
378 | }
379 |
380 |
381 | // MARK: - Observer
382 |
383 | private extension LoadingButton {
384 |
385 | func addObservers() {
386 | self.addObserver(forKeyPath: "self.state")
387 | self.addObserver(forKeyPath: "self.selected")
388 | self.addObserver(forKeyPath: "self.highlighted")
389 | }
390 |
391 | func removeObservers() {
392 | self.removeObserver(forKeyPath: "self.state")
393 | self.removeObserver(forKeyPath: "self.selected")
394 | self.removeObserver(forKeyPath: "self.highlighted")
395 | }
396 |
397 | func addObserver(forKeyPath keyPath: String) {
398 | self.addObserver(self, forKeyPath: keyPath, options: [.initial, .new], context: nil)
399 | }
400 |
401 | func removeObserver(forKeyPath keyPath: String) {
402 | self.removeObserver(self, forKeyPath: keyPath)
403 | }
404 | }
405 |
406 |
407 | // MARK: - UIImage
408 |
409 | private extension UIImage {
410 |
411 | /// UIImage clear
412 | static func clearImage(size: CGSize, scale: CGFloat) -> UIImage {
413 | UIGraphicsBeginImageContext(size)
414 | let context:CGContext = UIGraphicsGetCurrentContext()!
415 | UIGraphicsPushContext(context)
416 | context.setFillColor(UIColor.clear.cgColor)
417 | context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
418 |
419 | UIGraphicsPopContext()
420 | guard let outputImage = UIGraphicsGetImageFromCurrentImageContext() else {
421 | return UIImage()
422 | }
423 | UIGraphicsEndImageContext()
424 |
425 | return UIImage(cgImage: outputImage.cgImage!, scale: scale, orientation: UIImage.Orientation.up)
426 | }
427 | }
428 | #endif
429 |
--------------------------------------------------------------------------------
/Example/RNLoadingButtonDemo.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 005825D41992B600003ED026 /* icon_favorito_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D01992B600003ED026 /* icon_favorito_on.png */; };
11 | 005825D51992B600003ED026 /* icon_favorito_on@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D11992B600003ED026 /* icon_favorito_on@2x.png */; };
12 | 005825D61992B600003ED026 /* icon_favorito_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D21992B600003ED026 /* icon_favorito_off.png */; };
13 | 005825D71992B600003ED026 /* icon_favorito_off@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D31992B600003ED026 /* icon_favorito_off@2x.png */; };
14 | 005825DA1992B7E7003ED026 /* icon_favorito2_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D81992B7E7003ED026 /* icon_favorito2_off.png */; };
15 | 005825DB1992B7E7003ED026 /* icon_favorito2_off@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 005825D91992B7E7003ED026 /* icon_favorito2_off@2x.png */; };
16 | 00927F25199265790095147A /* btn_background_141x36.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F23199265790095147A /* btn_background_141x36.png */; };
17 | 00927F26199265790095147A /* btn_background_141x36@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F24199265790095147A /* btn_background_141x36@2x.png */; };
18 | 00927F291992667D0095147A /* btn_background_290x36.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F271992667D0095147A /* btn_background_290x36.png */; };
19 | 00927F2A1992667D0095147A /* btn_background_290x36@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F281992667D0095147A /* btn_background_290x36@2x.png */; };
20 | 00927F2D199266CD0095147A /* bgd_button_red_136x36.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F2B199266CD0095147A /* bgd_button_red_136x36.png */; };
21 | 00927F2E199266CD0095147A /* bgd_button_red_136x36@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00927F2C199266CD0095147A /* bgd_button_red_136x36@2x.png */; };
22 | 00E70A0719927C7400D37E5D /* ViewControllerDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00E70A0519927C7400D37E5D /* ViewControllerDemo.swift */; };
23 | 00E70A0819927C7400D37E5D /* ViewControllerDemo.xib in Resources */ = {isa = PBXBuildFile; fileRef = 00E70A0619927C7400D37E5D /* ViewControllerDemo.xib */; };
24 | 9BFCD69A1BE7C139000182A4 /* LoadingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BFCD6991BE7C139000182A4 /* LoadingButton.swift */; };
25 | AC85DB50194231C200D6D8D3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC85DB4F194231C200D6D8D3 /* AppDelegate.swift */; };
26 | AC85DB52194231C200D6D8D3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AC85DB51194231C200D6D8D3 /* Images.xcassets */; };
27 | /* End PBXBuildFile section */
28 |
29 | /* Begin PBXFileReference section */
30 | 005825D01992B600003ED026 /* icon_favorito_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_favorito_on.png; sourceTree = ""; };
31 | 005825D11992B600003ED026 /* icon_favorito_on@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_favorito_on@2x.png"; sourceTree = ""; };
32 | 005825D21992B600003ED026 /* icon_favorito_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_favorito_off.png; sourceTree = ""; };
33 | 005825D31992B600003ED026 /* icon_favorito_off@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_favorito_off@2x.png"; sourceTree = ""; };
34 | 005825D81992B7E7003ED026 /* icon_favorito2_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_favorito2_off.png; sourceTree = ""; };
35 | 005825D91992B7E7003ED026 /* icon_favorito2_off@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_favorito2_off@2x.png"; sourceTree = ""; };
36 | 00927F23199265790095147A /* btn_background_141x36.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = btn_background_141x36.png; sourceTree = ""; };
37 | 00927F24199265790095147A /* btn_background_141x36@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "btn_background_141x36@2x.png"; sourceTree = ""; };
38 | 00927F271992667D0095147A /* btn_background_290x36.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = btn_background_290x36.png; sourceTree = ""; };
39 | 00927F281992667D0095147A /* btn_background_290x36@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "btn_background_290x36@2x.png"; sourceTree = ""; };
40 | 00927F2B199266CD0095147A /* bgd_button_red_136x36.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bgd_button_red_136x36.png; sourceTree = ""; };
41 | 00927F2C199266CD0095147A /* bgd_button_red_136x36@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bgd_button_red_136x36@2x.png"; sourceTree = ""; };
42 | 00E70A0519927C7400D37E5D /* ViewControllerDemo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ViewControllerDemo.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
43 | 00E70A0619927C7400D37E5D /* ViewControllerDemo.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewControllerDemo.xib; sourceTree = ""; };
44 | 9BFCD6991BE7C139000182A4 /* LoadingButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingButton.swift; sourceTree = ""; };
45 | AC85DB4A194231C200D6D8D3 /* RNLoadingButtonDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RNLoadingButtonDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
46 | AC85DB4E194231C200D6D8D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
47 | AC85DB4F194231C200D6D8D3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
48 | AC85DB51194231C200D6D8D3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
49 | /* End PBXFileReference section */
50 |
51 | /* Begin PBXFrameworksBuildPhase section */
52 | AC85DB47194231C200D6D8D3 /* Frameworks */ = {
53 | isa = PBXFrameworksBuildPhase;
54 | buildActionMask = 2147483647;
55 | files = (
56 | );
57 | runOnlyForDeploymentPostprocessing = 0;
58 | };
59 | /* End PBXFrameworksBuildPhase section */
60 |
61 | /* Begin PBXGroup section */
62 | 00927F22199265350095147A /* Imagens */ = {
63 | isa = PBXGroup;
64 | children = (
65 | 00927F23199265790095147A /* btn_background_141x36.png */,
66 | 00927F24199265790095147A /* btn_background_141x36@2x.png */,
67 | 00927F271992667D0095147A /* btn_background_290x36.png */,
68 | 00927F281992667D0095147A /* btn_background_290x36@2x.png */,
69 | 00927F2B199266CD0095147A /* bgd_button_red_136x36.png */,
70 | 00927F2C199266CD0095147A /* bgd_button_red_136x36@2x.png */,
71 | 005825D81992B7E7003ED026 /* icon_favorito2_off.png */,
72 | 005825D91992B7E7003ED026 /* icon_favorito2_off@2x.png */,
73 | 005825D01992B600003ED026 /* icon_favorito_on.png */,
74 | 005825D11992B600003ED026 /* icon_favorito_on@2x.png */,
75 | 005825D21992B600003ED026 /* icon_favorito_off.png */,
76 | 005825D31992B600003ED026 /* icon_favorito_off@2x.png */,
77 | );
78 | path = Imagens;
79 | sourceTree = "";
80 | };
81 | 9BFCD6981BE7C139000182A4 /* RNLoadingButton */ = {
82 | isa = PBXGroup;
83 | children = (
84 | 9BFCD6991BE7C139000182A4 /* LoadingButton.swift */,
85 | );
86 | name = RNLoadingButton;
87 | path = ../../Sources;
88 | sourceTree = "";
89 | };
90 | AC85DB41194231C200D6D8D3 = {
91 | isa = PBXGroup;
92 | children = (
93 | AC85DB4C194231C200D6D8D3 /* RNLoadingButtonDemo */,
94 | AC85DB4B194231C200D6D8D3 /* Products */,
95 | );
96 | sourceTree = "";
97 | };
98 | AC85DB4B194231C200D6D8D3 /* Products */ = {
99 | isa = PBXGroup;
100 | children = (
101 | AC85DB4A194231C200D6D8D3 /* RNLoadingButtonDemo.app */,
102 | );
103 | name = Products;
104 | sourceTree = "";
105 | };
106 | AC85DB4C194231C200D6D8D3 /* RNLoadingButtonDemo */ = {
107 | isa = PBXGroup;
108 | children = (
109 | 9BFCD6981BE7C139000182A4 /* RNLoadingButton */,
110 | AC85DB4F194231C200D6D8D3 /* AppDelegate.swift */,
111 | 00E70A0519927C7400D37E5D /* ViewControllerDemo.swift */,
112 | 00E70A0619927C7400D37E5D /* ViewControllerDemo.xib */,
113 | AC85DB51194231C200D6D8D3 /* Images.xcassets */,
114 | AC85DB4D194231C200D6D8D3 /* Supporting Files */,
115 | );
116 | path = RNLoadingButtonDemo;
117 | sourceTree = "";
118 | };
119 | AC85DB4D194231C200D6D8D3 /* Supporting Files */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 00927F22199265350095147A /* Imagens */,
123 | AC85DB4E194231C200D6D8D3 /* Info.plist */,
124 | );
125 | name = "Supporting Files";
126 | sourceTree = "";
127 | };
128 | /* End PBXGroup section */
129 |
130 | /* Begin PBXNativeTarget section */
131 | AC85DB49194231C200D6D8D3 /* RNLoadingButtonDemo */ = {
132 | isa = PBXNativeTarget;
133 | buildConfigurationList = AC85DB61194231C200D6D8D3 /* Build configuration list for PBXNativeTarget "RNLoadingButtonDemo" */;
134 | buildPhases = (
135 | AC85DB46194231C200D6D8D3 /* Sources */,
136 | AC85DB47194231C200D6D8D3 /* Frameworks */,
137 | AC85DB48194231C200D6D8D3 /* Resources */,
138 | );
139 | buildRules = (
140 | );
141 | dependencies = (
142 | );
143 | name = RNLoadingButtonDemo;
144 | productName = RNButtomWithLoading;
145 | productReference = AC85DB4A194231C200D6D8D3 /* RNLoadingButtonDemo.app */;
146 | productType = "com.apple.product-type.application";
147 | };
148 | /* End PBXNativeTarget section */
149 |
150 | /* Begin PBXProject section */
151 | AC85DB42194231C200D6D8D3 /* Project object */ = {
152 | isa = PBXProject;
153 | attributes = {
154 | LastSwiftMigration = 0710;
155 | LastSwiftUpdateCheck = 0710;
156 | LastUpgradeCheck = 1020;
157 | ORGANIZATIONNAME = Alexandre;
158 | TargetAttributes = {
159 | AC85DB49194231C200D6D8D3 = {
160 | CreatedOnToolsVersion = 6.0;
161 | LastSwiftMigration = 1000;
162 | };
163 | };
164 | };
165 | buildConfigurationList = AC85DB45194231C200D6D8D3 /* Build configuration list for PBXProject "RNLoadingButtonDemo" */;
166 | compatibilityVersion = "Xcode 3.2";
167 | developmentRegion = en;
168 | hasScannedForEncodings = 0;
169 | knownRegions = (
170 | en,
171 | Base,
172 | );
173 | mainGroup = AC85DB41194231C200D6D8D3;
174 | productRefGroup = AC85DB4B194231C200D6D8D3 /* Products */;
175 | projectDirPath = "";
176 | projectRoot = "";
177 | targets = (
178 | AC85DB49194231C200D6D8D3 /* RNLoadingButtonDemo */,
179 | );
180 | };
181 | /* End PBXProject section */
182 |
183 | /* Begin PBXResourcesBuildPhase section */
184 | AC85DB48194231C200D6D8D3 /* Resources */ = {
185 | isa = PBXResourcesBuildPhase;
186 | buildActionMask = 2147483647;
187 | files = (
188 | 005825D61992B600003ED026 /* icon_favorito_off.png in Resources */,
189 | 005825D51992B600003ED026 /* icon_favorito_on@2x.png in Resources */,
190 | 00927F291992667D0095147A /* btn_background_290x36.png in Resources */,
191 | 00E70A0819927C7400D37E5D /* ViewControllerDemo.xib in Resources */,
192 | 005825DA1992B7E7003ED026 /* icon_favorito2_off.png in Resources */,
193 | 005825D41992B600003ED026 /* icon_favorito_on.png in Resources */,
194 | 00927F25199265790095147A /* btn_background_141x36.png in Resources */,
195 | 00927F26199265790095147A /* btn_background_141x36@2x.png in Resources */,
196 | AC85DB52194231C200D6D8D3 /* Images.xcassets in Resources */,
197 | 005825D71992B600003ED026 /* icon_favorito_off@2x.png in Resources */,
198 | 00927F2E199266CD0095147A /* bgd_button_red_136x36@2x.png in Resources */,
199 | 005825DB1992B7E7003ED026 /* icon_favorito2_off@2x.png in Resources */,
200 | 00927F2D199266CD0095147A /* bgd_button_red_136x36.png in Resources */,
201 | 00927F2A1992667D0095147A /* btn_background_290x36@2x.png in Resources */,
202 | );
203 | runOnlyForDeploymentPostprocessing = 0;
204 | };
205 | /* End PBXResourcesBuildPhase section */
206 |
207 | /* Begin PBXSourcesBuildPhase section */
208 | AC85DB46194231C200D6D8D3 /* Sources */ = {
209 | isa = PBXSourcesBuildPhase;
210 | buildActionMask = 2147483647;
211 | files = (
212 | AC85DB50194231C200D6D8D3 /* AppDelegate.swift in Sources */,
213 | 00E70A0719927C7400D37E5D /* ViewControllerDemo.swift in Sources */,
214 | 9BFCD69A1BE7C139000182A4 /* LoadingButton.swift in Sources */,
215 | );
216 | runOnlyForDeploymentPostprocessing = 0;
217 | };
218 | /* End PBXSourcesBuildPhase section */
219 |
220 | /* Begin XCBuildConfiguration section */
221 | AC85DB5F194231C200D6D8D3 /* Debug */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | ALWAYS_SEARCH_USER_PATHS = NO;
225 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
226 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
227 | CLANG_CXX_LIBRARY = "libc++";
228 | CLANG_ENABLE_MODULES = YES;
229 | CLANG_ENABLE_OBJC_ARC = YES;
230 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
231 | CLANG_WARN_BOOL_CONVERSION = YES;
232 | CLANG_WARN_COMMA = YES;
233 | CLANG_WARN_CONSTANT_CONVERSION = YES;
234 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
235 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
236 | CLANG_WARN_EMPTY_BODY = YES;
237 | CLANG_WARN_ENUM_CONVERSION = YES;
238 | CLANG_WARN_INFINITE_RECURSION = YES;
239 | CLANG_WARN_INT_CONVERSION = YES;
240 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
241 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
242 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
244 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
245 | CLANG_WARN_STRICT_PROTOTYPES = YES;
246 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
247 | CLANG_WARN_UNREACHABLE_CODE = YES;
248 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
249 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
250 | COPY_PHASE_STRIP = NO;
251 | ENABLE_STRICT_OBJC_MSGSEND = YES;
252 | ENABLE_TESTABILITY = YES;
253 | GCC_C_LANGUAGE_STANDARD = gnu99;
254 | GCC_DYNAMIC_NO_PIC = NO;
255 | GCC_NO_COMMON_BLOCKS = YES;
256 | GCC_OPTIMIZATION_LEVEL = 0;
257 | GCC_PREPROCESSOR_DEFINITIONS = (
258 | "DEBUG=1",
259 | "$(inherited)",
260 | );
261 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
263 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
264 | GCC_WARN_UNDECLARED_SELECTOR = YES;
265 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
266 | GCC_WARN_UNUSED_FUNCTION = YES;
267 | GCC_WARN_UNUSED_VARIABLE = YES;
268 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
269 | METAL_ENABLE_DEBUG_INFO = YES;
270 | ONLY_ACTIVE_ARCH = YES;
271 | SDKROOT = iphoneos;
272 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
273 | TARGETED_DEVICE_FAMILY = "1,2";
274 | };
275 | name = Debug;
276 | };
277 | AC85DB60194231C200D6D8D3 /* Release */ = {
278 | isa = XCBuildConfiguration;
279 | buildSettings = {
280 | ALWAYS_SEARCH_USER_PATHS = NO;
281 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
282 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
283 | CLANG_CXX_LIBRARY = "libc++";
284 | CLANG_ENABLE_MODULES = YES;
285 | CLANG_ENABLE_OBJC_ARC = YES;
286 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
287 | CLANG_WARN_BOOL_CONVERSION = YES;
288 | CLANG_WARN_COMMA = YES;
289 | CLANG_WARN_CONSTANT_CONVERSION = YES;
290 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
291 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
292 | CLANG_WARN_EMPTY_BODY = YES;
293 | CLANG_WARN_ENUM_CONVERSION = YES;
294 | CLANG_WARN_INFINITE_RECURSION = YES;
295 | CLANG_WARN_INT_CONVERSION = YES;
296 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
297 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
298 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
299 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
300 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
301 | CLANG_WARN_STRICT_PROTOTYPES = YES;
302 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
303 | CLANG_WARN_UNREACHABLE_CODE = YES;
304 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
305 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
306 | COPY_PHASE_STRIP = YES;
307 | ENABLE_NS_ASSERTIONS = NO;
308 | ENABLE_STRICT_OBJC_MSGSEND = YES;
309 | GCC_C_LANGUAGE_STANDARD = gnu99;
310 | GCC_NO_COMMON_BLOCKS = YES;
311 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
312 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
313 | GCC_WARN_UNDECLARED_SELECTOR = YES;
314 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
315 | GCC_WARN_UNUSED_FUNCTION = YES;
316 | GCC_WARN_UNUSED_VARIABLE = YES;
317 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
318 | METAL_ENABLE_DEBUG_INFO = NO;
319 | SDKROOT = iphoneos;
320 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
321 | TARGETED_DEVICE_FAMILY = "1,2";
322 | VALIDATE_PRODUCT = YES;
323 | };
324 | name = Release;
325 | };
326 | AC85DB62194231C200D6D8D3 /* Debug */ = {
327 | isa = XCBuildConfiguration;
328 | buildSettings = {
329 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
330 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
331 | CLANG_ENABLE_MODULES = YES;
332 | DEVELOPMENT_TEAM = "";
333 | INFOPLIST_FILE = RNLoadingButtonDemo/Info.plist;
334 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
335 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
336 | PRODUCT_BUNDLE_IDENTIFIER = "com.romilsonnunes.${PRODUCT_NAME:rfc1034identifier}";
337 | PRODUCT_NAME = RNLoadingButtonDemo;
338 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
339 | SWIFT_VERSION = 5.0;
340 | };
341 | name = Debug;
342 | };
343 | AC85DB63194231C200D6D8D3 /* Release */ = {
344 | isa = XCBuildConfiguration;
345 | buildSettings = {
346 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
347 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
348 | CLANG_ENABLE_MODULES = YES;
349 | DEVELOPMENT_TEAM = "";
350 | INFOPLIST_FILE = RNLoadingButtonDemo/Info.plist;
351 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
352 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
353 | PRODUCT_BUNDLE_IDENTIFIER = "com.romilsonnunes.${PRODUCT_NAME:rfc1034identifier}";
354 | PRODUCT_NAME = RNLoadingButtonDemo;
355 | SWIFT_VERSION = 5.0;
356 | };
357 | name = Release;
358 | };
359 | /* End XCBuildConfiguration section */
360 |
361 | /* Begin XCConfigurationList section */
362 | AC85DB45194231C200D6D8D3 /* Build configuration list for PBXProject "RNLoadingButtonDemo" */ = {
363 | isa = XCConfigurationList;
364 | buildConfigurations = (
365 | AC85DB5F194231C200D6D8D3 /* Debug */,
366 | AC85DB60194231C200D6D8D3 /* Release */,
367 | );
368 | defaultConfigurationIsVisible = 0;
369 | defaultConfigurationName = Release;
370 | };
371 | AC85DB61194231C200D6D8D3 /* Build configuration list for PBXNativeTarget "RNLoadingButtonDemo" */ = {
372 | isa = XCConfigurationList;
373 | buildConfigurations = (
374 | AC85DB62194231C200D6D8D3 /* Debug */,
375 | AC85DB63194231C200D6D8D3 /* Release */,
376 | );
377 | defaultConfigurationIsVisible = 0;
378 | defaultConfigurationName = Release;
379 | };
380 | /* End XCConfigurationList section */
381 | };
382 | rootObject = AC85DB42194231C200D6D8D3 /* Project object */;
383 | }
384 |
--------------------------------------------------------------------------------