├── ActivityIndicatorViewExample ├── ActivityIndicatorViewExample │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── ActivityIndicatorViewExampleApp.swift │ └── ContentView.swift └── ActivityIndicatorViewExample.xcodeproj │ └── project.pbxproj ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── Package.swift ├── Sources └── ActivityIndicatorView │ ├── ActivityIndicatorView.h │ ├── Info.plist │ ├── Indicators │ ├── GrowingCircleIndicatorView.swift │ ├── GradientIndicatorView.swift │ ├── EqualizerIndicatorView.swift │ ├── ScalingDotsIndicatorView.swift │ ├── RotatingDotsIndicatorView.swift │ ├── OpacityDotsIndicatorView.swift │ ├── DefaultIndicatorView.swift │ ├── FlickeringDotsIndicatorView.swift │ ├── ArcsIndicatorView.swift │ └── GrowingArcIndicatorView.swift │ └── ActivityIndicatorView.swift ├── LICENSE ├── .gitignore └── README.md /ActivityIndicatorViewExample/ActivityIndicatorViewExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample/ActivityIndicatorViewExampleApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityIndicatorViewExampleApp.swift 3 | // ActivityIndicatorViewExample 4 | // 5 | // Created by Alisa Mylnikova on 25.03.2025. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct ActivityIndicatorViewExampleApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.9 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "ActivityIndicatorView", 7 | platforms: [ 8 | .macOS(.v10_15), 9 | .iOS(.v13), 10 | .watchOS(.v6), 11 | .tvOS(.v13) 12 | ], 13 | products: [ 14 | .library( 15 | name: "ActivityIndicatorView", 16 | targets: ["ActivityIndicatorView"] 17 | ) 18 | ], 19 | targets: [ 20 | .target( 21 | name: "ActivityIndicatorView", 22 | swiftSettings: [ 23 | .enableExperimentalFeature("StrictConcurrency") 24 | ] 25 | ) 26 | ] 27 | ) 28 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/ActivityIndicatorView.h: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityIndicatorView.h 3 | // ActivityIndicatorView 4 | // 5 | // Created by Alisa Mylnikova on 20/03/2020. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ActivityIndicatorView. 12 | FOUNDATION_EXPORT double ActivityIndicatorViewVersionNumber; 13 | 14 | //! Project version string for ActivityIndicatorView. 15 | FOUNDATION_EXPORT const unsigned char ActivityIndicatorViewVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | }, 8 | { 9 | "appearances" : [ 10 | { 11 | "appearance" : "luminosity", 12 | "value" : "dark" 13 | } 14 | ], 15 | "idiom" : "universal", 16 | "platform" : "ios", 17 | "size" : "1024x1024" 18 | }, 19 | { 20 | "appearances" : [ 21 | { 22 | "appearance" : "luminosity", 23 | "value" : "tinted" 24 | } 25 | ], 26 | "idiom" : "universal", 27 | "platform" : "ios", 28 | "size" : "1024x1024" 29 | } 30 | ], 31 | "info" : { 32 | "author" : "xcode", 33 | "version" : 1 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/Indicators/GrowingCircleIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GrowingCircleIndicatorView.swift 3 | // ActivityIndicatorView 4 | // 5 | // Created by Daniil Manin on 10/7/20. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct GrowingCircleIndicatorView: View { 12 | 13 | @State private var scale: CGFloat = 0 14 | @State private var opacity: Double = 0 15 | 16 | var body: some View { 17 | let animation = Animation 18 | .easeIn(duration: 1.1) 19 | .repeatForever(autoreverses: false) 20 | 21 | return Circle() 22 | .scaleEffect(scale) 23 | .opacity(opacity) 24 | .onAppear { 25 | scale = 0 26 | opacity = 1 27 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 28 | withAnimation(animation) { 29 | scale = 1 30 | opacity = 0 31 | } 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 exyte 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/Indicators/GradientIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientIndicatorView.swift 3 | // ActivityIndicatorView 4 | // 5 | // Created by Daniil Manin on 10/7/20. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct GradientIndicatorView: View { 12 | 13 | let colors: [Color] 14 | let lineCap: CGLineCap 15 | let lineWidth: CGFloat 16 | 17 | @State private var rotation: Double = 0 18 | 19 | var body: some View { 20 | let gradientColors = Gradient(colors: colors) 21 | let conic = AngularGradient(gradient: gradientColors, center: .center, startAngle: .zero, endAngle: .degrees(360)) 22 | 23 | let animation = Animation 24 | .linear(duration: 1.5) 25 | .repeatForever(autoreverses: false) 26 | 27 | return ZStack { 28 | Circle() 29 | .stroke(colors.first ?? .white, lineWidth: lineWidth) 30 | 31 | Circle() 32 | .trim(from: lineWidth / 500, to: 1 - lineWidth / 100) 33 | .stroke(conic, style: StrokeStyle(lineWidth: lineWidth, lineCap: lineCap)) 34 | .rotationEffect(.degrees(rotation)) 35 | .onAppear { 36 | rotation = 0 37 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 38 | withAnimation(animation) { 39 | rotation = 360 40 | } 41 | } 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/Indicators/EqualizerIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EqualizerIndicatorView.swift 3 | // ActivityIndicatorView 4 | // 5 | // Created by Daniil Manin on 10/7/20. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct EqualizerIndicatorView: View { 12 | 13 | let count: Int 14 | 15 | var body: some View { 16 | GeometryReader { geometry in 17 | ForEach(0.. Path in 41 | var p = Path() 42 | p.addArc(center: CGPoint(x: size.width / 2, y: size.height / 2), 43 | radius: size.width / 2 - CGFloat(index) * CGFloat(count), 44 | startAngle: .degrees(0), 45 | endAngle: .degrees(Double(Int.random(in: 120...300))), 46 | clockwise: true) 47 | return p.strokedPath(.init(lineWidth: lineWidth)) 48 | } 49 | .frame(width: size.width, height: size.height) 50 | .rotationEffect(.degrees(rotation)) 51 | .onAppear { 52 | rotation = 0 53 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 54 | withAnimation(animation) { 55 | rotation = 360 56 | } 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/Indicators/GrowingArcIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GrowingArcIndicatorView.swift 3 | // ActivityIndicatorView 4 | // 5 | // Created by Daniil Manin on 10/7/20. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct GrowingArcIndicatorView: View { 12 | 13 | let color: Color 14 | let lineWidth: CGFloat 15 | 16 | @State private var animatableParameter: Double = 0 17 | 18 | public var body: some View { 19 | let animation = Animation 20 | .easeIn(duration: 2) 21 | .repeatForever(autoreverses: false) 22 | 23 | return GrowingArc(p: animatableParameter) 24 | .stroke(color, lineWidth: lineWidth) 25 | .onAppear { 26 | animatableParameter = 0 27 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 28 | withAnimation(animation) { 29 | animatableParameter = 1 30 | } 31 | } 32 | } 33 | } 34 | } 35 | 36 | struct GrowingArc: Shape { 37 | 38 | var maxLength = 2 * Double.pi - 0.7 39 | var lag = 0.35 40 | var p: Double 41 | 42 | var animatableData: Double { 43 | get { return p } 44 | set { p = newValue } 45 | } 46 | 47 | func path(in rect: CGRect) -> Path { 48 | 49 | let h = p * 2 50 | var length = h * maxLength 51 | if h > 1 && h < lag + 1 { 52 | length = maxLength 53 | } 54 | if h > lag + 1 { 55 | let coeff = 1 / (1 - lag) 56 | let n = h - 1 - lag 57 | length = (1 - n * coeff) * maxLength 58 | } 59 | 60 | let first = Double.pi / 2 61 | let second = 4 * Double.pi - first 62 | 63 | var end = h * first 64 | if h > 1 { 65 | end = first + (h - 1) * second 66 | } 67 | 68 | let start = end + length 69 | 70 | var p = Path() 71 | p.addArc(center: CGPoint(x: rect.size.width/2, y: rect.size.width/2), 72 | radius: rect.size.width/2, 73 | startAngle: Angle(radians: start), 74 | endAngle: Angle(radians: end), 75 | clockwise: true) 76 | return p 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /Sources/ActivityIndicatorView/ActivityIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityIndicatorView.swift 3 | // ActivityIndicatorView 4 | // 5 | // Created by Alisa Mylnikova on 20/03/2020. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | public struct ActivityIndicatorView: View { 12 | 13 | public enum IndicatorType { 14 | case `default`(count: Int = 8) 15 | case arcs(count: Int = 3, lineWidth: CGFloat = 2) 16 | case rotatingDots(count: Int = 5) 17 | case flickeringDots(count: Int = 8) 18 | case scalingDots(count: Int = 3, inset: Int = 2) 19 | case opacityDots(count: Int = 3, inset: Int = 4) 20 | case equalizer(count: Int = 5) 21 | case growingArc(Color = .black, lineWidth: CGFloat = 4) 22 | case growingCircle 23 | case gradient(_ colors: [Color], CGLineCap = .butt, lineWidth: CGFloat = 4) 24 | } 25 | 26 | @Binding var isVisible: Bool 27 | var type: IndicatorType 28 | 29 | public init(isVisible: Binding, type: IndicatorType) { 30 | _isVisible = isVisible 31 | self.type = type 32 | } 33 | 34 | public var body: some View { 35 | if isVisible { 36 | indicator 37 | } else { 38 | EmptyView() 39 | } 40 | } 41 | 42 | // MARK: - Private 43 | 44 | private var indicator: some View { 45 | ZStack { 46 | switch type { 47 | case .default(let count): 48 | DefaultIndicatorView(count: count) 49 | case .arcs(let count, let lineWidth): 50 | ArcsIndicatorView(count: count, lineWidth: lineWidth) 51 | case .rotatingDots(let count): 52 | RotatingDotsIndicatorView(count: count) 53 | case .flickeringDots(let count): 54 | FlickeringDotsIndicatorView(count: count) 55 | case .scalingDots(let count, let inset): 56 | ScalingDotsIndicatorView(count: count, inset: inset) 57 | case .opacityDots(let count, let inset): 58 | OpacityDotsIndicatorView(count: count, inset: inset) 59 | case .equalizer(let count): 60 | EqualizerIndicatorView(count: count) 61 | case .growingArc(let color, let lineWidth): 62 | GrowingArcIndicatorView(color: color, lineWidth: lineWidth) 63 | case .growingCircle: 64 | GrowingCircleIndicatorView() 65 | case .gradient(let colors, let lineCap, let lineWidth): 66 | GradientIndicatorView(colors: colors, lineCap: lineCap, lineWidth: lineWidth) 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Example 4 | // 5 | // Created by Alisa Mylnikova on 20/03/2020. 6 | // Copyright © 2020 Exyte. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import ActivityIndicatorView 11 | 12 | struct ContentView: View { 13 | 14 | @State private var showLoadingIndicator: Bool = true 15 | 16 | var body: some View { 17 | GeometryReader { geometry in 18 | let size = geometry.size.width / 5 19 | let spacing: CGFloat = 40.0 20 | 21 | VStack { 22 | HStack { 23 | Spacer() 24 | VStack(spacing: spacing) { 25 | Spacer() 26 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .default()) 27 | .frame(width: size, height: size) 28 | .foregroundColor(.red) 29 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .arcs()) 30 | .frame(width: size, height: size) 31 | .foregroundColor(.red) 32 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .rotatingDots()) 33 | .frame(width: size, height: size) 34 | .foregroundColor(.red) 35 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .equalizer()) 36 | .frame(width: size, height: size) 37 | .foregroundColor(.red) 38 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .growingArc(.red)) 39 | .frame(width: size, height: size) 40 | .foregroundColor(.red) 41 | Spacer() 42 | } 43 | 44 | Spacer() 45 | 46 | VStack(spacing: spacing) { 47 | Spacer() 48 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .opacityDots()) 49 | .frame(width: size, height: size) 50 | .foregroundColor(.red) 51 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .scalingDots()) 52 | .frame(width: size, height: size) 53 | .foregroundColor(.red) 54 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .gradient([Color.white, Color.red])) 55 | .frame(width: size, height: size) 56 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .growingCircle) 57 | .frame(width: size, height: size) 58 | .foregroundColor(.red) 59 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .flickeringDots()) 60 | .frame(width: size, height: size) 61 | .foregroundColor(.red) 62 | Spacer() 63 | } 64 | Spacer() 65 | } 66 | } 67 | } 68 | } 69 | } 70 | 71 | struct ContentView_Previews: PreviewProvider { 72 | static var previews: some View { 73 | ContentView() 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/swift,macos,carthage,cocoapods 3 | # Edit at https://www.gitignore.io/?templates=swift,macos,carthage,cocoapods 4 | 5 | ### Carthage ### 6 | # Carthage 7 | # 8 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 9 | # Carthage/Checkouts 10 | 11 | Carthage/Build 12 | 13 | ### CocoaPods ### 14 | ## CocoaPods GitIgnore Template 15 | 16 | # CocoaPods - Only use to conserve bandwidth / Save time on Pushing 17 | # - Also handy if you have a large number of dependant pods 18 | # - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE 19 | Pods/ 20 | 21 | ### macOS ### 22 | # General 23 | .DS_Store 24 | .AppleDouble 25 | .LSOverride 26 | 27 | # Icon must end with two \r 28 | Icon 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Swift ### 50 | # Xcode 51 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 52 | 53 | ## Build generated 54 | build/ 55 | DerivedData/ 56 | 57 | ## Various settings 58 | *.pbxuser 59 | !default.pbxuser 60 | *.mode1v3 61 | !default.mode1v3 62 | *.mode2v3 63 | !default.mode2v3 64 | *.perspectivev3 65 | !default.perspectivev3 66 | xcuserdata/ 67 | 68 | ## Other 69 | *.moved-aside 70 | *.xccheckout 71 | *.xcscmblueprint 72 | 73 | ## Obj-C/Swift specific 74 | *.hmap 75 | *.ipa 76 | *.dSYM.zip 77 | *.dSYM 78 | 79 | ## Playgrounds 80 | timeline.xctimeline 81 | playground.xcworkspace 82 | 83 | # Swift Package Manager 84 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 85 | # Packages/ 86 | # Package.pins 87 | # Package.resolved 88 | .build/ 89 | # Add this line if you want to avoid checking in Xcode SPM integration. 90 | # .swiftpm/xcode 91 | 92 | # CocoaPods 93 | # We recommend against adding the Pods directory to your .gitignore. However 94 | # you should judge for yourself, the pros and cons are mentioned at: 95 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 96 | # Pods/ 97 | # Add this line if you want to avoid checking in source code from the Xcode workspace 98 | # *.xcworkspace 99 | 100 | # Carthage 101 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 102 | # Carthage/Checkouts 103 | 104 | 105 | # Accio dependency management 106 | Dependencies/ 107 | .accio/ 108 | 109 | # fastlane 110 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 111 | # screenshots whenever they are needed. 112 | # For more information about the recommended setup visit: 113 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 114 | 115 | fastlane/report.xml 116 | fastlane/Preview.html 117 | fastlane/screenshots/**/*.png 118 | fastlane/test_output 119 | 120 | # Code Injection 121 | # After new code Injection tools there's a generated folder /iOSInjectionProject 122 | # https://github.com/johnno1962/injectionforxcode 123 | 124 | iOSInjectionProject/ 125 | 126 | # End of https://www.gitignore.io/api/swift,macos,carthage,cocoapods 127 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |       4 | 5 | 6 | 7 | 8 |

ActivityIndicatorView

9 | 10 |

A number of preset loading indicators created with SwiftUI

11 | 12 | ![](https://img.shields.io/github/v/tag/exyte/ActivityIndicatorView?label=Version) 13 | [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fexyte%2FActivityIndicatorView%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/exyte/ActivityIndicatorView) 14 | [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fexyte%2FActivityIndicatorView%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/exyte/ActivityIndicatorView) 15 | [![SPM](https://img.shields.io/badge/SPM-Compatible-brightgreen.svg)](https://swiftpackageindex.com/exyte/ActivityIndicatorView) 16 | [![Cocoapods](https://img.shields.io/badge/Cocoapods-Deprecated%20after%201.1.1-yellow.svg)](https://cocoapods.org/pods/ActivityIndicatorView) 17 | [![License: MIT](https://img.shields.io/badge/License-MIT-black.svg)](https://opensource.org/licenses/MIT) 18 | 19 | # Usage 20 | 21 | Create an indicator like this: 22 | ```swift 23 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .default) 24 | ``` 25 | where 26 | `showLoadingIndicator` - bool value you may change to display or hide the indicator 27 | `type` - value from `ActivityIndicatorView.IndicatorType` enum 28 | 29 | You may alter it with standard SwiftUI means like this: 30 | ```swift 31 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .default) 32 | .frame(width: 50.0, height: 50.0) 33 | .foregroundColor(.red) 34 | ``` 35 | Or specify another indicator type: 36 | 37 | ```swift 38 | ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .growingArc(.red, lineWidth: 4)) 39 | .frame(width: 50.0, height: 50.0) 40 | ``` 41 | 42 | ### Indicator types 43 | Each indicator type has a number of parameters that have reasonable defaults. You can change them as you see fit, but it is advised to not set them too high or too low. 44 | 45 | `default` - iOS UIActivityIndicator style 46 | ```swift 47 | .default(count: 8) 48 | ``` 49 | `arcs` 50 | ```swift 51 | .arcs(count: 3, lineWidth: 2) 52 | ``` 53 | `rotatingDots` 54 | ```swift 55 | .rotatingDots(count: 5) 56 | ``` 57 | `flickeringDots` 58 | ```swift 59 | .flickeringDots(count: 8) 60 | ``` 61 | `scalingDots` 62 | ```swift 63 | .scalingDots(count: 3, inset: 2) 64 | ``` 65 | `opacityDots` 66 | ```swift 67 | .opacityDots(count: 3, inset: 4) 68 | ``` 69 | `equalizer` 70 | ```swift 71 | .equalizer(count: 5) 72 | ``` 73 | `growingArc` - add custom color for growing Arc, the default value is `Color.black` 74 | ```swift 75 | .growingArc(.red, lineWidth: 4) 76 | ``` 77 | `growingCircle` - no parameters 78 | `gradient` - circle with angular gradient border stroke, pass colors like this: 79 | ```swift 80 | .gradient([.white, .red], lineWidth: 4) 81 | ``` 82 | 83 | ## Examples 84 | 85 | To try ActivityIndicatorView examples: 86 | - Clone the repo `https://github.com/exyte/ActivityIndicatorView.git` 87 | - Open `ActivityIndicatorViewExample.xcodeproj` 88 | - Try it! 89 | 90 | ## Installation 91 | 92 | ### [Swift Package Manager](https://swift.org/package-manager/) 93 | 94 | ```swift 95 | dependencies: [ 96 | .package(url: "https://github.com/exyte/ActivityIndicatorView.git") 97 | ] 98 | ``` 99 | 100 | ## Requirements 101 | 102 | * iOS 13+ / watchOS 6+ / tvOS 13+ / macOS 10.15+ 103 | * Xcode 11+ 104 | 105 | ## Our other open source SwiftUI libraries 106 | [PopupView](https://github.com/exyte/PopupView) - Toasts and popups library 107 | [AnchoredPopup](https://github.com/exyte/AnchoredPopup) - Anchored Popup grows "out" of a trigger view (similar to Hero animation) 108 | [Grid](https://github.com/exyte/Grid) - The most powerful Grid container 109 | [ScalingHeaderScrollView](https://github.com/exyte/ScalingHeaderScrollView) - A scroll view with a sticky header which shrinks as you scroll 110 | [AnimatedTabBar](https://github.com/exyte/AnimatedTabBar) - A tabbar with a number of preset animations 111 | [MediaPicker](https://github.com/exyte/mediapicker) - Customizable media picker 112 | [Chat](https://github.com/exyte/chat) - Chat UI framework with fully customizable message cells, input view, and a built-in media picker 113 | [OpenAI](https://github.com/exyte/OpenAI) Wrapper lib for [OpenAI REST API](https://platform.openai.com/docs/api-reference/introduction) 114 | [AnimatedGradient](https://github.com/exyte/AnimatedGradient) - Animated linear gradient 115 | [ConcentricOnboarding](https://github.com/exyte/ConcentricOnboarding) - Animated onboarding flow 116 | [FloatingButton](https://github.com/exyte/FloatingButton) - Floating button menu 117 | [ProgressIndicatorView](https://github.com/exyte/ProgressIndicatorView) - A number of animated progress indicators 118 | [FlagAndCountryCode](https://github.com/exyte/FlagAndCountryCode) - Phone codes and flags for every country 119 | [SVGView](https://github.com/exyte/SVGView) - SVG parser 120 | [LiquidSwipe](https://github.com/exyte/LiquidSwipe) - Liquid navigation animation 121 | 122 | -------------------------------------------------------------------------------- /ActivityIndicatorViewExample/ActivityIndicatorViewExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 77; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5B4D04F52D92F93B005262A1 /* ActivityIndicatorView in Frameworks */ = {isa = PBXBuildFile; productRef = 5B4D04F42D92F93B005262A1 /* ActivityIndicatorView */; }; 11 | 5B4DBAC42D92EC070067A006 /* ActivityIndicatorView in Frameworks */ = {isa = PBXBuildFile; productRef = 5B4DBAC32D92EC070067A006 /* ActivityIndicatorView */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXFileReference section */ 15 | 5B4DBAB02D92EB130067A006 /* ActivityIndicatorViewExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ActivityIndicatorViewExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 16 | /* End PBXFileReference section */ 17 | 18 | /* Begin PBXFileSystemSynchronizedRootGroup section */ 19 | 5B4DBAB22D92EB130067A006 /* ActivityIndicatorViewExample */ = { 20 | isa = PBXFileSystemSynchronizedRootGroup; 21 | path = ActivityIndicatorViewExample; 22 | sourceTree = ""; 23 | }; 24 | /* End PBXFileSystemSynchronizedRootGroup section */ 25 | 26 | /* Begin PBXFrameworksBuildPhase section */ 27 | 5B4DBAAD2D92EB130067A006 /* Frameworks */ = { 28 | isa = PBXFrameworksBuildPhase; 29 | buildActionMask = 2147483647; 30 | files = ( 31 | 5B4D04F52D92F93B005262A1 /* ActivityIndicatorView in Frameworks */, 32 | 5B4DBAC42D92EC070067A006 /* ActivityIndicatorView in Frameworks */, 33 | ); 34 | runOnlyForDeploymentPostprocessing = 0; 35 | }; 36 | /* End PBXFrameworksBuildPhase section */ 37 | 38 | /* Begin PBXGroup section */ 39 | 5B4DBAA72D92EB130067A006 = { 40 | isa = PBXGroup; 41 | children = ( 42 | 5B4DBAB22D92EB130067A006 /* ActivityIndicatorViewExample */, 43 | 5B4DBAC22D92EC070067A006 /* Frameworks */, 44 | 5B4DBAB12D92EB130067A006 /* Products */, 45 | ); 46 | sourceTree = ""; 47 | }; 48 | 5B4DBAB12D92EB130067A006 /* Products */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | 5B4DBAB02D92EB130067A006 /* ActivityIndicatorViewExample.app */, 52 | ); 53 | name = Products; 54 | sourceTree = ""; 55 | }; 56 | 5B4DBAC22D92EC070067A006 /* Frameworks */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | ); 60 | name = Frameworks; 61 | sourceTree = ""; 62 | }; 63 | /* End PBXGroup section */ 64 | 65 | /* Begin PBXNativeTarget section */ 66 | 5B4DBAAF2D92EB130067A006 /* ActivityIndicatorViewExample */ = { 67 | isa = PBXNativeTarget; 68 | buildConfigurationList = 5B4DBABE2D92EB140067A006 /* Build configuration list for PBXNativeTarget "ActivityIndicatorViewExample" */; 69 | buildPhases = ( 70 | 5B4DBAAC2D92EB130067A006 /* Sources */, 71 | 5B4DBAAD2D92EB130067A006 /* Frameworks */, 72 | 5B4DBAAE2D92EB130067A006 /* Resources */, 73 | ); 74 | buildRules = ( 75 | ); 76 | dependencies = ( 77 | ); 78 | fileSystemSynchronizedGroups = ( 79 | 5B4DBAB22D92EB130067A006 /* ActivityIndicatorViewExample */, 80 | ); 81 | name = ActivityIndicatorViewExample; 82 | packageProductDependencies = ( 83 | 5B4DBAC32D92EC070067A006 /* ActivityIndicatorView */, 84 | 5B4D04F42D92F93B005262A1 /* ActivityIndicatorView */, 85 | ); 86 | productName = ActivityIndicatorViewExample; 87 | productReference = 5B4DBAB02D92EB130067A006 /* ActivityIndicatorViewExample.app */; 88 | productType = "com.apple.product-type.application"; 89 | }; 90 | /* End PBXNativeTarget section */ 91 | 92 | /* Begin PBXProject section */ 93 | 5B4DBAA82D92EB130067A006 /* Project object */ = { 94 | isa = PBXProject; 95 | attributes = { 96 | BuildIndependentTargetsInParallel = 1; 97 | LastSwiftUpdateCheck = 1620; 98 | LastUpgradeCheck = 1620; 99 | TargetAttributes = { 100 | 5B4DBAAF2D92EB130067A006 = { 101 | CreatedOnToolsVersion = 16.2; 102 | }; 103 | }; 104 | }; 105 | buildConfigurationList = 5B4DBAAB2D92EB130067A006 /* Build configuration list for PBXProject "ActivityIndicatorViewExample" */; 106 | developmentRegion = en; 107 | hasScannedForEncodings = 0; 108 | knownRegions = ( 109 | en, 110 | Base, 111 | ); 112 | mainGroup = 5B4DBAA72D92EB130067A006; 113 | minimizedProjectReferenceProxies = 1; 114 | packageReferences = ( 115 | 5B4D04F32D92F93B005262A1 /* XCLocalSwiftPackageReference "../../ActivityIndicatorView" */, 116 | ); 117 | preferredProjectObjectVersion = 77; 118 | productRefGroup = 5B4DBAB12D92EB130067A006 /* Products */; 119 | projectDirPath = ""; 120 | projectRoot = ""; 121 | targets = ( 122 | 5B4DBAAF2D92EB130067A006 /* ActivityIndicatorViewExample */, 123 | ); 124 | }; 125 | /* End PBXProject section */ 126 | 127 | /* Begin PBXResourcesBuildPhase section */ 128 | 5B4DBAAE2D92EB130067A006 /* Resources */ = { 129 | isa = PBXResourcesBuildPhase; 130 | buildActionMask = 2147483647; 131 | files = ( 132 | ); 133 | runOnlyForDeploymentPostprocessing = 0; 134 | }; 135 | /* End PBXResourcesBuildPhase section */ 136 | 137 | /* Begin PBXSourcesBuildPhase section */ 138 | 5B4DBAAC2D92EB130067A006 /* Sources */ = { 139 | isa = PBXSourcesBuildPhase; 140 | buildActionMask = 2147483647; 141 | files = ( 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | /* End PBXSourcesBuildPhase section */ 146 | 147 | /* Begin XCBuildConfiguration section */ 148 | 5B4DBABC2D92EB140067A006 /* Debug */ = { 149 | isa = XCBuildConfiguration; 150 | buildSettings = { 151 | ALWAYS_SEARCH_USER_PATHS = NO; 152 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 153 | CLANG_ANALYZER_NONNULL = YES; 154 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 155 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 156 | CLANG_ENABLE_MODULES = YES; 157 | CLANG_ENABLE_OBJC_ARC = YES; 158 | CLANG_ENABLE_OBJC_WEAK = YES; 159 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 160 | CLANG_WARN_BOOL_CONVERSION = YES; 161 | CLANG_WARN_COMMA = YES; 162 | CLANG_WARN_CONSTANT_CONVERSION = YES; 163 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 164 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 165 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 166 | CLANG_WARN_EMPTY_BODY = YES; 167 | CLANG_WARN_ENUM_CONVERSION = YES; 168 | CLANG_WARN_INFINITE_RECURSION = YES; 169 | CLANG_WARN_INT_CONVERSION = YES; 170 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 171 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 172 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 173 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 174 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 175 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 176 | CLANG_WARN_STRICT_PROTOTYPES = YES; 177 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 178 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 179 | CLANG_WARN_UNREACHABLE_CODE = YES; 180 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 181 | COPY_PHASE_STRIP = NO; 182 | DEBUG_INFORMATION_FORMAT = dwarf; 183 | ENABLE_STRICT_OBJC_MSGSEND = YES; 184 | ENABLE_TESTABILITY = YES; 185 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 186 | GCC_C_LANGUAGE_STANDARD = gnu17; 187 | GCC_DYNAMIC_NO_PIC = NO; 188 | GCC_NO_COMMON_BLOCKS = YES; 189 | GCC_OPTIMIZATION_LEVEL = 0; 190 | GCC_PREPROCESSOR_DEFINITIONS = ( 191 | "DEBUG=1", 192 | "$(inherited)", 193 | ); 194 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 195 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 196 | GCC_WARN_UNDECLARED_SELECTOR = YES; 197 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 198 | GCC_WARN_UNUSED_FUNCTION = YES; 199 | GCC_WARN_UNUSED_VARIABLE = YES; 200 | IPHONEOS_DEPLOYMENT_TARGET = 18.2; 201 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 202 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 203 | MTL_FAST_MATH = YES; 204 | ONLY_ACTIVE_ARCH = YES; 205 | SDKROOT = iphoneos; 206 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 207 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 208 | SWIFT_VERSION = 6.0; 209 | }; 210 | name = Debug; 211 | }; 212 | 5B4DBABD2D92EB140067A006 /* Release */ = { 213 | isa = XCBuildConfiguration; 214 | buildSettings = { 215 | ALWAYS_SEARCH_USER_PATHS = NO; 216 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 217 | CLANG_ANALYZER_NONNULL = YES; 218 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 219 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 220 | CLANG_ENABLE_MODULES = YES; 221 | CLANG_ENABLE_OBJC_ARC = YES; 222 | CLANG_ENABLE_OBJC_WEAK = YES; 223 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 224 | CLANG_WARN_BOOL_CONVERSION = YES; 225 | CLANG_WARN_COMMA = YES; 226 | CLANG_WARN_CONSTANT_CONVERSION = YES; 227 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 228 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 229 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 230 | CLANG_WARN_EMPTY_BODY = YES; 231 | CLANG_WARN_ENUM_CONVERSION = YES; 232 | CLANG_WARN_INFINITE_RECURSION = YES; 233 | CLANG_WARN_INT_CONVERSION = YES; 234 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 235 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 236 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 237 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 238 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 239 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 240 | CLANG_WARN_STRICT_PROTOTYPES = YES; 241 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 242 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 243 | CLANG_WARN_UNREACHABLE_CODE = YES; 244 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 245 | COPY_PHASE_STRIP = NO; 246 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 247 | ENABLE_NS_ASSERTIONS = NO; 248 | ENABLE_STRICT_OBJC_MSGSEND = YES; 249 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 250 | GCC_C_LANGUAGE_STANDARD = gnu17; 251 | GCC_NO_COMMON_BLOCKS = YES; 252 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 253 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 254 | GCC_WARN_UNDECLARED_SELECTOR = YES; 255 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 256 | GCC_WARN_UNUSED_FUNCTION = YES; 257 | GCC_WARN_UNUSED_VARIABLE = YES; 258 | IPHONEOS_DEPLOYMENT_TARGET = 18.2; 259 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 260 | MTL_ENABLE_DEBUG_INFO = NO; 261 | MTL_FAST_MATH = YES; 262 | SDKROOT = iphoneos; 263 | SWIFT_COMPILATION_MODE = wholemodule; 264 | SWIFT_VERSION = 6.0; 265 | VALIDATE_PRODUCT = YES; 266 | }; 267 | name = Release; 268 | }; 269 | 5B4DBABF2D92EB140067A006 /* Debug */ = { 270 | isa = XCBuildConfiguration; 271 | buildSettings = { 272 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 273 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 274 | CODE_SIGN_STYLE = Automatic; 275 | CURRENT_PROJECT_VERSION = 1; 276 | DEVELOPMENT_ASSET_PATHS = "\"ActivityIndicatorViewExample/Preview Content\""; 277 | DEVELOPMENT_TEAM = FZXCM5CJ7P; 278 | ENABLE_PREVIEWS = YES; 279 | GENERATE_INFOPLIST_FILE = YES; 280 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 281 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 282 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 283 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 284 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 285 | LD_RUNPATH_SEARCH_PATHS = ( 286 | "$(inherited)", 287 | "@executable_path/Frameworks", 288 | ); 289 | MARKETING_VERSION = 1.0; 290 | PRODUCT_BUNDLE_IDENTIFIER = com.exyte.ActivityIndicatorViewExample; 291 | PRODUCT_NAME = "$(TARGET_NAME)"; 292 | SWIFT_EMIT_LOC_STRINGS = YES; 293 | SWIFT_VERSION = 6.0; 294 | TARGETED_DEVICE_FAMILY = "1,2"; 295 | }; 296 | name = Debug; 297 | }; 298 | 5B4DBAC02D92EB140067A006 /* Release */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 302 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 303 | CODE_SIGN_STYLE = Automatic; 304 | CURRENT_PROJECT_VERSION = 1; 305 | DEVELOPMENT_ASSET_PATHS = "\"ActivityIndicatorViewExample/Preview Content\""; 306 | DEVELOPMENT_TEAM = FZXCM5CJ7P; 307 | ENABLE_PREVIEWS = YES; 308 | GENERATE_INFOPLIST_FILE = YES; 309 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 310 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 311 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 312 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 313 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 314 | LD_RUNPATH_SEARCH_PATHS = ( 315 | "$(inherited)", 316 | "@executable_path/Frameworks", 317 | ); 318 | MARKETING_VERSION = 1.0; 319 | PRODUCT_BUNDLE_IDENTIFIER = com.exyte.ActivityIndicatorViewExample; 320 | PRODUCT_NAME = "$(TARGET_NAME)"; 321 | SWIFT_EMIT_LOC_STRINGS = YES; 322 | SWIFT_VERSION = 6.0; 323 | TARGETED_DEVICE_FAMILY = "1,2"; 324 | }; 325 | name = Release; 326 | }; 327 | /* End XCBuildConfiguration section */ 328 | 329 | /* Begin XCConfigurationList section */ 330 | 5B4DBAAB2D92EB130067A006 /* Build configuration list for PBXProject "ActivityIndicatorViewExample" */ = { 331 | isa = XCConfigurationList; 332 | buildConfigurations = ( 333 | 5B4DBABC2D92EB140067A006 /* Debug */, 334 | 5B4DBABD2D92EB140067A006 /* Release */, 335 | ); 336 | defaultConfigurationIsVisible = 0; 337 | defaultConfigurationName = Release; 338 | }; 339 | 5B4DBABE2D92EB140067A006 /* Build configuration list for PBXNativeTarget "ActivityIndicatorViewExample" */ = { 340 | isa = XCConfigurationList; 341 | buildConfigurations = ( 342 | 5B4DBABF2D92EB140067A006 /* Debug */, 343 | 5B4DBAC02D92EB140067A006 /* Release */, 344 | ); 345 | defaultConfigurationIsVisible = 0; 346 | defaultConfigurationName = Release; 347 | }; 348 | /* End XCConfigurationList section */ 349 | 350 | /* Begin XCLocalSwiftPackageReference section */ 351 | 5B4D04F32D92F93B005262A1 /* XCLocalSwiftPackageReference "../../ActivityIndicatorView" */ = { 352 | isa = XCLocalSwiftPackageReference; 353 | relativePath = ../../ActivityIndicatorView; 354 | }; 355 | /* End XCLocalSwiftPackageReference section */ 356 | 357 | /* Begin XCSwiftPackageProductDependency section */ 358 | 5B4D04F42D92F93B005262A1 /* ActivityIndicatorView */ = { 359 | isa = XCSwiftPackageProductDependency; 360 | productName = ActivityIndicatorView; 361 | }; 362 | 5B4DBAC32D92EC070067A006 /* ActivityIndicatorView */ = { 363 | isa = XCSwiftPackageProductDependency; 364 | productName = ActivityIndicatorView; 365 | }; 366 | /* End XCSwiftPackageProductDependency section */ 367 | }; 368 | rootObject = 5B4DBAA82D92EB130067A006 /* Project object */; 369 | } 370 | --------------------------------------------------------------------------------