Add project

Add framework and example

Update .gitignore

Update LICENSE

Update LICENSE

Update Package.swift

Update README.md

Rename again

Update readme

Update readme
This commit is contained in:
Alisa Mylnikova
2020-03-19 20:56:38 +07:00
parent 8729eeb504
commit d8c3463e70
22 changed files with 1643 additions and 33 deletions
+64 -28
View File
@@ -1,18 +1,60 @@
# Xcode
# Created by https://www.gitignore.io/api/swift,macos,carthage,cocoapods
# Edit at https://www.gitignore.io/?templates=swift,macos,carthage,cocoapods
### Carthage ###
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
### CocoaPods ###
## CocoaPods GitIgnore Template
# CocoaPods - Only use to conserve bandwidth / Save time on Pushing
# - Also handy if you have a large number of dependant pods
# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
Pods/
### macOS ###
# 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
### Swift ###
# 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 generated
build/
DerivedData/
*.moved-aside
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
@@ -21,11 +63,15 @@ DerivedData/
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
@@ -35,45 +81,34 @@ 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/
# Add this line if you want to avoid checking in Xcode SPM integration.
# .swiftpm/xcode
# 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.
# 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
@@ -83,8 +118,9 @@ 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/
# End of https://www.gitignore.io/api/swift,macos,carthage,cocoapods
+12
View File
@@ -0,0 +1,12 @@
language: swift
osx_image: xcode11.3
branches:
only:
- master
script:
- set -o pipefail && xcodebuild -project ActivityIndicatorView.xcodeproj -scheme 'ActivityIndicatorView' -sdk iphonesimulator13.2 ONLY_ACTIVE_ARCH=NO -destination 'platform=iOS Simulator,OS=13.3,name=iPhone 11 Pro' | xcpretty;
notifications:
slack: exyte:rbHEfGcQnX1drc0KNL0HVudX
+24
View File
@@ -0,0 +1,24 @@
Pod::Spec.new do |s|
s.name = "ActivityIndicatorView"
s.version = "0.0.1"
s.summary = "A number of preset loading indicators created with SwiftUI."
s.homepage = 'https://github.com/exyte/ActivityIndicatorView.git'
s.license = 'MIT'
s.author = { 'exyte' => 'info@exyte.com' }
s.source = { :git => 'https://github.com/exyte/ActivityIndicatorView.git', :tag => s.version.to_s }
s.social_media_url = 'http://exyte.com'
s.ios.deployment_target = '13.0'
s.osx.deployment_target = '10.15'
s.tvos.deployment_target = '13.0'
s.watchos.deployment_target = '6.0'
s.requires_arc = true
s.swift_version = '5.1'
s.source_files = [
'Source/*.h',
'Source/*.swift'
]
end
@@ -0,0 +1,338 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
5B56E7DB2428A1D900A5AF97 /* ActivityIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B56E7D82428A1D900A5AF97 /* ActivityIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; };
5B56E7DC2428A1D900A5AF97 /* ActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B56E7D92428A1D900A5AF97 /* ActivityIndicatorView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
5B56E7D82428A1D900A5AF97 /* ActivityIndicatorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicatorView.h; sourceTree = "<group>"; };
5B56E7D92428A1D900A5AF97 /* ActivityIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityIndicatorView.swift; sourceTree = "<group>"; };
5B56E7DA2428A1D900A5AF97 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5BA1FA342424A5CE00EE4184 /* ActivityIndicatorView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ActivityIndicatorView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5BA1FA312424A5CE00EE4184 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
5B56E7D72428A1D900A5AF97 /* Source */ = {
isa = PBXGroup;
children = (
5B56E7D82428A1D900A5AF97 /* ActivityIndicatorView.h */,
5B56E7D92428A1D900A5AF97 /* ActivityIndicatorView.swift */,
5B56E7DA2428A1D900A5AF97 /* Info.plist */,
);
path = Source;
sourceTree = "<group>";
};
5BA1FA2A2424A5CE00EE4184 = {
isa = PBXGroup;
children = (
5B56E7D72428A1D900A5AF97 /* Source */,
5BA1FA352424A5CE00EE4184 /* Products */,
);
sourceTree = "<group>";
};
5BA1FA352424A5CE00EE4184 /* Products */ = {
isa = PBXGroup;
children = (
5BA1FA342424A5CE00EE4184 /* ActivityIndicatorView.framework */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
5BA1FA2F2424A5CE00EE4184 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
5B56E7DB2428A1D900A5AF97 /* ActivityIndicatorView.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
5BA1FA332424A5CE00EE4184 /* ActivityIndicatorView */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5BA1FA3C2424A5CE00EE4184 /* Build configuration list for PBXNativeTarget "ActivityIndicatorView" */;
buildPhases = (
5BA1FA2F2424A5CE00EE4184 /* Headers */,
5BA1FA302424A5CE00EE4184 /* Sources */,
5BA1FA312424A5CE00EE4184 /* Frameworks */,
5BA1FA322424A5CE00EE4184 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ActivityIndicatorView;
productName = SwiftUIActivityIndicator;
productReference = 5BA1FA342424A5CE00EE4184 /* ActivityIndicatorView.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
5BA1FA2B2424A5CE00EE4184 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1110;
ORGANIZATIONNAME = Exyte;
TargetAttributes = {
5BA1FA332424A5CE00EE4184 = {
CreatedOnToolsVersion = 11.1;
LastSwiftMigration = 1110;
};
};
};
buildConfigurationList = 5BA1FA2E2424A5CE00EE4184 /* Build configuration list for PBXProject "ActivityIndicatorView" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 5BA1FA2A2424A5CE00EE4184;
productRefGroup = 5BA1FA352424A5CE00EE4184 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
5BA1FA332424A5CE00EE4184 /* ActivityIndicatorView */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
5BA1FA322424A5CE00EE4184 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
5BA1FA302424A5CE00EE4184 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5B56E7DC2428A1D900A5AF97 /* ActivityIndicatorView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
5BA1FA3A2424A5CE00EE4184 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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_ARC = 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;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
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;
IPHONEOS_DEPLOYMENT_TARGET = 13.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
5BA1FA3B2424A5CE00EE4184 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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_ARC = 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;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
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;
IPHONEOS_DEPLOYMENT_TARGET = 13.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
5BA1FA3D2424A5CE00EE4184 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Source/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = exyte.ActivityIndicatorView;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
5BA1FA3E2424A5CE00EE4184 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Source/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = exyte.ActivityIndicatorView;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
5BA1FA2E2424A5CE00EE4184 /* Build configuration list for PBXProject "ActivityIndicatorView" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5BA1FA3A2424A5CE00EE4184 /* Debug */,
5BA1FA3B2424A5CE00EE4184 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5BA1FA3C2424A5CE00EE4184 /* Build configuration list for PBXNativeTarget "ActivityIndicatorView" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5BA1FA3D2424A5CE00EE4184 /* Debug */,
5BA1FA3E2424A5CE00EE4184 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 5BA1FA2B2424A5CE00EE4184 /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:/Users/f3dm76/Work/ActivitiyIndicatorView/ActivityIndicatorView.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,16 @@
<?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>SchemeUserState</key>
<dict>
<key>ActivityIndicatorView.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict/>
</dict>
</plist>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+397
View File
@@ -0,0 +1,397 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objects = {
/* Begin PBXBuildFile section */
5BA1FA542424AB2800EE4184 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA1FA532424AB2800EE4184 /* AppDelegate.swift */; };
5BA1FA562424AB2800EE4184 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA1FA552424AB2800EE4184 /* SceneDelegate.swift */; };
5BA1FA582424AB2800EE4184 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA1FA572424AB2800EE4184 /* ContentView.swift */; };
5BA1FA602424AB2A00EE4184 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5BA1FA5E2424AB2A00EE4184 /* LaunchScreen.storyboard */; };
C558369BF5D0613BDE3E0E89 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4DA9B76060746B2061594AC /* Pods_Example.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
5BA1FA502424AB2800EE4184 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
5BA1FA532424AB2800EE4184 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
5BA1FA552424AB2800EE4184 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
5BA1FA572424AB2800EE4184 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
5BA1FA5F2424AB2A00EE4184 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
5BA1FA612424AB2A00EE4184 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
72763C8DB82FBA52FB5857DA /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
916E229A89B671ED7CC031A5 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
C4DA9B76060746B2061594AC /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5BA1FA4D2424AB2800EE4184 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C558369BF5D0613BDE3E0E89 /* Pods_Example.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
5BA1FA472424AB2800EE4184 = {
isa = PBXGroup;
children = (
5BA1FA522424AB2800EE4184 /* Example */,
5BA1FA512424AB2800EE4184 /* Products */,
60B6BD2D0C754FDF6F76A229 /* Pods */,
A47097E21D8C80691CC07732 /* Frameworks */,
);
sourceTree = "<group>";
};
5BA1FA512424AB2800EE4184 /* Products */ = {
isa = PBXGroup;
children = (
5BA1FA502424AB2800EE4184 /* Example.app */,
);
name = Products;
sourceTree = "<group>";
};
5BA1FA522424AB2800EE4184 /* Example */ = {
isa = PBXGroup;
children = (
5BA1FA532424AB2800EE4184 /* AppDelegate.swift */,
5BA1FA552424AB2800EE4184 /* SceneDelegate.swift */,
5BA1FA572424AB2800EE4184 /* ContentView.swift */,
5BA1FA5E2424AB2A00EE4184 /* LaunchScreen.storyboard */,
5BA1FA612424AB2A00EE4184 /* Info.plist */,
);
path = Example;
sourceTree = "<group>";
};
60B6BD2D0C754FDF6F76A229 /* Pods */ = {
isa = PBXGroup;
children = (
72763C8DB82FBA52FB5857DA /* Pods-Example.debug.xcconfig */,
916E229A89B671ED7CC031A5 /* Pods-Example.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
A47097E21D8C80691CC07732 /* Frameworks */ = {
isa = PBXGroup;
children = (
C4DA9B76060746B2061594AC /* Pods_Example.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
5BA1FA4F2424AB2800EE4184 /* Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5BA1FA642424AB2A00EE4184 /* Build configuration list for PBXNativeTarget "Example" */;
buildPhases = (
A5D7B8EF28EE02D19AFE2DA0 /* [CP] Check Pods Manifest.lock */,
5BA1FA4C2424AB2800EE4184 /* Sources */,
5BA1FA4D2424AB2800EE4184 /* Frameworks */,
5BA1FA4E2424AB2800EE4184 /* Resources */,
2AB504D89179224F042F09DA /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Example;
productName = Example;
productReference = 5BA1FA502424AB2800EE4184 /* Example.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
5BA1FA482424AB2800EE4184 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1110;
LastUpgradeCheck = 1110;
ORGANIZATIONNAME = Exyte;
TargetAttributes = {
5BA1FA4F2424AB2800EE4184 = {
CreatedOnToolsVersion = 11.1;
};
};
};
buildConfigurationList = 5BA1FA4B2424AB2800EE4184 /* Build configuration list for PBXProject "Example" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 5BA1FA472424AB2800EE4184;
productRefGroup = 5BA1FA512424AB2800EE4184 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
5BA1FA4F2424AB2800EE4184 /* Example */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
5BA1FA4E2424AB2800EE4184 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5BA1FA602424AB2A00EE4184 /* LaunchScreen.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
2AB504D89179224F042F09DA /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
A5D7B8EF28EE02D19AFE2DA0 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
5BA1FA4C2424AB2800EE4184 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5BA1FA542424AB2800EE4184 /* AppDelegate.swift in Sources */,
5BA1FA562424AB2800EE4184 /* SceneDelegate.swift in Sources */,
5BA1FA582424AB2800EE4184 /* ContentView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
5BA1FA5E2424AB2A00EE4184 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
5BA1FA5F2424AB2A00EE4184 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
5BA1FA622424AB2A00EE4184 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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_ARC = 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;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
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;
IPHONEOS_DEPLOYMENT_TARGET = 13.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
5BA1FA632424AB2A00EE4184 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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_ARC = 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;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
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;
IPHONEOS_DEPLOYMENT_TARGET = 13.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
5BA1FA652424AB2A00EE4184 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 72763C8DB82FBA52FB5857DA /* Pods-Example.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = exyte.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
5BA1FA662424AB2A00EE4184 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 916E229A89B671ED7CC031A5 /* Pods-Example.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = exyte.Example;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
5BA1FA4B2424AB2800EE4184 /* Build configuration list for PBXProject "Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5BA1FA622424AB2A00EE4184 /* Debug */,
5BA1FA632424AB2A00EE4184 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5BA1FA642424AB2A00EE4184 /* Build configuration list for PBXNativeTarget "Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5BA1FA652424AB2A00EE4184 /* Debug */,
5BA1FA662424AB2A00EE4184 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 5BA1FA482424AB2800EE4184 /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Example.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,22 @@
<?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>SchemeUserState</key>
<dict>
<key>Example.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>5BA1FA4F2424AB2800EE4184</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>
+37
View File
@@ -0,0 +1,37 @@
//
// AppDelegate.swift
// Example
//
// Created by Alisa Mylnikova on 20/03/2020.
// Copyright © 2020 Exyte. All rights reserved.
//
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.
}
}
@@ -0,0 +1,25 @@
<?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>
+77
View File
@@ -0,0 +1,77 @@
//
// ContentView.swift
// Example
//
// Created by Alisa Mylnikova on 20/03/2020.
// Copyright © 2020 Exyte. All rights reserved.
//
import SwiftUI
import ActivityIndicatorView
struct ContentView: View {
@State private var showLoadingIndicator: Bool = true
var body: some View {
AnyView(GeometryReader { (geometry: GeometryProxy) -> AnyView in
let size = geometry.size.width / 4
let spacing: CGFloat = 40.0
return AnyView(HStack {
Spacer()
VStack(spacing: spacing) {
Spacer()
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .default)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .arcs)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .rotatingDots)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .equalizer)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .growingArc)
.frame(width: size, height: size)
.foregroundColor(.red)
Spacer()
}
Spacer()
VStack(spacing: spacing) {
Spacer()
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .opacityDots)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .scalingDots)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .gradient([Color.white, Color.red]))
.frame(width: size, height: size)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .growingCircle)
.frame(width: size, height: size)
.foregroundColor(.red)
ActivityIndicatorView(isVisible: self.$showLoadingIndicator, type: .flickeringDots)
.frame(width: size, height: size)
.foregroundColor(.red)
Spacer()
}
Spacer()
})
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
+60
View File
@@ -0,0 +1,60 @@
<?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>1.0</string>
<key>CFBundleVersion</key>
<string>1</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>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</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>
+64
View File
@@ -0,0 +1,64 @@
//
// SceneDelegate.swift
// Example
//
// Created by Alisa Mylnikova on 20/03/2020.
// Copyright © 2020 Exyte. All rights reserved.
//
import UIKit
import SwiftUI
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).
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
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.
}
}
+10
View File
@@ -0,0 +1,10 @@
# Uncomment the next line to define a global platform for your project
platform :ios, '13.0'
target 'Example' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'ActivityIndicatorView', :path => '../'
end
+5 -5
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 Exyte
Copyright (c) 2020 exyte <info@exyte.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -9,13 +9,13 @@ 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 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.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+25
View File
@@ -0,0 +1,25 @@
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "ActivityIndicatorView",
platforms: [
.macOS(.v10_15),
.iOS(.v13),
.watchOS(.v6)
],
products: [
.library(
name: "ActivityIndicatorView",
targets: ["ActivityIndicatorView"]
)
],
targets: [
.target(
name: "ActivityIndicatorView",
path: "Source"
)
],
swiftLanguageVersions: [.v5]
)
+88
View File
@@ -0,0 +1,88 @@
<img src="https://github.com/exyte/ActivityIndicatorView/blob/master/Assets/header.png">
<img align="right" src="https://raw.githubusercontent.com/exyte/ActivityIndicatorView/master/Assets/demo.gif" width="480" />
<p><h1 align="left">ActivityIndicatorView</h1></p>
<p><h4>A number of preset loading indicators created with SwiftUI.</h4></p>
___
<p> We are a development agency building
<a href="https://clutch.co/profile/exyte#review-731233">phenomenal</a> apps.</p>
</br>
<a href="https://exyte.com/contacts"><img src="https://i.imgur.com/vGjsQPt.png" width="134" height="34"></a> <a href="https://twitter.com/exyteHQ"><img src="https://i.imgur.com/DngwSn1.png" width="165" height="34"></a>
</br></br>
[![Travis CI](https://travis-ci.org/exyte/ActivityIndicatorView.svg?branch=master)](https://travis-ci.org/exyte/ActivitiyIndicatorView)
[![Version](https://img.shields.io/cocoapods/v/ActivityIndicatorView.svg?style=flat)](http://cocoapods.org/pods/ActivitiyIndicatorView)
[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-0473B3.svg?style=flat)](https://github.com/Carthage/Carthage)
[![License](https://img.shields.io/cocoapods/l/ActivityIndicatorView.svg?style=flat)](http://cocoapods.org/pods/ActivitiyIndicatorView)
[![Platform](https://img.shields.io/cocoapods/p/ActivityIndicatorView.svg?style=flat)](http://cocoapods.org/pods/ActivitiyIndicatorView)
[![Twitter](https://img.shields.io/badge/Twitter-@exyteHQ-blue.svg?style=flat)](http://twitter.com/exyteHQ)
# Usage
Create an indicator like this:
```swift
ActivityIndicator(isVisible: $showLoadingIndicator, type: .default)
```
where
`showLoadingIndicator` - bool value you may change to display or hide the indicator
`type` - value from `ActivityIndicator.IndicatorType` enum
You may alter it with standard SwiftUI means like this:
```swift
ActivityIndicator(isVisible: $showLoadingIndicator, type: .default)
.frame(width: 50.0, height: 50.0)
.foregroundColor(.red)
```
### Indicator types
`default` - iOS UIActivityIndicator style
`arcs`
`rotatingDots`
`flickeringDots`
`scalingDots`
`opacityDots`
`equalizer`
`growingArc`
`growingCircle`
`gradient` - circle with angular gradient border stroke, pass colors ilke this:
```swift
ActivityIndicatorView(isVisible: $showLoadingIndicator, type: .gradient([.white, .red]))
.frame(width: 50.0, height: 50.0)
```
## Examples
To try out the ActivityIndicatorView examples:
- Clone the repo `git clone git@github.com:exyte/ActivityIndicatorView.git`
- Open terminal and run `cd <ActivityIndicatorViewRepo>/Example`
- Run `pod install` to install all dependencies
- Run `xed .` to open project in the Xcode
- Try it!
## Installation
### CocoaPods
```ruby
pod 'ActivityIndicatorView'
```
### Carthage
```ogdl
github "Exyte/ActivityIndicatorView"
```
### Manually
Drop [ActivityIndicatorView.swift](https://github.com/exyte/ActivitiyIndicatorView/blob/master/Source/ActivitiyIndicatorView.swift) into your project.
## Requirements
* iOS 13+ / watchOS 13+ / tvOS 13+ / macOS 10.15+
* Xcode 11+
+19
View File
@@ -0,0 +1,19 @@
//
// ActivityIndicatorView.h
// ActivityIndicatorView
//
// Created by Alisa Mylnikova on 20/03/2020.
// Copyright © 2020 Exyte. All rights reserved.
//
#import <Foundation/Foundation.h>
//! Project version number for ActivityIndicatorView.
FOUNDATION_EXPORT double ActivityIndicatorViewVersionNumber;
//! Project version string for ActivityIndicatorView.
FOUNDATION_EXPORT const unsigned char ActivityIndicatorViewVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <ActivitiyIndicatorView/PublicHeader.h>
+324
View File
@@ -0,0 +1,324 @@
//
// ActivityIndicatorView.swift
// ActivityIndicatorView
//
// Created by Alisa Mylnikova on 20/03/2020.
// Copyright © 2020 Exyte. All rights reserved.
//
import SwiftUI
public struct ActivityIndicatorView: View {
public enum IndicatorType {
case `default`
case arcs
case rotatingDots
case flickeringDots
case scalingDots
case opacityDots
case equalizer
case growingArc
case growingCircle
case gradient([Color])
}
@Binding var isVisible: Bool
var type: IndicatorType
@State private var isAnimating: Bool = false
@State private var parameter = 0.0
public init(isVisible: Binding<Bool>, type: IndicatorType) {
self._isVisible = isVisible
self.type = type
}
public var body: some View {
let indicator: AnyView
switch type {
case .default:
indicator = createDefaultIndicator()
case .arcs:
indicator = createArcsIndicator()
case .rotatingDots:
indicator = createRotatingDotsIndicator()
case .flickeringDots:
indicator = createFlickeringDotsIndicator()
case .scalingDots:
indicator = createScalingDotsIndicator()
case .opacityDots:
indicator = createOpacityDotsIndicator()
case .equalizer:
indicator = createEqualizerIndicator()
case .growingArc:
indicator = createGrowingArcIndicator()
case .growingCircle:
indicator = createGrowingCircleIndicator()
case .gradient(let colors):
indicator = createGradientIndicator(colors: colors)
}
if isVisible {
return AnyView(indicator
.onAppear {
self.isAnimating = true
}
.onDisappear {
self.isAnimating = false
})
} else {
return AnyView(Text(""))
}
}
func createDefaultIndicator() -> AnyView {
let count = 8
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> AnyView in
let height = geometry.size.height / 3.2
let width = height / 2
let angle = 2 * CGFloat.pi / CGFloat(count) * CGFloat(index)
let x = (geometry.size.width / 2 - height / 2) * cos(angle)
let y = (geometry.size.height / 2 - height / 2) * sin(angle)
let rect = RoundedRectangle(cornerRadius: width / 2 + 1).frame(width: width, height: height)
.rotationEffect(Angle(radians: Double(angle + CGFloat.pi / 2)))
.offset(x: x, y: y)
return AnyView(rect
.opacity(!self.isAnimating ? 1 : 0.3)
.animation(Animation.default
.repeatForever(autoreverses: true)
.delay(Double(index) / Double(count) / 2)
)
)
}.frame(width: geometry.size.width, height: geometry.size.height)
}
}
return AnyView(indicator)
}
func createArcsIndicator() -> AnyView {
let count = 3
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> Path in
var p = Path()
p.addArc(center: CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2),
radius: geometry.size.width / 2 - CGFloat(index) * CGFloat(count),
startAngle: .degrees(0),
endAngle: .degrees(Double(Int.random(in: 120...300))),
clockwise: true)
return p.strokedPath(.init(lineWidth: 2))
}.frame(width: geometry.size.width, height: geometry.size.height)
.rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
.animation(Animation.default
.speed(Double.random(in: 0.2...0.5))
.repeatForever(autoreverses: false))
}
}
return AnyView(indicator)
}
func createRotatingDotsIndicator() -> AnyView {
AnyView(GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<5) { index in
Group {
Circle()
.frame(width: geometry.size.width / 5, height: geometry.size.height / 5)
.scaleEffect(!self.isAnimating ? 1 - CGFloat(index) / 5 : 0.2 + CGFloat(index) / 5)
.offset(y: geometry.size.width / 10 - geometry.size.height / 2)
}.frame(width: geometry.size.width, height: geometry.size.height)
.rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
.animation(Animation
.timingCurve(0.5, 0.15 + Double(index) / 5, 0.25, 1, duration: 1.5)
.repeatForever(autoreverses: false))
}
})
}
func createFlickeringDotsIndicator() -> AnyView {
let count = 8
let duration = 0.5
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> AnyView in
let size = geometry.size.height / 5
let angle = 2 * CGFloat.pi / CGFloat(count) * CGFloat(index)
let x = (geometry.size.width / 2 - size / 2) * cos(angle)
let y = (geometry.size.height / 2 - size / 2) * sin(angle)
let circle = Circle()
.frame(width: size, height: size)
.scaleEffect(!self.isAnimating ? 1 : 0.5)
.opacity(!self.isAnimating ? 1 : 0.3)
.animation(Animation.linear(duration: duration)
.repeatForever(autoreverses: true)
.delay(duration * Double(index) / Double(count) * 2)
)
.offset(x: x, y: y)
return AnyView(circle)
}.frame(width: geometry.size.width, height: geometry.size.height)
}
}
return AnyView(indicator)
}
func createScalingDotsIndicator() -> AnyView {
let count = 3
let inset = 2
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> AnyView in
let size = (geometry.size.width - CGFloat(inset) * CGFloat(count - 1)) / CGFloat(count)
let circle = Circle()
.frame(width: size, height: size)
return AnyView(circle
.scaleEffect(!self.isAnimating ? 1 : 0.3)
.animation(Animation.easeOut
.repeatForever(autoreverses: true)
.delay(Double(index) / Double(count) / 2)
)
.offset(x: (size + CGFloat(inset)) * CGFloat(index) - geometry.size.width / 2 + size / 2)
)
}
}.frame(width: geometry.size.width, height: geometry.size.height)
}
return AnyView(indicator)
}
func createOpacityDotsIndicator() -> AnyView {
let count = 3
let inset = 4
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> AnyView in
let size = (geometry.size.width - CGFloat(inset) * CGFloat(count - 1)) / CGFloat(count)
let circle = Circle()
.frame(width: size, height: size)
return AnyView(circle
.scaleEffect(!self.isAnimating ? 1 : 0.9)
.opacity(!self.isAnimating ? 1 : 0.3)
.animation(Animation.easeOut
.repeatForever(autoreverses: true)
.delay(index % 2 == 0 ? 0.2 : 0)
)
.offset(x: (size + CGFloat(inset)) * CGFloat(index) - geometry.size.width / 2 + size / 2)
)
}
}.frame(width: geometry.size.width, height: geometry.size.height)
}
return AnyView(indicator)
}
func createEqualizerIndicator() -> AnyView {
let count = 5
let indicator = GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<count) { index in
Group { () -> AnyView in
let size = geometry.size.width / CGFloat(count) / 2
let rect = RoundedRectangle(cornerRadius: 3)
.frame(width: size, height: geometry.size.height)
return AnyView(rect
.scaleEffect(x: 1, y: !self.isAnimating ? 1 : 0.4, anchor: .center)
.animation(Animation.easeOut
.delay(0.2)
.repeatForever(autoreverses: true)
.delay(Double(index) / Double(count) / 2)
)
.offset(x: 2 * size * CGFloat(index) - geometry.size.width / 2 + size / 2)
)
}
}.frame(width: geometry.size.width, height: geometry.size.height)
}
return AnyView(indicator)
}
func createGrowingArcIndicator() -> AnyView {
let indicator = GeometryReader { (geometry: GeometryProxy) in
GrowingArc(p: self.parameter).stroke(Color.red, lineWidth: 4)
}.onAppear() {
withAnimation(Animation.easeIn(duration: 2).repeatForever(autoreverses: false)) {
self.parameter = 1
}
}.onDisappear() {
self.parameter = 0
}
return AnyView(indicator)
}
func createGrowingCircleIndicator() -> AnyView {
let indicator = GeometryReader { (geometry: GeometryProxy) in
Circle()
.frame(width: geometry.size.width, height: geometry.size.height)
.scaleEffect(!self.isAnimating ? 0 : 1)
.opacity(!self.isAnimating ? 1 : 0)
.animation(Animation.easeIn(duration: 1.1)
.repeatForever(autoreverses: false))
}
return AnyView(indicator)
}
func createGradientIndicator(colors: [Color]) -> AnyView {
let colors = Gradient(colors: colors)
let conic = AngularGradient(gradient: colors, center: .center, startAngle: .zero, endAngle: .degrees(360))
let indicator = GeometryReader { (geometry: GeometryProxy) in
Circle()
.strokeBorder(conic, lineWidth: 4)
.frame(width: geometry.size.width, height: geometry.size.height)
.rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
.animation(Animation.linear(duration: 1.5)
.repeatForever(autoreverses: false))
}
return AnyView(indicator)
}
}
struct GrowingArc : Shape {
var maxLength = 2 * Double.pi - 0.7
var lag = 0.35
var p: Double
var animatableData: Double {
get { return p }
set { p = newValue }
}
func path(in rect: CGRect) -> Path {
let h = p * 2
var length = h * maxLength
if h > 1 && h < lag + 1 {
length = maxLength
}
if h > lag + 1 {
let coeff = 1 / (1 - lag)
let n = h - 1 - lag
length = (1 - n * coeff) * maxLength
}
let first = Double.pi / 2
let second = 4 * Double.pi - first
var end = h * first
if h > 1 {
end = first + (h - 1) * second
}
let start = end + length
var p = Path()
p.addArc(center: CGPoint(x: rect.size.width/2, y: rect.size.width/2),
radius: rect.size.width/2,
startAngle: Angle(radians: start),
endAngle: Angle(radians: end),
clockwise: true)
return p
}
}
+22
View File
@@ -0,0 +1,22 @@
<?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>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
</dict>
</plist>