├── 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 | ![](https://github.com/souzainf3/RNLoadingButton-Swift/blob/master/Example/Screens/screen1.png) 13 | ![](https://github.com/souzainf3/RNLoadingButton-Swift/blob/master/Example/Screens/screen2.png) 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 | --------------------------------------------------------------------------------