Showing preview only (652K chars total). Download the full file or copy to clipboard to get everything.
Repository: ninjaprox/NVActivityIndicatorView
Branch: master
Commit: 9777b047a904
Files: 100
Total size: 615.7 KB
Directory structure:
gitextract_aoakydhx/
├── .github/
│ └── workflows/
│ └── ios.yml
├── .gitignore
├── .jazzy.yaml
├── .swiftlint.yml
├── CHANGELOG.md
├── Example/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── SceneDelegate.swift
│ └── ViewController.swift
├── LICENSE
├── NVActivityIndicatorView.podspec
├── NVActivityIndicatorView.xcodeproj/
│ ├── NVActivityIndicatorViewExtended_Info.plist
│ ├── NVActivityIndicatorView_Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Example.xcscheme
│ └── NVActivityIndicatorView-Package.xcscheme
├── Package.swift
├── PrivacyInfo.xcprivacy
├── README.md
├── Sources/
│ ├── Base/
│ │ ├── Animations/
│ │ │ ├── NVActivityIndicatorAnimationAudioEqualizer.swift
│ │ │ ├── NVActivityIndicatorAnimationBallBeat.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotate.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotateMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotatePulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallDoubleBounce.swift
│ │ │ ├── NVActivityIndicatorAnimationBallGridBeat.swift
│ │ │ ├── NVActivityIndicatorAnimationBallGridPulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulseRise.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulseSync.swift
│ │ │ ├── NVActivityIndicatorAnimationBallRotate.swift
│ │ │ ├── NVActivityIndicatorAnimationBallRotateChase.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScale.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleRipple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallSpinFadeLoader.swift
│ │ │ ├── NVActivityIndicatorAnimationBallTrianglePath.swift
│ │ │ ├── NVActivityIndicatorAnimationBallZigZag.swift
│ │ │ ├── NVActivityIndicatorAnimationBallZigZagDeflect.swift
│ │ │ ├── NVActivityIndicatorAnimationBlank.swift
│ │ │ ├── NVActivityIndicatorAnimationCircleStrokeSpin.swift
│ │ │ ├── NVActivityIndicatorAnimationCubeTransition.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScale.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScaleParty.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScalePulseOut.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScalePulseOutRapid.swift
│ │ │ ├── NVActivityIndicatorAnimationLineSpinFadeLoader.swift
│ │ │ ├── NVActivityIndicatorAnimationOrbit.swift
│ │ │ ├── NVActivityIndicatorAnimationPacman.swift
│ │ │ ├── NVActivityIndicatorAnimationSemiCircleSpin.swift
│ │ │ ├── NVActivityIndicatorAnimationSquareSpin.swift
│ │ │ └── NVActivityIndicatorAnimationTriangleSkewSpin.swift
│ │ ├── NVActivityIndicatorAnimationDelegate.swift
│ │ ├── NVActivityIndicatorShape.swift
│ │ └── NVActivityIndicatorView.swift
│ └── Extended/
│ ├── NVActivityIndicatorPresenter.swift
│ └── NVActivityIndicatorViewable.swift
├── Tests/
│ ├── ActivityDataTests.swift
│ ├── Info.plist
│ ├── NVActivityIndicatorPresenterTests.swift
│ ├── NVActivityIndicatorTypeTests.swift
│ ├── NVActivityIndicatorViewTests.swift
│ └── Tests-Bridging-Header.h
├── docs/
│ ├── CNAME
│ ├── Classes/
│ │ └── NVActivityIndicatorView.html
│ ├── Classes.html
│ ├── Enums/
│ │ └── NVActivityIndicatorType.html
│ ├── Enums.html
│ ├── Typealiases.html
│ ├── css/
│ │ ├── highlight.css
│ │ └── jazzy.css
│ ├── docsets/
│ │ ├── NVActivityIndicatorView.docset/
│ │ │ └── Contents/
│ │ │ ├── Info.plist
│ │ │ └── Resources/
│ │ │ ├── Documents/
│ │ │ │ ├── Classes/
│ │ │ │ │ └── NVActivityIndicatorView.html
│ │ │ │ ├── Classes.html
│ │ │ │ ├── Enums/
│ │ │ │ │ └── NVActivityIndicatorType.html
│ │ │ │ ├── Enums.html
│ │ │ │ ├── Typealiases.html
│ │ │ │ ├── css/
│ │ │ │ │ ├── highlight.css
│ │ │ │ │ └── jazzy.css
│ │ │ │ ├── index.html
│ │ │ │ └── js/
│ │ │ │ ├── jazzy.js
│ │ │ │ ├── jazzy.search.js
│ │ │ │ └── typeahead.jquery.js
│ │ │ └── docSet.dsidx
│ │ └── NVActivityIndicatorView.tgz
│ ├── index.html
│ ├── js/
│ │ ├── jazzy.js
│ │ ├── jazzy.search.js
│ │ └── typeahead.jquery.js
│ └── undocumented.json
└── scripts/
└── bump-version.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/ios.yml
================================================
name: iOS starter workflow
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
name: Build and Test default scheme using any available iPhone simulator
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set Default Scheme
run: |
scheme_list=$(xcodebuild -list -json | tr -d "\n")
default=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['schemes'][0]")
echo $default | cat >default
echo Using default scheme: $default
- name: Build
env:
scheme: ${{ 'default' }}
platform: ${{ 'iOS Simulator' }}
run: |
# xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)
device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"`
if [ $scheme = default ]; then scheme=$(cat default); fi
if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi
file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
xcodebuild build-for-testing -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device" -skipPackagePluginValidation -skipMacroValidation
- name: Test
env:
scheme: ${{ 'default' }}
platform: ${{ 'iOS Simulator' }}
run: |
# xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)
device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"`
if [ $scheme = default ]; then scheme=$(cat default); fi
if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi
file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
xcodebuild test-without-building -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device"
================================================
FILE: .gitignore
================================================
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
.swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# Accio dependency management
Dependencies/
.accio/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
================================================
FILE: .jazzy.yaml
================================================
readme: README.md
author: Vinh Nguyen
author_url: https://github.com/ninjaprox
github_url: https://github.com/ninjaprox/NVActivityIndicatorView
theme: fullwidth
disable_search: true
hide_documentation_coverage: true
clean: true
module: NVActivityIndicatorView
module_version: 5.2.0
build_tool_arguments:
- -scheme
- NVActivityIndicatorView-Package
- -project
- NVActivityIndicatorView.xcodeproj
================================================
FILE: .swiftlint.yml
================================================
disabled_rules:
- line_length
type_name:
max_length: 60
identifier_name:
excluded:
- x
- y
- i
- j
function_body_length:
warning: 50
================================================
FILE: CHANGELOG.md
================================================
# Change log
## [5.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.2.0)
- Add privacy manifest (#349)
## [5.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.1)
- Fix #319 (amendment)
## [5.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.0)
- Fix #319
## [5.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.1)
- Fix #314
## [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0)
- Deprecate `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`
- By default, `NVActivityIndicatorView` pod doesn't include `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`, use `NVActivityIndicatorView/Extended` instead
- The same applies for `NVActivityIndicatorView` and `NVActivityIndicatorViewExtended` when using Swift Package Manager
- Drop support for Swift <4.2
## [4.8.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.8.0)
- Add Swift Package Manager support (#290)
## [4.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.7.0)
- Default nil fadeInAnimation and fadeOutAnimation (#264)
- Swift 5 migration (#274)
## [4.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.1)
- Fix #261
## [4.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.0)
- New NVActivityIndicatorAnimationBallDoubleBounce animation (#258)
- Unify product name (#260)
## [4.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.1)
- Fix #251
## [4.5.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.0)
- Add tvOS target (#248)
## [4.4.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.1)
- Don’t start/stop animating if unnecessary (#239)
- Specify Swift version in Podspec (#245)
## [4.4.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.0)
- Fix #211
- Swift 4.2 migration
## [4.3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.3.0)
- Handle starting while waiting to stop (#218)
- UI blocker fade in/out animation (#219)
## [4.2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.1)
- Fix #213
## [4.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.0)
- Refactor `NVActivityIndicatorPresenter` with state pattern
- Expose `isAnimating` from `NVActivityIndicatorPresenter` and `NVActivityIndicatorViewable` (#204)
- Fix tests
## [4.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.1)
- Fix #186, #189
## [4.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.0)
- Introduce message spacing
- New circle stroke spin animation
## [4.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.1)
- Fix view in auto layout
- Fix #173, #180
## [4.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.0)
- Update to Swift 4
## [3.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.7.0)
- Support app extension
## [3.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.1)
- Fix #138
## [3.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.0)
- Fix #128
## [3.5.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.2)
- Fix #132
## [3.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.1)
- Fix #123
## [v3.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.5)
- Fix #121
- Fix setting message
## [v3.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.4)
- Fix constraint conflict in UI blocker
## [v3.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.3)
- Able to change text color in UI blocker
- Fix UI blocker layer on orientation change
## [v3.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.2)
- Able to change UI blocker background color
- Able to change message in UI blocker during displaying
## [v3.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.1)
- Optimize compile time
- Update setting to Swift 3.0.1
- Add default message
- Custom message font
- Auto message width
## [v3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.0)
- Support Xcode 8 and Swift 3
## [v2.12](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.12)
- Fix infinite loop caused by `stopAnimation()` (#67)
## [v2.11](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.11)
- Fix when used with MBProgressHUD
- Abilitiy to display UI blocker anywher
- Time threshold to display UI blocker
- Minimum display time of UI blocker
- Deprecate some APIs
- Add tests
## [v2.10](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.10)
- Fix UI blocker not showing full screen
- Support tvOS
## [v2.9](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.9)
- Ability to change size of animation in UI blocker
## [v2.8](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.8)
- New Orbit animation
- New Audio equalizer animation
## [v2.7](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.7)
- Display as UI blocker for UIViewController
- Be able to change defaults
## [v2.6](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.6)
- Fix BallSpinFadeLoader animation
- Fix LineSpinFadeLoader animation
- Fix BallRotateChase animation
- Change default animation to BallSpinFadeLoader
## [v2.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.5)
- Fix padding issues
## [v2.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.4)
- Fix autolayout compability when using in Storyboard
- Support for IBInpectable
## [v2.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.3)
- Fix bug when orientation changes once stopped animation
- Update document
## [v2.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.2)
- Public properties of animation
- Public hidesWhenStopped and animating
- New animation:
- Ball rotate chase
## [v2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.1)
- Support Carthage
## [v2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.0)
- Update to Swift 2.0
## [v1.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.3)
- More convenient constructor
- Hide when stopped option
## [v1.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.2)
- Fix issue when using as framework
- Set default animation type to pacman
- Add documentation
## [v1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.1)
- Change project structure to work well with CocoaPods
- Small fix in `podspec`
## [v1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.0)
- Initial release
- Full implementations of 28 loaders from loaders.css
================================================
FILE: Example/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Example
//
// The MIT License (MIT)
// Copyright (c) 2020 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
================================================
FILE: Example/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
================================================
FILE: Example/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>5.2.0</string>
<key>CFBundleVersion</key>
<string>48</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: Example/SceneDelegate.swift
================================================
//
// SceneDelegate.swift
// Example
//
// The MIT License (MIT)
// Copyright (c) 2020 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard (scene as? UIWindowScene) != nil else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
================================================
FILE: Example/ViewController.swift
================================================
//
// ViewController.swift
// Example
//
// The MIT License (MIT)
// Copyright (c) 2020 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
import UIKit
import NVActivityIndicatorView
import NVActivityIndicatorViewExtended
class ViewController: UIViewController, NVActivityIndicatorViewable {
private let presentingIndicatorTypes = {
return NVActivityIndicatorType.allCases.filter { $0 != .blank }
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor(red: CGFloat(237 / 255.0), green: CGFloat(85 / 255.0), blue: CGFloat(101 / 255.0), alpha: 1)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let safeArea = view.safeAreaLayoutGuide.layoutFrame
var cols = 4
var rows = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))
if safeArea.width > safeArea.height {
//Landscape
cols = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))
rows = 4
}
let cellWidth = Int(safeArea.width / CGFloat(cols))
let cellHeight = Int(safeArea.height / CGFloat(rows))
self.view.subviews.forEach {
$0.removeFromSuperview()
}
for (index, indicatorType) in presentingIndicatorTypes.enumerated() {
let x = index % cols * cellWidth + Int(safeArea.origin.x)
let y = index / cols * cellHeight + Int(safeArea.origin.y)
let frame = CGRect(x: x, y: y, width: cellWidth, height: cellHeight)
let activityIndicatorView = NVActivityIndicatorView(frame: frame,
type: indicatorType)
let animationTypeLabel = UILabel(frame: frame)
animationTypeLabel.text = String(index)
animationTypeLabel.sizeToFit()
animationTypeLabel.allowsDefaultTighteningForTruncation = true
animationTypeLabel.textColor = UIColor.white
animationTypeLabel.frame.origin.x += 5
animationTypeLabel.frame.origin.y += CGFloat(cellHeight) - animationTypeLabel.frame.size.height
activityIndicatorView.padding = 20
if indicatorType == NVActivityIndicatorType.orbit {
activityIndicatorView.padding = 0
}
self.view.addSubview(activityIndicatorView)
self.view.addSubview(animationTypeLabel)
activityIndicatorView.startAnimating()
let button = UIButton(frame: frame)
button.tag = index
button.addTarget(self,
action: #selector(buttonTapped(_:)),
for: .touchUpInside)
self.view.addSubview(button)
}
}
@objc func buttonTapped(_ sender: UIButton) {
let size = CGSize(width: 30, height: 30)
let selectedIndicatorIndex = sender.tag
let indicatorType = presentingIndicatorTypes[selectedIndicatorIndex]
startAnimating(size, message: "Loading...", type: indicatorType, fadeInAnimation: nil)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) {
NVActivityIndicatorPresenter.sharedInstance.setMessage("Authenticating...")
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
self.stopAnimating(nil)
}
}
}
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 Vinh Nguyen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: NVActivityIndicatorView.podspec
================================================
Pod::Spec.new do |s|
s.name = 'NVActivityIndicatorView'
s.version = '5.2.0'
s.summary = 'A collection of awesome loading animations'
s.homepage = 'https://github.com/ninjaprox/NVActivityIndicatorView'
s.screenshot = 'https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif'
s.license = { type: 'MIT', file: 'LICENSE' }
s.author = { 'Vinh Nguyen' => 'ninjaprox@gmail.com' }
s.social_media_url = 'http://twitter.com/ninjaprox'
s.documentation_url = 'https://nvactivityindicatorview.vinhis.me'
s.ios.deployment_target = '9.0'
s.tvos.deployment_target = '9.0'
s.swift_version = '5.0'
s.source = { git: 'https://github.com/ninjaprox/NVActivityIndicatorView.git',
tag: s.version }
s.subspec 'Base' do |ss|
ss.source_files = 'Sources/Base/**/*.swift'
end
s.subspec 'Extended' do |ss|
ss.dependency 'NVActivityIndicatorView/Base'
ss.source_files = 'Sources/Extended/**/*.swift'
end
s.default_subspec = 'Base'
s.frameworks = 'UIKit', 'QuartzCore'
end
================================================
FILE: NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>5.2.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>48</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>5.2.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>48</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: NVActivityIndicatorView.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836DF248CEFC200583430 /* AppDelegate.swift */; };
1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E1248CEFC200583430 /* SceneDelegate.swift */; };
1F1836E4248CEFC200583430 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E3248CEFC200583430 /* ViewController.swift */; };
1F1836E7248CEFC200583430 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E5248CEFC200583430 /* Main.storyboard */; };
1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E8248CEFC300583430 /* Assets.xcassets */; };
1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */; };
1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; };
1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183706248CF29F00583430 /* ActivityDataTests.swift */; };
1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */; };
1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */; };
1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */; };
OBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* NVActivityIndicatorPresenter.swift */; };
OBJ_103 /* NVActivityIndicatorViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* NVActivityIndicatorViewable.swift */; };
OBJ_105 /* NVActivityIndicatorView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */; };
OBJ_112 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
OBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */; };
OBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */; };
OBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */; };
OBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */; };
OBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */; };
OBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */; };
OBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */; };
OBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */; };
OBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */; };
OBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */; };
OBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */; };
OBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */; };
OBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */; };
OBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */; };
OBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */; };
OBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */; };
OBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */; };
OBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */; };
OBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */; };
OBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */; };
OBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */; };
OBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */; };
OBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */; };
OBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */; };
OBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */; };
OBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */; };
OBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */; };
OBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */; };
OBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */; };
OBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */; };
OBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */; };
OBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */; };
OBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */; };
OBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */; };
OBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */; };
OBJ_94 /* NVActivityIndicatorShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* NVActivityIndicatorShape.swift */; };
OBJ_95 /* NVActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* NVActivityIndicatorView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
1F1836A8248CEC7400583430 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = "NVActivityIndicatorView::NVActivityIndicatorView";
remoteInfo = NVActivityIndicatorView;
};
1F1836F4248CF08B00583430 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = "NVActivityIndicatorView::NVActivityIndicatorViewExtended";
remoteInfo = NVActivityIndicatorViewExtended;
};
1F183700248CF25600583430 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = OBJ_1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 1F1836DC248CEFC200583430;
remoteInfo = Example;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
1F1836F6248CF08B00583430 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1F1836DD248CEFC200583430 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
1F1836DF248CEFC200583430 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
1F1836E1248CEFC200583430 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
1F1836E3248CEFC200583430 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
1F1836E6248CEFC200583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
1F1836E8248CEFC300583430 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
1F1836EB248CEFC300583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
1F1836ED248CEFC300583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
1F1836FB248CF25600583430 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
1F1836FF248CF25600583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
1F183705248CF29E00583430 /* Tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Bridging-Header.h"; sourceTree = "<group>"; };
1F183706248CF29F00583430 /* ActivityDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityDataTests.swift; sourceTree = "<group>"; };
1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenterTests.swift; sourceTree = "<group>"; };
1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewTests.swift; sourceTree = "<group>"; };
1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorTypeTests.swift; sourceTree = "<group>"; };
1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
"NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorViewExtended.framework; sourceTree = BUILT_PRODUCTS_DIR; };
OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationAudioEqualizer.swift; sourceTree = "<group>"; };
OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallBeat.swift; sourceTree = "<group>"; };
OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotate.swift; sourceTree = "<group>"; };
OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotateMultiple.swift; sourceTree = "<group>"; };
OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotatePulse.swift; sourceTree = "<group>"; };
OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallDoubleBounce.swift; sourceTree = "<group>"; };
OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridBeat.swift; sourceTree = "<group>"; };
OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridPulse.swift; sourceTree = "<group>"; };
OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulse.swift; sourceTree = "<group>"; };
OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseRise.swift; sourceTree = "<group>"; };
OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseSync.swift; sourceTree = "<group>"; };
OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotate.swift; sourceTree = "<group>"; };
OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotateChase.swift; sourceTree = "<group>"; };
OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScale.swift; sourceTree = "<group>"; };
OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleMultiple.swift; sourceTree = "<group>"; };
OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRipple.swift; sourceTree = "<group>"; };
OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRippleMultiple.swift; sourceTree = "<group>"; };
OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallSpinFadeLoader.swift; sourceTree = "<group>"; };
OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallTrianglePath.swift; sourceTree = "<group>"; };
OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZag.swift; sourceTree = "<group>"; };
OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZagDeflect.swift; sourceTree = "<group>"; };
OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBlank.swift; sourceTree = "<group>"; };
OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCircleStrokeSpin.swift; sourceTree = "<group>"; };
OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCubeTransition.swift; sourceTree = "<group>"; };
OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScale.swift; sourceTree = "<group>"; };
OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScaleParty.swift; sourceTree = "<group>"; };
OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOut.swift; sourceTree = "<group>"; };
OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOutRapid.swift; sourceTree = "<group>"; };
OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineSpinFadeLoader.swift; sourceTree = "<group>"; };
OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationOrbit.swift; sourceTree = "<group>"; };
OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationPacman.swift; sourceTree = "<group>"; };
OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSemiCircleSpin.swift; sourceTree = "<group>"; };
OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSquareSpin.swift; sourceTree = "<group>"; };
OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationTriangleSkewSpin.swift; sourceTree = "<group>"; };
OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationDelegate.swift; sourceTree = "<group>"; };
OBJ_45 /* NVActivityIndicatorShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorShape.swift; sourceTree = "<group>"; };
OBJ_46 /* NVActivityIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorView.swift; sourceTree = "<group>"; };
OBJ_48 /* NVActivityIndicatorPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenter.swift; sourceTree = "<group>"; };
OBJ_49 /* NVActivityIndicatorViewable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewable.swift; sourceTree = "<group>"; };
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
1F1836DA248CEFC200583430 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
1F1836F8248CF25600583430 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_104 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
OBJ_105 /* NVActivityIndicatorView.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_96 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1F1836DE248CEFC200583430 /* Example */ = {
isa = PBXGroup;
children = (
1F1836DF248CEFC200583430 /* AppDelegate.swift */,
1F1836E1248CEFC200583430 /* SceneDelegate.swift */,
1F1836E3248CEFC200583430 /* ViewController.swift */,
1F1836E5248CEFC200583430 /* Main.storyboard */,
1F1836E8248CEFC300583430 /* Assets.xcassets */,
1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */,
1F1836ED248CEFC300583430 /* Info.plist */,
);
path = Example;
sourceTree = "<group>";
};
1F1836F1248CF08B00583430 /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
1F1836FC248CF25600583430 /* Tests */ = {
isa = PBXGroup;
children = (
1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */,
1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */,
1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */,
1F183706248CF29F00583430 /* ActivityDataTests.swift */,
1F1836FF248CF25600583430 /* Info.plist */,
1F183705248CF29E00583430 /* Tests-Bridging-Header.h */,
);
path = Tests;
sourceTree = "<group>";
};
OBJ_47 /* NVActivityIndicatorViewExtended */ = {
isa = PBXGroup;
children = (
OBJ_48 /* NVActivityIndicatorPresenter.swift */,
OBJ_49 /* NVActivityIndicatorViewable.swift */,
);
name = NVActivityIndicatorViewExtended;
path = Sources/Extended;
sourceTree = SOURCE_ROOT;
};
OBJ_5 = {
isa = PBXGroup;
children = (
1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */,
OBJ_6 /* Package.swift */,
OBJ_7 /* Sources */,
1F1836DE248CEFC200583430 /* Example */,
1F1836FC248CF25600583430 /* Tests */,
OBJ_51 /* Products */,
1F1836F1248CF08B00583430 /* Frameworks */,
);
sourceTree = "<group>";
};
OBJ_51 /* Products */ = {
isa = PBXGroup;
children = (
"NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */,
"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */,
1F1836DD248CEFC200583430 /* Example.app */,
1F1836FB248CF25600583430 /* Tests.xctest */,
);
name = Products;
sourceTree = BUILT_PRODUCTS_DIR;
};
OBJ_7 /* Sources */ = {
isa = PBXGroup;
children = (
OBJ_8 /* NVActivityIndicatorView */,
OBJ_47 /* NVActivityIndicatorViewExtended */,
);
name = Sources;
sourceTree = SOURCE_ROOT;
};
OBJ_8 /* NVActivityIndicatorView */ = {
isa = PBXGroup;
children = (
OBJ_9 /* Animations */,
OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */,
OBJ_45 /* NVActivityIndicatorShape.swift */,
OBJ_46 /* NVActivityIndicatorView.swift */,
);
name = NVActivityIndicatorView;
path = Sources/Base;
sourceTree = SOURCE_ROOT;
};
OBJ_9 /* Animations */ = {
isa = PBXGroup;
children = (
OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */,
OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */,
OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */,
OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */,
OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */,
OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */,
OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */,
OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */,
OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */,
OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */,
OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */,
OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */,
OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */,
OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */,
OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */,
OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */,
OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */,
OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */,
OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */,
OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */,
OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */,
OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */,
OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */,
OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */,
OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */,
OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */,
OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */,
OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */,
OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */,
OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */,
OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */,
OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */,
OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */,
OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */,
);
path = Animations;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
1F1836DC248CEFC200583430 /* Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget "Example" */;
buildPhases = (
1F1836D9248CEFC200583430 /* Sources */,
1F1836DA248CEFC200583430 /* Frameworks */,
1F1836DB248CEFC200583430 /* Resources */,
1F1836F6248CF08B00583430 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
1F1836F5248CF08B00583430 /* PBXTargetDependency */,
);
name = Example;
productName = Example;
productReference = 1F1836DD248CEFC200583430 /* Example.app */;
productType = "com.apple.product-type.application";
};
1F1836FA248CF25600583430 /* Tests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget "Tests" */;
buildPhases = (
1F1836F7248CF25600583430 /* Sources */,
1F1836F8248CF25600583430 /* Frameworks */,
1F1836F9248CF25600583430 /* Resources */,
);
buildRules = (
);
dependencies = (
1F183701248CF25600583430 /* PBXTargetDependency */,
);
name = Tests;
productName = Tests;
productReference = 1F1836FB248CF25600583430 /* Tests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
"NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_55 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorView" */;
buildPhases = (
OBJ_58 /* Sources */,
OBJ_96 /* Frameworks */,
);
buildRules = (
);
dependencies = (
1F0742D12F6A40C600304500 /* PBXTargetDependency */,
);
name = NVActivityIndicatorView;
productName = NVActivityIndicatorView;
productReference = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */;
productType = "com.apple.product-type.framework";
};
"NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_98 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewExtended" */;
buildPhases = (
OBJ_101 /* Sources */,
OBJ_104 /* Frameworks */,
);
buildRules = (
);
dependencies = (
1F0742D32F6A40CF00304500 /* PBXTargetDependency */,
OBJ_106 /* PBXTargetDependency */,
);
name = NVActivityIndicatorViewExtended;
productName = NVActivityIndicatorViewExtended;
productReference = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */;
productType = "com.apple.product-type.framework";
};
"NVActivityIndicatorView::SwiftPMPackageDescription" /* NVActivityIndicatorViewPackageDescription */ = {
isa = PBXNativeTarget;
buildConfigurationList = OBJ_108 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewPackageDescription" */;
buildPhases = (
OBJ_111 /* Sources */,
);
buildRules = (
);
dependencies = (
);
name = NVActivityIndicatorViewPackageDescription;
productName = NVActivityIndicatorViewPackageDescription;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
OBJ_1 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftMigration = 9999;
LastSwiftUpdateCheck = 1130;
LastUpgradeCheck = 2630;
TargetAttributes = {
1F1836DC248CEFC200583430 = {
CreatedOnToolsVersion = 11.3.1;
ProvisioningStyle = Automatic;
};
1F1836FA248CF25600583430 = {
CreatedOnToolsVersion = 11.3.1;
LastSwiftMigration = 1130;
ProvisioningStyle = Automatic;
TestTargetID = 1F1836DC248CEFC200583430;
};
};
};
buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "NVActivityIndicatorView" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = OBJ_5;
packageReferences = (
1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */,
);
productRefGroup = OBJ_51 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
"NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */,
"NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */,
"NVActivityIndicatorView::SwiftPMPackageDescription" /* NVActivityIndicatorViewPackageDescription */,
1F1836DC248CEFC200583430 /* Example */,
1F1836FA248CF25600583430 /* Tests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
1F1836DB248CEFC200583430 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */,
1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */,
1F1836E7248CEFC200583430 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
1F1836F9248CF25600583430 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
1F1836D9248CEFC200583430 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1F1836E4248CEFC200583430 /* ViewController.swift in Sources */,
1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */,
1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
1F1836F7248CF25600583430 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */,
1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */,
1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */,
1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_101 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */,
OBJ_103 /* NVActivityIndicatorViewable.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_111 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_112 /* Package.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
OBJ_58 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 0;
files = (
OBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */,
OBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */,
OBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */,
OBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */,
OBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */,
OBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */,
OBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */,
OBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */,
OBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */,
OBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */,
OBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */,
OBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */,
OBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */,
OBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */,
OBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */,
OBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */,
OBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */,
OBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */,
OBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */,
OBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */,
OBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */,
OBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */,
OBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */,
OBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */,
OBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */,
OBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */,
OBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */,
OBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */,
OBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */,
OBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */,
OBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */,
OBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */,
OBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */,
OBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */,
OBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */,
OBJ_94 /* NVActivityIndicatorShape.swift in Sources */,
OBJ_95 /* NVActivityIndicatorView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
1F0742D12F6A40C600304500 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = 1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */;
};
1F0742D32F6A40CF00304500 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = 1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */;
};
1F1836F5248CF08B00583430 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = "NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */;
targetProxy = 1F1836F4248CF08B00583430 /* PBXContainerItemProxy */;
};
1F183701248CF25600583430 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 1F1836DC248CEFC200583430 /* Example */;
targetProxy = 1F183700248CF25600583430 /* PBXContainerItemProxy */;
};
OBJ_106 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = "NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */;
targetProxy = 1F1836A8248CEC7400583430 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
1F1836E5248CEFC200583430 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
1F1836E6248CEFC200583430 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
1F1836EB248CEFC300583430 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
1F1836EE248CEFC300583430 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
1F1836EF248CEFC300583430 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
1F183703248CF25600583430 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Tests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OBJC_BRIDGING_HEADER = "Tests/Tests-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example";
};
name = Debug;
};
1F183704248CF25600583430 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Tests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Tests/Tests-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
OBJ_100 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CURRENT_PROJECT_VERSION = 48;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 5.1.0;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGET_NAME = NVActivityIndicatorViewExtended;
TVOS_DEPLOYMENT_TARGET = 12.0;
WATCHOS_DEPLOYMENT_TARGET = 2.0;
};
name = Release;
};
OBJ_109 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
LD = /usr/bin/true;
MACOSX_DEPLOYMENT_TARGET = 11.0;
OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
OBJ_110 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
LD = /usr/bin/true;
MACOSX_DEPLOYMENT_TARGET = 11.0;
OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
OBJ_3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_NS_ASSERTIONS = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"SWIFT_PACKAGE=1",
"DEBUG=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MACOSX_DEPLOYMENT_TARGET = 10.10;
ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -DXcode";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
USE_HEADERMAP = NO;
};
name = Debug;
};
OBJ_4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = s;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"SWIFT_PACKAGE=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MACOSX_DEPLOYMENT_TARGET = 10.10;
OTHER_SWIFT_FLAGS = "$(inherited) -DXcode";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
USE_HEADERMAP = NO;
};
name = Release;
};
OBJ_56 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CURRENT_PROJECT_VERSION = 48;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 5.1.0;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGET_NAME = NVActivityIndicatorView;
TVOS_DEPLOYMENT_TARGET = 12.0;
WATCHOS_DEPLOYMENT_TARGET = 2.0;
};
name = Debug;
};
OBJ_57 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CURRENT_PROJECT_VERSION = 48;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 5.1.0;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGET_NAME = NVActivityIndicatorView;
TVOS_DEPLOYMENT_TARGET = 12.0;
WATCHOS_DEPLOYMENT_TARGET = 2.0;
};
name = Release;
};
OBJ_99 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CURRENT_PROJECT_VERSION = 48;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
);
HEADER_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 5.1.0;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGET_NAME = NVActivityIndicatorViewExtended;
TVOS_DEPLOYMENT_TARGET = 12.0;
WATCHOS_DEPLOYMENT_TARGET = 2.0;
};
name = Debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget "Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1F1836EE248CEFC300583430 /* Debug */,
1F1836EF248CEFC300583430 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget "Tests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1F183703248CF25600583430 /* Debug */,
1F183704248CF25600583430 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_108 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewPackageDescription" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_109 /* Debug */,
OBJ_110 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_2 /* Build configuration list for PBXProject "NVActivityIndicatorView" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_3 /* Debug */,
OBJ_4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_55 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorView" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_56 /* Debug */,
OBJ_57 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
OBJ_98 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewExtended" */ = {
isa = XCConfigurationList;
buildConfigurations = (
OBJ_99 /* Debug */,
OBJ_100 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 0.63.2;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */ = {
isa = XCSwiftPackageProductDependency;
package = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */;
productName = "plugin:SwiftLintBuildToolPlugin";
};
1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */ = {
isa = XCSwiftPackageProductDependency;
package = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */;
productName = "plugin:SwiftLintBuildToolPlugin";
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = OBJ_1 /* Project object */;
}
================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
<false/>
</dict>
</plist>
================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
================================================
{
"originHash" : "1fa961aa1dc717cea452f3389668f0f99a254f07e4eb11d190768a53798f744f",
"pins" : [
{
"identity" : "swiftlintplugins",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SimplyDanny/SwiftLintPlugins",
"state" : {
"revision" : "8a4640d14777685ba8f14e832373160498fbab92",
"version" : "0.63.2"
}
}
],
"version" : 3
}
================================================
FILE: NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1F1836DC248CEFC200583430"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1F1836FA248CF25600583430"
BuildableName = "Tests.xctest"
BlueprintName = "Tests"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1F1836DC248CEFC200583430"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1F1836DC248CEFC200583430"
BuildableName = "Example.app"
BlueprintName = "Example"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView-Package.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "NVActivityIndicatorView::NVActivityIndicatorView"
BuildableName = "NVActivityIndicatorView.framework"
BlueprintName = "NVActivityIndicatorView"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "NVActivityIndicatorView::NVActivityIndicatorViewExtended"
BuildableName = "NVActivityIndicatorViewExtended.framework"
BlueprintName = "NVActivityIndicatorViewExtended"
ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: Package.swift
================================================
// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "NVActivityIndicatorView",
platforms: [
.iOS(.v9),
.tvOS(.v9)
],
products: [
.library(name: "NVActivityIndicatorView", targets: ["NVActivityIndicatorView"]),
.library(name: "NVActivityIndicatorViewExtended", targets: ["NVActivityIndicatorViewExtended"])
],
targets: [
.target(name: "NVActivityIndicatorView", path: "Sources/Base"),
.target(name: "NVActivityIndicatorViewExtended",
dependencies: ["NVActivityIndicatorView"],
path: "Sources/Extended")
]
)
================================================
FILE: PrivacyInfo.xcprivacy
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>
================================================
FILE: README.md
================================================
# NVActivityIndicatorView
[](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml)
[](https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg)
[](https://github.com/Carthage/Carthage)
⚠️ Check out [LoaderUI](https://github.com/ninjaprox/LoaderUI) (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. 🎉
## Introduction
`NVActivityIndicatorView` is a collection of awesome loading animations.

## Animation types
| Type | Type | Type | Type |
| ---------------------- | --------------------------- | ---------------------- | -------------------------- |
| 1. ballPulse | 2. ballGridPulse | 3. ballClipRotate | 4. squareSpin |
| 5. ballClipRotatePulse | 6. ballClipRotateMultiple | 7. ballPulseRise | 8. ballRotate |
| 9. cubeTransition | 10. ballZigZag | 11. ballZigZagDeflect | 12. ballTrianglePath |
| 13. ballScale | 14. lineScale | 15. lineScaleParty | 16. ballScaleMultiple |
| 17. ballPulseSync | 18. ballBeat | 19. lineScalePulseOut | 20. lineScalePulseOutRapid |
| 21. ballScaleRipple | 22. ballScaleRippleMultiple | 23. ballSpinFadeLoader | 24. lineSpinFadeLoader |
| 25. triangleSkewSpin | 26. pacman | 27. ballGridBeat | 28. semiCircleSpin |
| 29. ballRotateChase | 30. orbit | 31. audioEqualizer | 32. circleStrokeSpin |
## Installation
### Cocoapods
[Cocoapods](https://cocoapods.org/#install) is a dependency manager for Swift and Objective-C Cocoa projects. To use NVActivityIndicatorView with CocoaPods, add it in your `Podfile`.
```ruby
pod 'NVActivityIndicatorView'
```
### Carthage
[Carthage](https://github.com/Carthage/Carthage#installing-carthage) is intended to be the simplest way to add frameworks to your Cocoa application. To use NVActivityIndicatorView with Carthage, add it in your `Cartfile`.
```ruby
github "ninjaprox/NVActivityIndicatorView"
```
### Swift Package Manager
The [Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. To use NVActivityIndicatorView with Swift Package Manger, add it to `dependencies` in your `Package.swift`
```swift
dependencies: [
.package(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git")
]
```
## Migration
Version [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0) comes with breaking changes. Please refer to the release note for details.
## Usage
Firstly, import `NVActivityIndicatorView`.
```swift
import NVActivityIndicatorView
```
### Initialization
Then, there are two ways you can create `NVActivityIndicatorView`:
- By storyboard, changing class of any `UIView` to `NVActivityIndicatorView`.
_**Note:** Set `Module` to `NVActivityIndicatorView`._
- By code, using initializer. All parameters other than `frame` are optional and [`NVActivityIndicatorView.DEFAULT_*`](https://nvactivityindicatorview.vinhis.me/Classes/NVActivityIndicatorView.html) are used as default values.
```swift
NVActivityIndicatorView(frame: frame, type: type, color: color, padding: padding)
```
### Control
Start animating.
```swift
activityIndicatorView.startAnimating()
```
Stop animating.
```swift
activityIndicatorView.stopAnimating()
```
Determine if it is animating.
```swift
animating = activityIndicatorView.isAnimating
```
### Change properties
In storyboard, you can change all properties in Attributes inspector tab of Utilities panel.
_**Note:** Use one of values (case-insensitive) in [Animation types](#animation-types) for `Type Name`._
All properties are public so you can change them after initializing.
_**Note:** All changes must be made before calling `startAnimating()`._
## Documentation
https://nvactivityindicatorview.vinhis.me/
## Acknowledgment
Thanks [Connor Atherton](https://github.com/ConnorAtherton) for inspired [Loaders.css](https://github.com/ConnorAtherton/loaders.css) and [Danil Gontovnik](https://github.com/gontovnik) for [DGActivityIndicatorView](https://github.com/gontovnik/DGActivityIndicatorView).
## License
The MIT License (MIT)
Copyright (c) 2016 Vinh Nguyen [@ninjaprox](http://twitter.com/ninjaprox)
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift
================================================
//
// NVActivityIndicatorAnimationAudioEqualizer.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let lineSize = size.width / 9
let x = (layer.bounds.size.width - lineSize * 7) / 2
let y = (layer.bounds.size.height - size.height) / 2
let duration: [CFTimeInterval] = [4.3, 2.5, 1.7, 3.1]
let values = [0, 0.7, 0.4, 0.05, 0.95, 0.3, 0.9, 0.4, 0.15, 0.18, 0.75, 0.01]
// Draw lines
for i in 0 ..< 4 {
let animation = CAKeyframeAnimation()
animation.keyPath = "path"
animation.isAdditive = true
animation.values = []
for j in 0 ..< values.count {
let heightFactor = values[j]
let height = size.height * CGFloat(heightFactor)
let point = CGPoint(x: 0, y: size.height - height)
let path = UIBezierPath(rect: CGRect(origin: point, size: CGSize(width: lineSize, height: height)))
animation.values?.append(path.cgPath)
}
animation.duration = duration[i]
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)
let frame = CGRect(x: x + lineSize * 2 * CGFloat(i),
y: y,
width: lineSize,
height: size.height)
line.frame = frame
line.add(animation, forKey: "animation")
layer.addSublayer(line)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift
================================================
//
// NVActivityIndicatorAnimationBallBeat.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallBeat: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize = (size.width - circleSpacing * 2) / 3
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - circleSize) / 2
let duration: CFTimeInterval = 0.7
let beginTime = CACurrentMediaTime()
let beginTimes = [0.35, 0, 0.35]
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.values = [1, 0.75, 1]
scaleAnimation.duration = duration
// Opacity animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.keyTimes = [0, 0.5, 1]
opacityAnimation.values = [1, 0.2, 1]
opacityAnimation.duration = duration
// Aniamtion
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
y: y,
width: circleSize,
height: circleSize)
animation.beginTime = beginTime + beginTimes[i]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift
================================================
//
// NVActivityIndicatorBallClipRotate.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallClipRotate: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 0.75
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.values = [1, 0.6, 1]
// Rotate animation
let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotateAnimation.keyTimes = scaleAnimation.keyTimes
rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, rotateAnimation]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle
let circle = NVActivityIndicatorShape.ringThirdFour.layerWith(size: CGSize(width: size.width, height: size.height), color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift
================================================
//
// NVActivityIndicatorAnimationBallClipRotateMultiple.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let bigCircleSize: CGFloat = size.width
let smallCircleSize: CGFloat = size.width / 2
let longDuration: CFTimeInterval = 1
let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
circleOf(shape: .ringTwoHalfHorizontal,
duration: longDuration,
timingFunction: timingFunction,
layer: layer,
size: bigCircleSize,
color: color, reverse: false)
circleOf(shape: .ringTwoHalfVertical,
duration: longDuration,
timingFunction: timingFunction,
layer: layer,
size: smallCircleSize,
color: color, reverse: true)
}
func createAnimationIn(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, reverse: Bool) -> CAAnimation {
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [1, 0.6, 1]
scaleAnimation.duration = duration
// Rotate animation
let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotateAnimation.keyTimes = scaleAnimation.keyTimes
rotateAnimation.timingFunctions = [timingFunction, timingFunction]
if !reverse {
rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
} else {
rotateAnimation.values = [0, -Double.pi, -2 * Double.pi]
}
rotateAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, rotateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
return animation
}
// swiftlint:disable:next function_parameter_count
func circleOf(shape: NVActivityIndicatorShape, duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGFloat, color: UIColor, reverse: Bool) {
let circle = shape.layerWith(size: CGSize(width: size, height: size), color: color)
let frame = CGRect(x: (layer.bounds.size.width - size) / 2,
y: (layer.bounds.size.height - size) / 2,
width: size,
height: size)
let animation = createAnimationIn(duration: duration, timingFunction: timingFunction, reverse: reverse)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift
================================================
//
// NVActivityIndicatorAnimationBallClipRotatePulse.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 1
let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)
smallCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)
bigCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)
}
func smallCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {
// Animation
let animation = CAKeyframeAnimation(keyPath: "transform.scale")
animation.keyTimes = [0, 0.3, 1]
animation.timingFunctions = [timingFunction, timingFunction]
animation.values = [1, 0.3, 1]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle
let circleSize = size.width / 2
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2,
y: (layer.bounds.size.height - circleSize) / 2,
width: circleSize,
height: circleSize)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
func bigCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [1, 0.6, 1]
scaleAnimation.duration = duration
// Rotate animation
let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotateAnimation.keyTimes = scaleAnimation.keyTimes
rotateAnimation.timingFunctions = [timingFunction, timingFunction]
rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
rotateAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, rotateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle
let circle = NVActivityIndicatorShape.ringTwoHalfVertical.layerWith(size: size, color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift
================================================
//
// NVActivityIndicatorAnimationBallsBounce.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallDoubleBounce: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
for index in (0...1) {
bouncingBall(in: layer, size: size, color: color, startingAt: CACurrentMediaTime() + Double(index))
}
}
fileprivate func bouncingBall(in layer: CALayer, size: CGSize, color: UIColor, startingAt: CFTimeInterval) {
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.duration = 2
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.values = [-1, 0, -1]
scaleAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
scaleAnimation.repeatCount = HUGE
scaleAnimation.isRemovedOnCompletion = false
let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
scaleAnimation.beginTime = startingAt
circle.frame = frame
circle.opacity = 0.6
circle.add(scaleAnimation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift
================================================
//
// NVActivityIndicatorAnimationBallGridBeat.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallGridBeat: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize = (size.width - circleSpacing * 2) / 3
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - size.height) / 2
let durations = [0.96, 0.93, 1.19, 1.13, 1.34, 0.94, 1.2, 0.82, 1.19]
let beginTime = CACurrentMediaTime()
let beginTimes = [0.36, 0.4, 0.68, 0.41, 0.71, -0.15, -0.12, 0.01, 0.32]
let timingFunction = CAMediaTimingFunction(name: .default)
// Animation
let animation = CAKeyframeAnimation(keyPath: "opacity")
animation.keyTimes = [0, 0.5, 1]
animation.timingFunctions = [timingFunction, timingFunction]
animation.values = [1, 0.7, 1]
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
for j in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),
y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
width: circleSize,
height: circleSize)
animation.duration = durations[3 * i + j]
animation.beginTime = beginTime + beginTimes[3 * i + j]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift
================================================
//
// NVActivityIndicatorAnimationBallGridPulse.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallGridPulse: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize = (size.width - circleSpacing * 2) / 3
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - size.height) / 2
let durations: [CFTimeInterval] = [0.72, 1.02, 1.28, 1.42, 1.45, 1.18, 0.87, 1.45, 1.06]
let beginTime = CACurrentMediaTime()
let beginTimes: [CFTimeInterval] = [ -0.06, 0.25, -0.17, 0.48, 0.31, 0.03, 0.46, 0.78, 0.45]
let timingFunction = CAMediaTimingFunction(name: .default)
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [1, 0.5, 1]
// Opacity animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.keyTimes = [0, 0.5, 1]
opacityAnimation.timingFunctions = [timingFunction, timingFunction]
opacityAnimation.values = [1, 0.7, 1]
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
for j in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),
y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
width: circleSize,
height: circleSize)
animation.duration = durations[3 * i + j]
animation.beginTime = beginTime + beginTimes[3 * i + j]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift
================================================
//
// NVActivityIndicatorAnimationBallPulse.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallPulse: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize: CGFloat = (size.width - 2 * circleSpacing) / 3
let x: CGFloat = (layer.bounds.size.width - size.width) / 2
let y: CGFloat = (layer.bounds.size.height - circleSize) / 2
let duration: CFTimeInterval = 0.75
let beginTime = CACurrentMediaTime()
let beginTimes: [CFTimeInterval] = [0.12, 0.24, 0.36]
let timingFunction = CAMediaTimingFunction(controlPoints: 0.2, 0.68, 0.18, 1.08)
let animation = CAKeyframeAnimation(keyPath: "transform.scale")
// Animation
animation.keyTimes = [0, 0.3, 1]
animation.timingFunctions = [timingFunction, timingFunction]
animation.values = [1, 0.3, 1]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
y: y,
width: circleSize,
height: circleSize)
animation.beginTime = beginTime + beginTimes[i]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift
================================================
//
// NVActivityIndicatorAnimationBallPulseRise.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallPulseRise: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize = (size.width - 4 * circleSpacing) / 5
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - circleSize) / 2
let deltaY = size.height / 2
let duration: CFTimeInterval = 1
let timingFunction = CAMediaTimingFunction(controlPoints: 0.15, 0.46, 0.9, 0.6)
let oddAnimation = self.oddAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)
let evenAnimation = self.evenAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)
// Draw circles
for i in 0 ..< 5 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
y: y,
width: circleSize,
height: circleSize)
circle.frame = frame
if i % 2 == 0 {
circle.add(evenAnimation, forKey: "animation")
} else {
circle.add(oddAnimation, forKey: "animation")
}
layer.addSublayer(circle)
}
}
func oddAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [0.4, 1.1, 0.75]
scaleAnimation.duration = duration
// Translate animation
let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation.y")
translateAnimation.keyTimes = [0, 0.25, 0.75, 1]
translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]
translateAnimation.values = [0, deltaY, -deltaY, 0]
translateAnimation.duration = duration
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, translateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
return animation
}
func evenAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [1.1, 0.4, 1]
scaleAnimation.duration = duration
// Translate animation
let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation.y")
translateAnimation.keyTimes = [0, 0.25, 0.75, 1]
translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]
translateAnimation.values = [0, -deltaY, deltaY, 0]
translateAnimation.duration = duration
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, translateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
return animation
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift
================================================
//
// NVActivityIndicatorAnimationBallPulseSync.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallPulseSync: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = 2
let circleSize = (size.width - circleSpacing * 2) / 3
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - circleSize) / 2
let deltaY = (size.height / 2 - circleSize / 2) / 2
let duration: CFTimeInterval = 0.6
let beginTime = CACurrentMediaTime()
let beginTimes: [CFTimeInterval] = [0.07, 0.14, 0.21]
let timingFunciton = CAMediaTimingFunction(name: .easeInEaseOut)
// Animation
let animation = CAKeyframeAnimation(keyPath: "transform.translation.y")
animation.keyTimes = [0, 0.33, 0.66, 1]
animation.timingFunctions = [timingFunciton, timingFunciton, timingFunciton]
animation.values = [0, deltaY, -deltaY, 0]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
y: y,
width: circleSize,
height: circleSize)
animation.beginTime = beginTime + beginTimes[i]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift
================================================
//
// NVActivityIndicatorAnimationBallRotate.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallRotate: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSize: CGFloat = size.width / 5
let duration: CFTimeInterval = 1
let timingFunction = CAMediaTimingFunction(controlPoints: 0.7, -0.13, 0.22, 0.86)
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction]
scaleAnimation.values = [1, 0.6, 1]
scaleAnimation.duration = duration
// Rotate animation
let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotateAnimation.keyTimes = [0, 0.5, 1]
rotateAnimation.timingFunctions = [timingFunction, timingFunction]
rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
rotateAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, rotateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
let leftCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let rightCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let centerCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
leftCircle.opacity = 0.8
leftCircle.frame = CGRect(x: 0, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)
rightCircle.opacity = 0.8
rightCircle.frame = CGRect(x: size.width - circleSize, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)
centerCircle.frame = CGRect(x: (size.width - circleSize) / 2, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)
let circle = CALayer()
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2, y: (layer.bounds.size.height - size.height) / 2, width: size.width, height: size.height)
circle.frame = frame
circle.addSublayer(leftCircle)
circle.addSublayer(rightCircle)
circle.addSublayer(centerCircle)
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift
================================================
//
// NVActivityIndicatorAnimationBallRotateChase.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSize = size.width / 5
// Draw circles
for i in 0 ..< 5 {
let factor = Float(i) * 1 / 5
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
let animation = rotateAnimation(factor, x: layer.bounds.size.width / 2, y: layer.bounds.size.height / 2, size: CGSize(width: size.width - circleSize, height: size.height - circleSize))
circle.frame = CGRect(x: 0, y: 0, width: circleSize, height: circleSize)
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
func rotateAnimation(_ rate: Float, x: CGFloat, y: CGFloat, size: CGSize) -> CAAnimationGroup {
let duration: CFTimeInterval = 1.5
let fromScale = 1 - rate
let toScale = 0.2 + rate
let timeFunc = CAMediaTimingFunction(controlPoints: 0.5, 0.15 + rate, 0.25, 1)
// Scale animation
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
scaleAnimation.duration = duration
scaleAnimation.repeatCount = HUGE
scaleAnimation.fromValue = fromScale
scaleAnimation.toValue = toScale
// Position animation
let positionAnimation = CAKeyframeAnimation(keyPath: "position")
positionAnimation.duration = duration
positionAnimation.repeatCount = HUGE
positionAnimation.path = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: CGFloat(3 * Double.pi * 0.5), endAngle: CGFloat(3 * Double.pi * 0.5 + 2 * Double.pi), clockwise: true).cgPath
// Aniamtion
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, positionAnimation]
animation.timingFunction = timeFunc
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
return animation
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift
================================================
//
// NVActivityIndicatorAnimationBallScale.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallScale: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 1
// Scale animation
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
scaleAnimation.duration = duration
scaleAnimation.fromValue = 0
scaleAnimation.toValue = 1
// Opacity animation
let opacityAnimation = CABasicAnimation(keyPath: "opacity")
opacityAnimation.duration = duration
opacityAnimation.fromValue = 1
opacityAnimation.toValue = 0
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle
let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
circle.frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift
================================================
//
// NVActivityIndicatorAnimationBallScaleMultiple.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 1
let beginTime = CACurrentMediaTime()
let beginTimes = [0, 0.2, 0.4]
// Scale animation
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
scaleAnimation.duration = duration
scaleAnimation.fromValue = 0
scaleAnimation.toValue = 1
// Opacity animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.duration = duration
opacityAnimation.keyTimes = [0, 0.05, 1]
opacityAnimation.values = [0, 1, 0]
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw balls
for i in 0 ..< 3 {
let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
animation.beginTime = beginTime + beginTimes[i]
circle.frame = frame
circle.opacity = 0
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift
================================================
//
// NVActivityIndicatorAnimationBallScaleRipple.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallScaleRipple: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 1
let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.7]
scaleAnimation.timingFunction = timingFunction
scaleAnimation.values = [0.1, 1]
scaleAnimation.duration = duration
// Opacity animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.keyTimes = [0, 0.7, 1]
opacityAnimation.timingFunctions = [timingFunction, timingFunction]
opacityAnimation.values = [1, 0.7, 0]
opacityAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle
let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
================================================
//
// NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallScaleRippleMultiple: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let duration: CFTimeInterval = 1.25
let beginTime = CACurrentMediaTime()
let beginTimes = [0, 0.2, 0.4]
let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.7]
scaleAnimation.timingFunction = timingFunction
scaleAnimation.values = [0, 1]
scaleAnimation.duration = duration
// Opacity animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.keyTimes = [0, 0.7, 1]
opacityAnimation.timingFunctions = [timingFunction, timingFunction]
opacityAnimation.values = [1, 0.7, 0]
opacityAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 3 {
let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)
let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
y: (layer.bounds.size.height - size.height) / 2,
width: size.width,
height: size.height)
animation.beginTime = beginTime + beginTimes[i]
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift
================================================
//
// NVActivityIndicatorAnimationBallSpinFadeLoader.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSpacing: CGFloat = -2
let circleSize = (size.width - 4 * circleSpacing) / 5
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - size.height) / 2
let duration: CFTimeInterval = 1
let beginTime = CACurrentMediaTime()
let beginTimes: [CFTimeInterval] = [0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84]
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.5, 1]
scaleAnimation.values = [1, 0.4, 1]
scaleAnimation.duration = duration
// Opacity animation
let opacityAnimaton = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimaton.keyTimes = [0, 0.5, 1]
opacityAnimaton.values = [1, 0.3, 1]
opacityAnimaton.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, opacityAnimaton]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circles
for i in 0 ..< 8 {
let circle = circleAt(angle: CGFloat(Double.pi / 4) * CGFloat(i),
size: circleSize,
origin: CGPoint(x: x, y: y),
containerSize: size,
color: color)
animation.beginTime = beginTime + beginTimes[i]
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
func circleAt(angle: CGFloat, size: CGFloat, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer {
let radius = containerSize.width / 2 - size / 2
let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: size, height: size), color: color)
let frame = CGRect(
x: origin.x + radius * (cos(angle) + 1),
y: origin.y + radius * (sin(angle) + 1),
width: size,
height: size)
circle.frame = frame
return circle
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift
================================================
//
// NVActivityIndicatorAnimationBallTrianglePath.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallTrianglePath: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSize = size.width / 5
let deltaX = size.width / 2 - circleSize / 2
let deltaY = size.height / 2 - circleSize / 2
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - size.height) / 2
let duration: CFTimeInterval = 2
let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
// Animation
let animation = CAKeyframeAnimation(keyPath: "transform")
animation.keyTimes = [0, 0.33, 0.66, 1]
animation.timingFunctions = [timingFunction, timingFunction, timingFunction]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Top-center circle
let topCenterCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
changeAnimation(animation, values: ["{0,0}", "{hx,fy}", "{-hx,fy}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
topCenterCircle.frame = CGRect(x: x + size.width / 2 - circleSize / 2, y: y, width: circleSize, height: circleSize)
topCenterCircle.add(animation, forKey: "animation")
layer.addSublayer(topCenterCircle)
// Bottom-left circle
let bottomLeftCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
changeAnimation(animation, values: ["{0,0}", "{hx,-fy}", "{fx,0}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
bottomLeftCircle.frame = CGRect(x: x, y: y + size.height - circleSize, width: circleSize, height: circleSize)
bottomLeftCircle.add(animation, forKey: "animation")
layer.addSublayer(bottomLeftCircle)
// Bottom-right circle
let bottomRightCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
changeAnimation(animation, values: ["{0,0}", "{-fx,0}", "{-hx,-fy}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
bottomRightCircle.frame = CGRect(x: x + size.width - circleSize, y: y + size.height - circleSize, width: circleSize, height: circleSize)
bottomRightCircle.add(animation, forKey: "animation")
layer.addSublayer(bottomRightCircle)
}
func changeAnimation(_ animation: CAKeyframeAnimation, values rawValues: [String], deltaX: CGFloat, deltaY: CGFloat) {
let values = NSMutableArray(capacity: 5)
for rawValue in rawValues {
let point = NSCoder.cgPoint(for: translateString(rawValue, deltaX: deltaX, deltaY: deltaY))
values.add(NSValue(caTransform3D: CATransform3DMakeTranslation(point.x, point.y, 0)))
}
animation.values = values as [AnyObject]
}
func translateString(_ valueString: String, deltaX: CGFloat, deltaY: CGFloat) -> String {
let valueMutableString = NSMutableString(string: valueString)
let fullDeltaX = 2 * deltaX
let fullDeltaY = 2 * deltaY
var range = NSRange(location: 0, length: valueMutableString.length)
valueMutableString.replaceOccurrences(of: "hx", with: "\(deltaX)", options: NSString.CompareOptions.caseInsensitive, range: range)
range.length = valueMutableString.length
valueMutableString.replaceOccurrences(of: "fx", with: "\(fullDeltaX)", options: NSString.CompareOptions.caseInsensitive, range: range)
range.length = valueMutableString.length
valueMutableString.replaceOccurrences(of: "hy", with: "\(deltaY)", options: NSString.CompareOptions.caseInsensitive, range: range)
range.length = valueMutableString.length
valueMutableString.replaceOccurrences(of: "fy", with: "\(fullDeltaY)", options: NSString.CompareOptions.caseInsensitive, range: range)
return valueMutableString as String
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift
================================================
//
// NVActivityIndicatorAnimationBallZigZag.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
import QuartzCore
class NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSize: CGFloat = size.width / 5
let duration: CFTimeInterval = 0.7
let deltaX = size.width / 2 - circleSize / 2
let deltaY = size.height / 2 - circleSize / 2
let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)
// Circle 1 animation
let animation = CAKeyframeAnimation(keyPath: "transform")
animation.keyTimes = [0, 0.33, 0.66, 1]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.values = [
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw circle 1
circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
// Circle 2 animation
animation.values = [
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
]
// Draw circle 2
circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
}
func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {
let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift
================================================
//
// NVActivityIndicatorAnimationBallZigZagDeflect.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let circleSize: CGFloat = size.width / 5
let duration: CFTimeInterval = 0.75
let deltaX = size.width / 2 - circleSize / 2
let deltaY = size.height / 2 - circleSize / 2
let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)
// Circle 1 animation
let animation = CAKeyframeAnimation(keyPath: "transform")
animation.keyTimes = [0, 0.33, 0.66, 1]
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.values = [
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
]
animation.duration = duration
animation.repeatCount = HUGE
animation.autoreverses = true
animation.isRemovedOnCompletion = false
// Draw circle 1
circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
// Circle 2 animation
animation.values = [
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),
NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
]
// Draw circle 2
circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
}
func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {
let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
circle.frame = frame
circle.add(animation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift
================================================
//
// NVActivityIndicatorAnimationBlank.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationBlank: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in _: CALayer, size _: CGSize, color _: UIColor) {
// Do nothing
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift
================================================
//
// NVActivityIndicatorAnimationCircleStrokeSpin.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let beginTime: Double = 0.5
let strokeStartDuration: Double = 1.2
let strokeEndDuration: Double = 0.7
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation.byValue = Float.pi * 2
rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear)
let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
strokeEndAnimation.duration = strokeEndDuration
strokeEndAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)
strokeEndAnimation.fromValue = 0
strokeEndAnimation.toValue = 1
let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")
strokeStartAnimation.duration = strokeStartDuration
strokeStartAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)
strokeStartAnimation.fromValue = 0
strokeStartAnimation.toValue = 1
strokeStartAnimation.beginTime = beginTime
let groupAnimation = CAAnimationGroup()
groupAnimation.animations = [rotationAnimation, strokeEndAnimation, strokeStartAnimation]
groupAnimation.duration = strokeStartDuration + beginTime
groupAnimation.repeatCount = .infinity
groupAnimation.isRemovedOnCompletion = false
groupAnimation.fillMode = .forwards
let circle = NVActivityIndicatorShape.stroke.layerWith(size: size, color: color)
let frame = CGRect(
x: (layer.bounds.width - size.width) / 2,
y: (layer.bounds.height - size.height) / 2,
width: size.width,
height: size.height
)
circle.frame = frame
circle.add(groupAnimation, forKey: "animation")
layer.addSublayer(circle)
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift
================================================
//
// NVActivityIndicatorAnimationCubeTransition.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
#if canImport(UIKit)
import UIKit
class NVActivityIndicatorAnimationCubeTransition: NVActivityIndicatorAnimationDelegate {
func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
let squareSize = size.width / 5
let x = (layer.bounds.size.width - size.width) / 2
let y = (layer.bounds.size.height - size.height) / 2
let deltaX = size.width - squareSize
let deltaY = size.height - squareSize
let duration: CFTimeInterval = 1.6
let beginTime = CACurrentMediaTime()
let beginTimes: [CFTimeInterval] = [0, -0.8]
let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
// Scale animation
let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
scaleAnimation.keyTimes = [0, 0.25, 0.5, 0.75, 1]
scaleAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]
scaleAnimation.values = [1, 0.5, 1, 0.5, 1]
scaleAnimation.duration = duration
// Translate animation
let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation")
translateAnimation.keyTimes = scaleAnimation.keyTimes
translateAnimation.timingFunctions = scaleAnimation.timingFunctions
translateAnimation.values = [
NSValue(cgSize: CGSize(width: 0, height: 0)),
NSValue(cgSize: CGSize(width: deltaX, height: 0)),
NSValue(cgSize: CGSize(width: deltaX, height: deltaY)),
NSValue(cgSize: CGSize(width: 0, height: deltaY)),
NSValue(cgSize: CGSize(width: 0, height: 0))
]
translateAnimation.duration = duration
// Rotate animation
let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")
rotateAnimation.keyTimes = scaleAnimation.keyTimes
rotateAnimation.timingFunctions = scaleAnimation.timingFunctions
rotateAnimation.values = [0, -Double.pi / 2, -Double.pi, -1.5 * Double.pi, -2 * Double.pi]
rotateAnimation.duration = duration
// Animation
let animation = CAAnimationGroup()
animation.animations = [scaleAnimation, translateAnimation, rotateAnimation]
animation.duration = duration
animation.repeatCount = HUGE
animation.isRemovedOnCompletion = false
// Draw squares
for i in 0 ..< 2 {
let square = NVActivityIndicatorShape.rectangle.layerWith(size: CGSize(width: squareSize, height: squareSize), color: color)
let frame = CGRect(x: x, y: y, width: squareSize, height: squareSize)
animation.beginTime = beginTime + beginTimes[i]
square.frame = frame
square.add(animation, forKey: "animation")
layer.addSublayer(square)
}
}
}
#endif
================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift
================================================
//
// NVActivityIndicatorAnimationBarScale.swift
// NVActivityIndicatorView
//
// The MIT License (MIT)
// Copyright (c) 2016 Vinh Nguyen
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice sha
gitextract_aoakydhx/
├── .github/
│ └── workflows/
│ └── ios.yml
├── .gitignore
├── .jazzy.yaml
├── .swiftlint.yml
├── CHANGELOG.md
├── Example/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── SceneDelegate.swift
│ └── ViewController.swift
├── LICENSE
├── NVActivityIndicatorView.podspec
├── NVActivityIndicatorView.xcodeproj/
│ ├── NVActivityIndicatorViewExtended_Info.plist
│ ├── NVActivityIndicatorView_Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Example.xcscheme
│ └── NVActivityIndicatorView-Package.xcscheme
├── Package.swift
├── PrivacyInfo.xcprivacy
├── README.md
├── Sources/
│ ├── Base/
│ │ ├── Animations/
│ │ │ ├── NVActivityIndicatorAnimationAudioEqualizer.swift
│ │ │ ├── NVActivityIndicatorAnimationBallBeat.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotate.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotateMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallClipRotatePulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallDoubleBounce.swift
│ │ │ ├── NVActivityIndicatorAnimationBallGridBeat.swift
│ │ │ ├── NVActivityIndicatorAnimationBallGridPulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulse.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulseRise.swift
│ │ │ ├── NVActivityIndicatorAnimationBallPulseSync.swift
│ │ │ ├── NVActivityIndicatorAnimationBallRotate.swift
│ │ │ ├── NVActivityIndicatorAnimationBallRotateChase.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScale.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleRipple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
│ │ │ ├── NVActivityIndicatorAnimationBallSpinFadeLoader.swift
│ │ │ ├── NVActivityIndicatorAnimationBallTrianglePath.swift
│ │ │ ├── NVActivityIndicatorAnimationBallZigZag.swift
│ │ │ ├── NVActivityIndicatorAnimationBallZigZagDeflect.swift
│ │ │ ├── NVActivityIndicatorAnimationBlank.swift
│ │ │ ├── NVActivityIndicatorAnimationCircleStrokeSpin.swift
│ │ │ ├── NVActivityIndicatorAnimationCubeTransition.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScale.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScaleParty.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScalePulseOut.swift
│ │ │ ├── NVActivityIndicatorAnimationLineScalePulseOutRapid.swift
│ │ │ ├── NVActivityIndicatorAnimationLineSpinFadeLoader.swift
│ │ │ ├── NVActivityIndicatorAnimationOrbit.swift
│ │ │ ├── NVActivityIndicatorAnimationPacman.swift
│ │ │ ├── NVActivityIndicatorAnimationSemiCircleSpin.swift
│ │ │ ├── NVActivityIndicatorAnimationSquareSpin.swift
│ │ │ └── NVActivityIndicatorAnimationTriangleSkewSpin.swift
│ │ ├── NVActivityIndicatorAnimationDelegate.swift
│ │ ├── NVActivityIndicatorShape.swift
│ │ └── NVActivityIndicatorView.swift
│ └── Extended/
│ ├── NVActivityIndicatorPresenter.swift
│ └── NVActivityIndicatorViewable.swift
├── Tests/
│ ├── ActivityDataTests.swift
│ ├── Info.plist
│ ├── NVActivityIndicatorPresenterTests.swift
│ ├── NVActivityIndicatorTypeTests.swift
│ ├── NVActivityIndicatorViewTests.swift
│ └── Tests-Bridging-Header.h
├── docs/
│ ├── CNAME
│ ├── Classes/
│ │ └── NVActivityIndicatorView.html
│ ├── Classes.html
│ ├── Enums/
│ │ └── NVActivityIndicatorType.html
│ ├── Enums.html
│ ├── Typealiases.html
│ ├── css/
│ │ ├── highlight.css
│ │ └── jazzy.css
│ ├── docsets/
│ │ ├── NVActivityIndicatorView.docset/
│ │ │ └── Contents/
│ │ │ ├── Info.plist
│ │ │ └── Resources/
│ │ │ ├── Documents/
│ │ │ │ ├── Classes/
│ │ │ │ │ └── NVActivityIndicatorView.html
│ │ │ │ ├── Classes.html
│ │ │ │ ├── Enums/
│ │ │ │ │ └── NVActivityIndicatorType.html
│ │ │ │ ├── Enums.html
│ │ │ │ ├── Typealiases.html
│ │ │ │ ├── css/
│ │ │ │ │ ├── highlight.css
│ │ │ │ │ └── jazzy.css
│ │ │ │ ├── index.html
│ │ │ │ └── js/
│ │ │ │ ├── jazzy.js
│ │ │ │ ├── jazzy.search.js
│ │ │ │ └── typeahead.jquery.js
│ │ │ └── docSet.dsidx
│ │ └── NVActivityIndicatorView.tgz
│ ├── index.html
│ ├── js/
│ │ ├── jazzy.js
│ │ ├── jazzy.search.js
│ │ └── typeahead.jquery.js
│ └── undocumented.json
└── scripts/
└── bump-version.sh
SYMBOL INDEX (100 symbols across 6 files)
FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.js
function toggleItem (line 15) | function toggleItem($link, $content) {
function itemLinkToContent (line 21) | function itemLinkToContent($link) {
function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {
FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.search.js
function displayTemplate (line 10) | function displayTemplate(result) {
function suggestionTemplate (line 14) | function suggestionTemplate(result) {
FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/typeahead.jquery.js
function reverseArgs (line 55) | function reverseArgs(index, value) {
function template (line 100) | function template() {
function _p8 (line 153) | function _p8(s) {
function build (line 178) | function build(o) {
function buildHtml (line 197) | function buildHtml(c) {
function buildSelectors (line 203) | function buildSelectors(classes) {
function buildCss (line 210) | function buildCss() {
function EventBus (line 267) | function EventBus(o) {
function on (line 304) | function on(method, types, cb, context) {
function onAsync (line 321) | function onAsync(types, cb, context) {
function onSync (line 324) | function onSync(types, cb, context) {
function off (line 327) | function off(types) {
function trigger (line 338) | function trigger(types) {
function getFlush (line 352) | function getFlush(callbacks, context, args) {
function getNextTick (line 362) | function getNextTick() {
function bindContext (line 379) | function bindContext(fn, context) {
function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
function traverse (line 445) | function traverse(el, hightlightTextNode) {
function accent_replacer (line 457) | function accent_replacer(chr) {
function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
function Input (line 485) | function Input(o, www) {
function buildOverflowHelper (line 685) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 702) | function areQueriesEquivalent(a, b) {
function withModifier (line 705) | function withModifier($e) {
function Dataset (line 718) | function Dataset(o, www) {
function sync (line 859) | function sync(suggestions) {
function async (line 871) | function async(suggestions) {
function getDisplayFn (line 896) | function getDisplayFn(display) {
function getTemplates (line 903) | function getTemplates(templates, displayFn) {
function isValidName (line 919) | function isValidName(str) {
function Menu (line 925) | function Menu(o, www) {
function updateDataset (line 1047) | function updateDataset(dataset) {
function clearDataset (line 1055) | function clearDataset(dataset) {
function destroyDataset (line 1063) | function destroyDataset(dataset) {
function Status (line 1072) | function Status(options) {
function DefaultMenu (line 1122) | function DefaultMenu() {
function Typeahead (line 1165) | function Typeahead(o, www) {
function c (line 1448) | function c(ctx) {
function attach (line 1474) | function attach() {
function ttEach (line 1633) | function ttEach($els, fn) {
function buildHintFromInput (line 1639) | function buildHintFromInput($input, www) {
function prepInput (line 1648) | function prepInput($input, www) {
function getBackgroundStyles (line 1663) | function getBackgroundStyles($el) {
function revert (line 1675) | function revert($input) {
function $elOrNull (line 1688) | function $elOrNull(obj) {
FILE: docs/js/jazzy.js
function toggleItem (line 15) | function toggleItem($link, $content) {
function itemLinkToContent (line 21) | function itemLinkToContent($link) {
function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {
FILE: docs/js/jazzy.search.js
function displayTemplate (line 10) | function displayTemplate(result) {
function suggestionTemplate (line 14) | function suggestionTemplate(result) {
FILE: docs/js/typeahead.jquery.js
function reverseArgs (line 55) | function reverseArgs(index, value) {
function template (line 100) | function template() {
function _p8 (line 153) | function _p8(s) {
function build (line 178) | function build(o) {
function buildHtml (line 197) | function buildHtml(c) {
function buildSelectors (line 203) | function buildSelectors(classes) {
function buildCss (line 210) | function buildCss() {
function EventBus (line 267) | function EventBus(o) {
function on (line 304) | function on(method, types, cb, context) {
function onAsync (line 321) | function onAsync(types, cb, context) {
function onSync (line 324) | function onSync(types, cb, context) {
function off (line 327) | function off(types) {
function trigger (line 338) | function trigger(types) {
function getFlush (line 352) | function getFlush(callbacks, context, args) {
function getNextTick (line 362) | function getNextTick() {
function bindContext (line 379) | function bindContext(fn, context) {
function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
function traverse (line 445) | function traverse(el, hightlightTextNode) {
function accent_replacer (line 457) | function accent_replacer(chr) {
function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
function Input (line 485) | function Input(o, www) {
function buildOverflowHelper (line 685) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 702) | function areQueriesEquivalent(a, b) {
function withModifier (line 705) | function withModifier($e) {
function Dataset (line 718) | function Dataset(o, www) {
function sync (line 859) | function sync(suggestions) {
function async (line 871) | function async(suggestions) {
function getDisplayFn (line 896) | function getDisplayFn(display) {
function getTemplates (line 903) | function getTemplates(templates, displayFn) {
function isValidName (line 919) | function isValidName(str) {
function Menu (line 925) | function Menu(o, www) {
function updateDataset (line 1047) | function updateDataset(dataset) {
function clearDataset (line 1055) | function clearDataset(dataset) {
function destroyDataset (line 1063) | function destroyDataset(dataset) {
function Status (line 1072) | function Status(options) {
function DefaultMenu (line 1122) | function DefaultMenu() {
function Typeahead (line 1165) | function Typeahead(o, www) {
function c (line 1448) | function c(ctx) {
function attach (line 1474) | function attach() {
function ttEach (line 1633) | function ttEach($els, fn) {
function buildHintFromInput (line 1639) | function buildHintFromInput($input, www) {
function prepInput (line 1648) | function prepInput($input, www) {
function getBackgroundStyles (line 1663) | function getBackgroundStyles($el) {
function revert (line 1675) | function revert($input) {
function $elOrNull (line 1688) | function $elOrNull(obj) {
Condensed preview — 100 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (667K chars).
[
{
"path": ".github/workflows/ios.yml",
"chars": 2475,
"preview": "name: iOS starter workflow\n\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n\njobs:\n b"
},
{
"path": ".gitignore",
"chars": 2570,
"preview": "# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might app"
},
{
"path": ".jazzy.yaml",
"chars": 397,
"preview": "readme: README.md\nauthor: Vinh Nguyen\nauthor_url: https://github.com/ninjaprox\ngithub_url: https://github.com/ninjaprox/"
},
{
"path": ".swiftlint.yml",
"chars": 148,
"preview": "disabled_rules:\n- line_length\n\ntype_name:\n max_length: 60\nidentifier_name:\n excluded:\n - x\n - y\n - i\n - j\nfunction"
},
{
"path": "CHANGELOG.md",
"chars": 7310,
"preview": "# Change log\n\n## [5.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.2.0)\n\n- Add privacy manif"
},
{
"path": "Example/AppDelegate.swift",
"chars": 2444,
"preview": "//\n// AppDelegate.swift\n// Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is he"
},
{
"path": "Example/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Example/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Example/Base.lproj/LaunchScreen.storyboard",
"chars": 1665,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Example/Base.lproj/Main.storyboard",
"chars": 1604,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Example/Info.plist",
"chars": 2008,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/SceneDelegate.swift",
"chars": 3375,
"preview": "//\n// SceneDelegate.swift\n// Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is "
},
{
"path": "Example/ViewController.swift",
"chars": 4444,
"preview": "//\n// ViewController.swift\n// Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is"
},
{
"path": "LICENSE",
"chars": 1078,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Vinh Nguyen\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "NVActivityIndicatorView.podspec",
"chars": 1120,
"preview": "Pod::Spec.new do |s|\n s.name = 'NVActivityIndicatorView'\n s.version = '5.2.0'\n s.summary "
},
{
"path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist",
"chars": 784,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist",
"chars": 784,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NVActivityIndicatorView.xcodeproj/project.pbxproj",
"chars": 62849,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 134,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 269,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 402,
"preview": "{\n \"originHash\" : \"1fa961aa1dc717cea452f3389668f0f99a254f07e4eb11d190768a53798f744f\",\n \"pins\" : [\n {\n \"identit"
},
{
"path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example.xcscheme",
"chars": 3320,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2630\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView-Package.xcscheme",
"chars": 2766,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2630\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Package.swift",
"chars": 743,
"preview": "// swift-tools-version:5.0\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "PrivacyInfo.xcprivacy",
"chars": 228,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "README.md",
"chars": 4804,
"preview": "# NVActivityIndicatorView\n\n[\n\n// Copy"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift",
"chars": 3193,
"preview": "//\n// NVActivityIndicatorAnimationBallBeat.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright "
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift",
"chars": 2751,
"preview": "//\n// NVActivityIndicatorBallClipRotate.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift",
"chars": 4157,
"preview": "//\n// NVActivityIndicatorAnimationBallClipRotateMultiple.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift",
"chars": 4415,
"preview": "//\n// NVActivityIndicatorAnimationBallClipRotatePulse.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n//"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift",
"chars": 2646,
"preview": "//\n// NVActivityIndicatorAnimationBallsBounce.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrig"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift",
"chars": 3059,
"preview": "//\n// NVActivityIndicatorAnimationBallGridBeat.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyri"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift",
"chars": 3538,
"preview": "//\n// NVActivityIndicatorAnimationBallGridPulse.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift",
"chars": 2890,
"preview": "//\n// NVActivityIndicatorAnimationBallPulse.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift",
"chars": 4905,
"preview": "//\n// NVActivityIndicatorAnimationBallPulseRise.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift",
"chars": 2959,
"preview": "//\n// NVActivityIndicatorAnimationBallPulseSync.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift",
"chars": 3839,
"preview": "//\n// NVActivityIndicatorAnimationBallRotate.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift",
"chars": 3411,
"preview": "//\n// NVActivityIndicatorAnimationBallRotateChase.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Cop"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift",
"chars": 2693,
"preview": "//\n// NVActivityIndicatorAnimationBallScale.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift",
"chars": 2982,
"preview": "//\n// NVActivityIndicatorAnimationBallScaleMultiple.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift",
"chars": 2897,
"preview": "//\n// NVActivityIndicatorAnimationBallScaleRipple.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Cop"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift",
"chars": 3128,
"preview": "//\n// NVActivityIndicatorAnimationBallScaleRippleMultiple.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift",
"chars": 3690,
"preview": "//\n// NVActivityIndicatorAnimationBallSpinFadeLoader.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// "
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift",
"chars": 5285,
"preview": "//\n// NVActivityIndicatorAnimationBallTrianglePath.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift",
"chars": 3533,
"preview": "//\n// NVActivityIndicatorAnimationBallZigZag.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift",
"chars": 3568,
"preview": "//\n// NVActivityIndicatorAnimationBallZigZagDeflect.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift",
"chars": 1439,
"preview": "//\n// NVActivityIndicatorAnimationBlank.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift",
"chars": 3238,
"preview": "//\n// NVActivityIndicatorAnimationCircleStrokeSpin.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift",
"chars": 4059,
"preview": "//\n// NVActivityIndicatorAnimationCubeTransition.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift",
"chars": 2656,
"preview": "//\n// NVActivityIndicatorAnimationBarScale.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright "
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift",
"chars": 2672,
"preview": "//\n// NVActivityIndicatorAnimationLineScaleParty.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift",
"chars": 2765,
"preview": "//\n// NVActivityIndicatorAnimationLineScalePulseOut.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift",
"chars": 2821,
"preview": "//\n// NVActivityIndicatorAnimationLineScalePulseOutRapid.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift",
"chars": 3964,
"preview": "//\n// NVActivityIndicatorAnimationLineSpinFadeLoader.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// "
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift",
"chars": 7559,
"preview": "//\n// NVActivityIndicatorAnimationOrbit.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift",
"chars": 4741,
"preview": "//\n// NVActivityIndicatorAnimationPacman.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift",
"chars": 2242,
"preview": "//\n// NVActivityIndicatorAnimationSemiCircleSpin.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift",
"chars": 3547,
"preview": "//\n// NVActivityIndicatorAnimationSquareSpin.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
},
{
"path": "Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift",
"chars": 3497,
"preview": "//\n// NVActivityIndicatorAnimationTriangleSkewSpin.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
},
{
"path": "Sources/Base/NVActivityIndicatorAnimationDelegate.swift",
"chars": 1420,
"preview": "//\n// NVActivityIndicatorDelegate.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 "
},
{
"path": "Sources/Base/NVActivityIndicatorShape.swift",
"chars": 7235,
"preview": "//\n// NVActivityIndicatorShape.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vin"
},
{
"path": "Sources/Base/NVActivityIndicatorView.swift",
"chars": 18847,
"preview": "//\n// NVActivityIndicatorView.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh"
},
{
"path": "Sources/Extended/NVActivityIndicatorPresenter.swift",
"chars": 14928,
"preview": "//\n// NVActivityIndicatorPresenter.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016"
},
{
"path": "Sources/Extended/NVActivityIndicatorViewable.swift",
"chars": 4176,
"preview": "//\n// NVActivityIndicatorViewable.swift\n// NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 "
},
{
"path": "Tests/ActivityDataTests.swift",
"chars": 4121,
"preview": "//\n// ActivityDataTests.swift\n// NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh N"
},
{
"path": "Tests/Info.plist",
"chars": 730,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/NVActivityIndicatorPresenterTests.swift",
"chars": 7860,
"preview": "//\n// NVActivityIndicatorPresenterTests.swift\n// NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright"
},
{
"path": "Tests/NVActivityIndicatorTypeTests.swift",
"chars": 4450,
"preview": "//\n// NVActivityIndicatorTypeTests.swift\n// NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) "
},
{
"path": "Tests/NVActivityIndicatorViewTests.swift",
"chars": 5161,
"preview": "//\n// NVActivityIndicatorViewTests.swift\n// NVActivityIndicatorViewTests\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
},
{
"path": "Tests/Tests-Bridging-Header.h",
"chars": 104,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
},
{
"path": "docs/CNAME",
"chars": 33,
"preview": "nvactivityindicatorview.vinhis.me"
},
{
"path": "docs/Classes/NVActivityIndicatorView.html",
"chars": 22956,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorView Class Reference</title>\n <link rel=\"styl"
},
{
"path": "docs/Classes.html",
"chars": 4471,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Classes Reference</title>\n <link rel=\"stylesheet\" type=\"text/cs"
},
{
"path": "docs/Enums/NVActivityIndicatorType.html",
"chars": 31007,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorType Enumeration Reference</title>\n <link rel"
},
{
"path": "docs/Enums.html",
"chars": 6556,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Enumerations Reference</title>\n <link rel=\"stylesheet\" type=\"te"
},
{
"path": "docs/Typealiases.html",
"chars": 5284,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Type Aliases Reference</title>\n <link rel=\"stylesheet\" type=\"te"
},
{
"path": "docs/css/highlight.css",
"chars": 2864,
"preview": "/*! Jazzy - https://github.com/realm/jazzy\n * Copyright Realm Inc.\n * SPDX-License-Identifier: MIT\n */\n/* Credit to ht"
},
{
"path": "docs/css/jazzy.css",
"chars": 8393,
"preview": "/*! Jazzy - https://github.com/realm/jazzy\n * Copyright Realm Inc.\n * SPDX-License-Identifier: MIT\n */\n*, *:before, *:"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Info.plist",
"chars": 662,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes/NVActivityIndicatorView.html",
"chars": 22956,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorView Class Reference</title>\n <link rel=\"styl"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes.html",
"chars": 4471,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Classes Reference</title>\n <link rel=\"stylesheet\" type=\"text/cs"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums/NVActivityIndicatorType.html",
"chars": 31007,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorType Enumeration Reference</title>\n <link rel"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums.html",
"chars": 6556,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Enumerations Reference</title>\n <link rel=\"stylesheet\" type=\"te"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Typealiases.html",
"chars": 5284,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>Type Aliases Reference</title>\n <link rel=\"stylesheet\" type=\"te"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/highlight.css",
"chars": 2864,
"preview": "/*! Jazzy - https://github.com/realm/jazzy\n * Copyright Realm Inc.\n * SPDX-License-Identifier: MIT\n */\n/* Credit to ht"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/jazzy.css",
"chars": 8393,
"preview": "/*! Jazzy - https://github.com/realm/jazzy\n * Copyright Realm Inc.\n * SPDX-License-Identifier: MIT\n */\n*, *:before, *:"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/index.html",
"chars": 10878,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorView Reference</title>\n <link rel=\"styleshee"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.js",
"chars": 1876,
"preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docs"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.search.js",
"chars": 2100,
"preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n var $"
},
{
"path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/typeahead.jquery.js",
"chars": 70178,
"preview": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and oth"
},
{
"path": "docs/index.html",
"chars": 10878,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>NVActivityIndicatorView Reference</title>\n <link rel=\"styleshee"
},
{
"path": "docs/js/jazzy.js",
"chars": 1876,
"preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docs"
},
{
"path": "docs/js/jazzy.search.js",
"chars": 2100,
"preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n var $"
},
{
"path": "docs/js/typeahead.jquery.js",
"chars": 70178,
"preview": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and oth"
},
{
"path": "docs/undocumented.json",
"chars": 101,
"preview": "{\n \"warnings\": [\n\n ],\n \"source_directory\": \"/Users/vinhnguyen/Workspace/NVActivityIndicatorView\"\n}"
},
{
"path": "scripts/bump-version.sh",
"chars": 217,
"preview": "#!/bin/bash\n\ntype=\"${1:-patch}\"\n\nfastlane run increment_build_number\nfastlane run increment_version_number bump_type:\"$t"
}
]
// ... and 2 more files (download for full content)
About this extraction
This page contains the full source code of the ninjaprox/NVActivityIndicatorView GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 100 files (615.7 KB), approximately 148.9k tokens, and a symbol index with 100 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.