├── PRGTipView ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── Pulsar │ ├── AnimationDelegate.swift │ ├── ApplicationObserver.swift │ ├── CALayer+Extensions.swift │ ├── Pulse.swift │ └── PulseLayer.swift │ ├── PRGTipViewConfiguration.swift │ ├── PRGTipView.swift │ └── PRGAnimatableMaskView.swift ├── _Pods.xcodeproj ├── screen1.png ├── screen2.png ├── screen3.png ├── screen4.png ├── PRGTipView.gif ├── Example ├── Pods │ ├── Target Support Files │ │ ├── PRGTipView │ │ │ ├── PRGTipView.modulemap │ │ │ ├── PRGTipView-dummy.m │ │ │ ├── PRGTipView-prefix.pch │ │ │ ├── PRGTipView-umbrella.h │ │ │ ├── PRGTipView.debug.xcconfig │ │ │ ├── PRGTipView.release.xcconfig │ │ │ └── PRGTipView-Info.plist │ │ ├── Pods-PRGTipView_Tests │ │ │ ├── Pods-PRGTipView_Tests.modulemap │ │ │ ├── Pods-PRGTipView_Tests-acknowledgements.markdown │ │ │ ├── Pods-PRGTipView_Tests-dummy.m │ │ │ ├── Pods-PRGTipView_Tests-umbrella.h │ │ │ ├── Pods-PRGTipView_Tests.debug.xcconfig │ │ │ ├── Pods-PRGTipView_Tests.release.xcconfig │ │ │ ├── Pods-PRGTipView_Tests-Info.plist │ │ │ └── Pods-PRGTipView_Tests-acknowledgements.plist │ │ └── Pods-PRGTipView_Example │ │ │ ├── Pods-PRGTipView_Example.modulemap │ │ │ ├── Pods-PRGTipView_Example-dummy.m │ │ │ ├── Pods-PRGTipView_Example-umbrella.h │ │ │ ├── Pods-PRGTipView_Example.debug.xcconfig │ │ │ ├── Pods-PRGTipView_Example.release.xcconfig │ │ │ ├── Pods-PRGTipView_Example-Info.plist │ │ │ ├── Pods-PRGTipView_Example-acknowledgements.markdown │ │ │ ├── Pods-PRGTipView_Example-acknowledgements.plist │ │ │ └── Pods-PRGTipView_Example-frameworks.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── PRGTipView.podspec.json │ └── Pods.xcodeproj │ │ └── project.pbxproj ├── Podfile ├── PRGTipView.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── PRGTipView-Example.xcscheme │ └── project.pbxproj ├── PRGTipView.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile.lock ├── Tests │ ├── Info.plist │ └── Tests.swift └── PRGTipView │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── AppDelegate.swift │ ├── ViewController.swift │ └── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── .travis.yml ├── .gitignore ├── PRGTipView.podspec ├── LICENSE └── README.md /PRGTipView/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /PRGTipView/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /screen1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ispiropoulos/PRGTipView/HEAD/screen1.png -------------------------------------------------------------------------------- /screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ispiropoulos/PRGTipView/HEAD/screen2.png -------------------------------------------------------------------------------- /screen3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ispiropoulos/PRGTipView/HEAD/screen3.png -------------------------------------------------------------------------------- /screen4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ispiropoulos/PRGTipView/HEAD/screen4.png -------------------------------------------------------------------------------- /PRGTipView.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ispiropoulos/PRGTipView/HEAD/PRGTipView.gif -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView.modulemap: -------------------------------------------------------------------------------- 1 | framework module PRGTipView { 2 | umbrella header "PRGTipView-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_PRGTipView : NSObject 3 | @end 4 | @implementation PodsDummy_PRGTipView 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'PRGTipView_Example' do 4 | pod 'PRGTipView', :path => '../' 5 | 6 | target 'PRGTipView_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PRGTipView_Tests { 2 | umbrella header "Pods-PRGTipView_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PRGTipView_Example { 2 | umbrella header "Pods-PRGTipView_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PRGTipView_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PRGTipView_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/PRGTipView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PRGTipView_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PRGTipView_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/PRGTipView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/PRGTipView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - PRGTipView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - PRGTipView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | PRGTipView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | PRGTipView: 38f374cc4529c2ed043c14d98cdf3a60cdd8d40d 13 | 14 | PODFILE CHECKSUM: bb1f2d2fa0b7dd775e2f7e9d8ac4377336544f7d 15 | 16 | COCOAPODS: 1.9.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - PRGTipView (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - PRGTipView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | PRGTipView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | PRGTipView: 38f374cc4529c2ed043c14d98cdf3a60cdd8d40d 13 | 14 | PODFILE CHECKSUM: bb1f2d2fa0b7dd775e2f7e9d8ac4377336544f7d 15 | 16 | COCOAPODS: 1.9.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double PRGTipViewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char PRGTipViewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PRGTipView_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PRGTipView_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PRGTipView_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PRGTipView_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/PRGTipView.xcworkspace -scheme PRGTipView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView.release.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView/PRGTipView.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "PRGTipView" -framework "UIKit" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView/PRGTipView.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "PRGTipView" -framework "UIKit" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 10 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/PRGTipView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "PRGTipView", 3 | "version": "0.1.0", 4 | "summary": "A quick way to add onboarding tips in your app.", 5 | "description": "A quick way to add onboarding tips in your app. PRGTipView uses the Pulsar library to optimally add pulsating effects to your focused views.", 6 | "homepage": "https://github.com/ispiropoulos/PRGTipView", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "John Spiropoulos": "johnspir@me.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/John Spiropoulos/PRGTipView.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "9.3" 20 | }, 21 | "source_files": "PRGTipView/Classes/**/*", 22 | "swift_versions": "5.0", 23 | "frameworks": "UIKit", 24 | "swift_version": "5.0" 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView/PRGTipView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "PRGTipView" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PRGTipView/PRGTipView.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "PRGTipView" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import PRGTipView 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testExample() { 17 | // This is an example of a functional test case. 18 | XCTAssert(true, "Pass") 19 | } 20 | 21 | func testPerformanceExample() { 22 | // This is an example of a performance test case. 23 | self.measure() { 24 | // Put the code you want to measure the time of here. 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/PRGTipView/PRGTipView-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/PRGTipView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /PRGTipView/Classes/Pulsar/AnimationDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationDelegate.swift 3 | // Pulsar 4 | // 5 | // Created by Vincent Esche on 3/5/19. 6 | // Copyright © 2019 Regexident. All rights reserved. 7 | // 8 | 9 | import QuartzCore 10 | 11 | internal class AnimationDelegate: NSObject { 12 | let pulseLayer: PulseLayer 13 | let startBlock: Pulse.StartClosure? = nil 14 | let stopBlock: Pulse.StopClosure? = nil 15 | 16 | init(pulseLayer: PulseLayer) { 17 | self.pulseLayer = pulseLayer 18 | } 19 | } 20 | 21 | extension AnimationDelegate: CAAnimationDelegate { 22 | func animationDidStart(_ animation: CAAnimation) { 23 | if let startBlock = self.startBlock { 24 | startBlock(animation.duration) 25 | } 26 | } 27 | 28 | func animationDidStop(_ animation: CAAnimation, finished: Bool) { 29 | guard var pulseLayers = self.pulseLayer.superlayer?.pulseLayers else { 30 | return 31 | } 32 | if let index = pulseLayers.firstIndex(of: self.pulseLayer) { 33 | pulseLayers.remove(at: index) 34 | self.pulseLayer.removeFromSuperlayer() 35 | if let stopBlock = self.stopBlock { 36 | stopBlock(finished) 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Example/PRGTipView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## PRGTipView 5 | 6 | Copyright (c) 2020 John Spiropoulos 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /PRGTipView/Classes/Pulsar/ApplicationObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApplicationObserver.swift 3 | // Pulsar 4 | // 5 | // Created by Vincent Esche on 3/5/19. 6 | // Copyright © 2019 Regexident. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | internal protocol ApplicationObserverDelegate: class { 12 | func applicationWillEnterForeground() 13 | func applicationDidEnterBackground() 14 | } 15 | 16 | internal class ApplicationObserver { 17 | internal weak var delegate: ApplicationObserverDelegate? 18 | 19 | public init() { 20 | self.addApplicationObservers() 21 | } 22 | 23 | deinit { 24 | self.removeApplicationObservers() 25 | } 26 | 27 | private func addApplicationObservers() { 28 | NotificationCenter.default.addObserver( 29 | self, 30 | selector: #selector(applicationWillEnterForeground), 31 | name: UIApplication.willEnterForegroundNotification, 32 | object: nil 33 | ) 34 | NotificationCenter.default.addObserver( 35 | self, 36 | selector: #selector(applicationDidEnterBackground), 37 | name: UIApplication.didEnterBackgroundNotification, 38 | object: nil 39 | ) 40 | } 41 | 42 | private func removeApplicationObservers() { 43 | NotificationCenter.default.removeObserver(self) 44 | } 45 | 46 | @objc private func applicationWillEnterForeground() { 47 | self.delegate?.applicationWillEnterForeground() 48 | } 49 | 50 | @objc private func applicationDidEnterBackground() { 51 | self.delegate?.applicationDidEnterBackground() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /PRGTipView/Classes/Pulsar/CALayer+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CALayer+Pulsar.swift 3 | // Pulsar 4 | // 5 | // Created by Vincent Esche on 2/6/15. 6 | // Copyright (c) 2015 Vincent Esche. All rights reserved. 7 | // 8 | 9 | import QuartzCore 10 | 11 | extension CALayer { 12 | public func addPulse(_ closure: ((Pulse) -> ())? = nil) -> PulseLayer { 13 | if self.masksToBounds == true { 14 | NSLog("Warning: CALayers with 'self.masksToBounds = true' might not show a pulse.") 15 | } 16 | 17 | let pulse = Pulse(self) 18 | if let closure = closure { 19 | closure(pulse) 20 | } 21 | 22 | let pulseLayer = PulseLayer(pulse: pulse) 23 | self.insertSublayer(pulseLayer, at:0) 24 | 25 | let animation = PulseLayer.pulseAnimation(from: pulse) 26 | animation.delegate = AnimationDelegate(pulseLayer: pulseLayer) 27 | pulseLayer.add(animation, forKey: PulseLayer.Constants.animationKey) 28 | 29 | self.pulseLayers.append(pulseLayer) 30 | 31 | return pulseLayer 32 | } 33 | 34 | public func removePulse(_ pulse: PulseLayer) { 35 | if let index = self.pulseLayers.firstIndex(where: { $0 === pulse }) { 36 | pulse.removeAllAnimations() 37 | pulse.removeFromSuperlayer() 38 | self.pulseLayers.remove(at: index) 39 | } 40 | } 41 | 42 | public func removePulses() { 43 | for pulseLayer in self.pulseLayers { 44 | pulseLayer.removeAllAnimations() 45 | pulseLayer.removeFromSuperlayer() 46 | } 47 | self.pulseLayers = [] 48 | } 49 | 50 | var pulseLayers: [PulseLayer] { 51 | set { 52 | self.setValue(newValue, forKey: PulseLayer.Constants.layersKey) 53 | } 54 | get { 55 | return self.value(forKey: PulseLayer.Constants.layersKey) as? [PulseLayer] ?? [] 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /PRGTipView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint PRGTipView.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'PRGTipView' 11 | s.version = '0.1.0' 12 | s.summary = 'A quick way to add onboarding tips in your app.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | PRGTipView is a drop-in solution to add onboarding tips to your iOS apps. It also uses the Pulsar library to optimally add pulsating effects to your focused views. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/ispiropoulos/PRGTipView' 25 | s.screenshots = 'https://raw.githubusercontent.com/ispiropoulos/PRGTipView/master/screen1.png', 'https://raw.githubusercontent.com/ispiropoulos/PRGTipView/master/screen2.png', 'https://raw.githubusercontent.com/ispiropoulos/PRGTipView/master/screen3.png', 'https://raw.githubusercontent.com/ispiropoulos/PRGTipView/master/screen4.png' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'John Spiropoulos' => 'johnspir@me.com' } 28 | s.source = { :git => 'https://github.com/ispiropoulos/PRGTipView.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.ios.deployment_target = '9.3' 32 | 33 | s.source_files = 'PRGTipView/Classes/**/*' 34 | s.swift_version = '5.0' 35 | # s.resource_bundles = { 36 | # 'PRGTipView' => ['PRGTipView/Assets/*.png'] 37 | # } 38 | 39 | # s.public_header_files = 'Pod/Classes/**/*.h' 40 | # s.frameworks = 'UIKit' 41 | end 42 | -------------------------------------------------------------------------------- /Example/PRGTipView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // PRGTipView 4 | // 5 | // Created by John Spiropoulos on 06/08/2020. 6 | // Copyright (c) 2020 John Spiropoulos. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2020 John Spiropoulos <johnspir@me.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | PRGTipView 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | PRGTipView: 2 | 3 | Copyright (c) 2020 PROGRAMIZE 4 | 5 | This product includes Pulsar code by Vincent Esche. Please see the Pulsar Licence below. 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | 24 | Pulsar: 25 | 26 | Copyright (c) 2015, Vincent Esche 27 | All rights reserved. 28 | 29 | Redistribution and use in source and binary forms, with or without modification, 30 | are permitted provided that the following conditions are met: 31 | 32 | 1. Redistributions of source code must retain the above copyright notice, this 33 | list of conditions and the following disclaimer. 34 | 35 | 2. Redistributions in binary form must reproduce the above copyright notice, this 36 | list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 37 | 38 | 3. Neither the name of the author nor the names of its contributors may be used to 39 | endorse or promote products derived from this software without specific prior written permission. 40 | 41 | 4. Redistributions of any form whatsoever must retain the following acknowledgment: 42 | "This product includes code by Vincent Esche." where 43 | would be replaced by the name of the specific source-code package being made use of. 44 | 45 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 46 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 47 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 48 | THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 50 | OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 51 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 52 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 53 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 | -------------------------------------------------------------------------------- /Example/PRGTipView/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // PRGTipView 4 | // 5 | // Created by John Spiropoulos on 06/08/2020. 6 | // Copyright (c) 2020 John Spiropoulos. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import PRGTipView 11 | 12 | class ViewController: UIViewController { 13 | @IBOutlet weak var animInSwitch: UISwitch! 14 | @IBOutlet weak var animOutSwitch: UISwitch! 15 | @IBOutlet weak var pulseSwitch: UISwitch! 16 | 17 | @IBOutlet weak var rectBtn: UIButton! 18 | @IBOutlet weak var noFocusBtn: UIButton! 19 | @IBOutlet weak var circularBtn: UIButton! 20 | @IBOutlet weak var circBtn: UIButton! 21 | 22 | 23 | override func viewDidLoad() { 24 | super.viewDidLoad() 25 | // Do any additional setup after loading the view, typically from a nib. 26 | } 27 | 28 | override func didReceiveMemoryWarning() { 29 | super.didReceiveMemoryWarning() 30 | // Dispose of any resources that can be recreated. 31 | } 32 | 33 | 34 | 35 | @IBAction func createConfig(_ sender: UIButton) { 36 | 37 | let config = PRGTipViewConfiguration() 38 | config.animateIn = animInSwitch.isOn 39 | config.animateOut = animOutSwitch.isOn 40 | config.pulseMode = pulseSwitch.isOn ? .pulse(repeatCount: Int.max, backgroundColors: [UIColor.white], borderColors: [UIColor.white], lineWidth: 3) : .none 41 | config.buttonText = "OK" 42 | config.focusDistance = 20 43 | config.focusView = sender 44 | switch sender { 45 | case rectBtn: 46 | config.circularFocus = false 47 | config.focusInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8) 48 | config.titleText = "Rectangular" 49 | config.detailText = "This is how you present a tip with a rectangular mask over the focused view. You can add insets as well" 50 | case noFocusBtn: 51 | config.focusView = nil 52 | config.titleText = "No Focus View" 53 | config.detailText = "You can also not pass a focus view, the tip texts will be centered on the Y axis" 54 | case circularBtn: 55 | config.circularFocus = true 56 | config.titleText = "Circular" 57 | let detailStr = NSMutableAttributedString(string: "This is how you present a tip with a circular mask over the focused view. You can also use ", attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 12), NSAttributedString.Key.foregroundColor: UIColor.white]) 58 | let attr = NSMutableAttributedString(string: "Attributed Strings", attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 15), NSAttributedString.Key.foregroundColor: UIColor.red]) 59 | detailStr.append(attr) 60 | config.attributedDetailText = detailStr 61 | case circBtn: 62 | config.useLargestDimension = false 63 | config.circularFocus = true 64 | config.titleText = "Circ" 65 | config.detailText = "If you have a rectangular view but you need to focus with a circle on it's center, you can set \"useLargestDimension\" to false" 66 | default: break 67 | } 68 | 69 | PRGTipView.show(fromViewController: self, withConfiguration: config, completion: nil) 70 | } 71 | 72 | override func viewDidLayoutSubviews() { 73 | circularBtn.layer.cornerRadius = circularBtn.frame.height / 2 74 | } 75 | } 76 | 77 | -------------------------------------------------------------------------------- /Example/PRGTipView/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /PRGTipView/Classes/Pulsar/Pulse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pulse.swift 3 | // Pulsar 4 | // 5 | // Created by Vincent Esche on 3/5/19. 6 | // Copyright © 2019 Regexident. All rights reserved. 7 | // 8 | 9 | import QuartzCore 10 | 11 | public class Pulse { 12 | public typealias StartClosure = (TimeInterval) -> () 13 | public typealias StopClosure = (Bool) -> () 14 | 15 | public var borderColors: [CGColor] 16 | public var backgroundColors: [CGColor] 17 | public var frame: CGRect 18 | public var path: CGPath 19 | public var duration: TimeInterval = 1.0 20 | public var repeatDelay: TimeInterval = 0.0 21 | public var repeatCount: Int = 0 22 | public var lineWidth: CGFloat = 3.0 23 | public var transformBefore: CATransform3D = CATransform3DIdentity 24 | public var transformAfter: CATransform3D 25 | public var startBlock: StartClosure? = nil 26 | public var stopBlock: StopClosure? = nil 27 | 28 | init(_ layer: CALayer) { 29 | self.borderColors = Pulse.defaultBorderColors(for: layer) 30 | self.backgroundColors = Pulse.defaultBackgroundColors(for: layer) 31 | self.frame = Pulse.defaultFrame(for: layer) 32 | self.path = Pulse.defaultPath(for: layer) 33 | self.transformAfter = Pulse.defaultTransformAfter(for: layer) 34 | } 35 | 36 | private class func defaultBackgroundColors(for layer: CALayer) -> [CGColor] { 37 | switch layer { 38 | case let shapeLayer as CAShapeLayer: 39 | if let fillColor = shapeLayer.fillColor { 40 | let halfAlpha = fillColor.alpha * 0.5 41 | return [fillColor.copy(alpha: halfAlpha)!] 42 | } 43 | default: 44 | if let backgroundColor = layer.backgroundColor { 45 | let halfAlpha = backgroundColor.alpha * 0.5 46 | return [backgroundColor.copy(alpha: halfAlpha)!] 47 | } 48 | } 49 | let colorSpace = CGColorSpaceCreateDeviceRGB() 50 | let components: [CGFloat] = [1.0, 0.0, 0.0, 0.0] 51 | return [CGColor(colorSpace: colorSpace, components: components)!] 52 | } 53 | 54 | private class func defaultBorderColors(for layer: CALayer) -> [CGColor] { 55 | switch layer { 56 | case let shapeLayer as CAShapeLayer: 57 | if shapeLayer.lineWidth > 0.0 { 58 | if let strokeColor = shapeLayer.strokeColor { 59 | return [strokeColor] 60 | } 61 | } else { 62 | if let fillColor = shapeLayer.fillColor { 63 | return [fillColor] 64 | } 65 | } 66 | default: 67 | if layer.borderWidth > 0.0 { 68 | if let borderColor = layer.borderColor { 69 | return [borderColor] 70 | } 71 | } else { 72 | if let backgroundColor = layer.backgroundColor { 73 | return [backgroundColor] 74 | } 75 | } 76 | } 77 | let colorSpace = CGColorSpaceCreateDeviceRGB() 78 | let components: [CGFloat] = [1.0, 0.0, 0.0, 0.0] 79 | return [CGColor(colorSpace: colorSpace, components: components)!] 80 | } 81 | 82 | private class func defaultFrame(for layer: CALayer) -> CGRect { 83 | return layer.bounds 84 | } 85 | 86 | private class func defaultPath(for layer: CALayer) -> CGPath { 87 | switch layer { 88 | case let shapeLayer as CAShapeLayer: 89 | return shapeLayer.path! 90 | default: 91 | let rect = layer.bounds 92 | let minSize = min(rect.width, rect.height) 93 | let cornerRadius = min(max(0.0, layer.cornerRadius), minSize / 2.0) 94 | if cornerRadius > 0.0 { 95 | return CGPath( 96 | roundedRect: rect, 97 | cornerWidth: cornerRadius, 98 | cornerHeight: cornerRadius, 99 | transform: nil 100 | ) 101 | } else { 102 | return CGPath(rect: rect, transform: nil) 103 | } 104 | } 105 | } 106 | 107 | private class func defaultTransformAfter(for layer: CALayer) -> CATransform3D { 108 | let anchorPoint = layer.anchorPoint 109 | var transform = CATransform3DIdentity 110 | transform = CATransform3DTranslate(transform, anchorPoint.x, anchorPoint.y, 0.0); 111 | transform = CATransform3DScale(transform, 2.0, 2.0, 1.0); 112 | transform = CATransform3DTranslate(transform, -anchorPoint.x, -anchorPoint.y, 0.0); 113 | return transform 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /Example/PRGTipView.xcodeproj/xcshareddata/xcschemes/PRGTipView-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 78 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /PRGTipView/Classes/PRGTipViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PRGTipViewConfiguration.swift 3 | // 4 | // Created by John Spiropoulos on 8/6/20. 5 | // 6 | 7 | import Foundation 8 | 9 | public class PRGTipViewConfiguration { 10 | 11 | /// The string to be shown as the Tip View title 12 | public var titleText: String? 13 | /// The font of the Tip View title 14 | public var titleTextFont: UIFont = UIFont.boldSystemFont(ofSize: 25) 15 | /// The color of the Tip View title 16 | public var titleTextColor: UIColor = .white 17 | /// The attributed string to be shown as the Tip View title. If set, it overrides "titleText", "titleTextFont" and "titleTextColor" properties 18 | public var attributedTitleText: NSAttributedString? 19 | /// The string to be shown as the Tip View detail 20 | public var detailText: String? 21 | /// The font of the Tip View detail 22 | public var detailTextFont: UIFont = UIFont.systemFont(ofSize: 20) 23 | /// The color of the Tip View detail 24 | public var detailTextColor: UIColor = .white 25 | /// The attributed string to be shown as the Tip View detail. If set, it overrides "detailText", "detailTextFont" and "detailTextColor" properties 26 | public var attributedDetailText: NSAttributedString? 27 | /// The string to be shown as the Tip View dismissal button title 28 | public var buttonText: String? 29 | /// The font of the Tip View dismissal button 30 | public var buttonTextFont: UIFont = UIFont.boldSystemFont(ofSize: 14) 31 | /// The color of the Tip View dismissal button 32 | public var buttonTextColor: UIColor = .white 33 | /// The attributed string to be shown as the Tip View dismissal title. If set, it overrides "buttonText", "buttonTextFont" and "buttonTextColor" properties 34 | public var attributedButtonText: NSAttributedString? 35 | /// The background color of the Tip View 36 | public var backgroundColor: UIColor = .black 37 | /// The background alpha of the Tip View 38 | public var backgroundAlpha: CGFloat = 0.85 39 | /// The vertical spacing between the Tip View Title, Detail and Button 40 | public var tipTextYSpacing: CGFloat = 30 41 | /// The UIView to be focused when the Tip View is presented 42 | public weak var focusView: UIView? 43 | /// If a "focusView" is provided, this property controls whether the mask used to focus on the view should be circular. In default "false" state, the mask is rectangular 44 | public var circularFocus: Bool = false 45 | /// If "circularFocus" is set to true for a non square "focusView", leaving this property to "true" will use the "focusView"'s largest dimension to calculate the focus mask radius, while setting it to "false" will use the smallest dimension and centre the circular mask on the "focusView". 46 | public var useLargestDimension: Bool = true 47 | /// Adds padding to the "focusView" mask. If "circularFocus" is set to "true", then it adds only the .top inset to the radius calculation. 48 | public var focusInsets: UIEdgeInsets = UIEdgeInsets.zero 49 | /// Whether the Tip View should be presented animated. Helpful in situations where you want to chain several Tip Views and you do not want to repeat the animation on each and every one of them. 50 | public var animateIn: Bool = true 51 | /// Whether the Tip View should be dismissed animated. Helpful in situations where you want to chain several Tip Views and you do not want to repeat the animation on each and every one of them. 52 | public var animateOut: Bool = true 53 | /// Whether the "focusView", if provided, should pulse. 54 | public var pulseMode: PRGTipViewFocusViewPulseMode = .none 55 | /// The code to be executed after the Tip View is dismissed 56 | public var buttonAction: (()->())? 57 | ///The vertical spacing between the "focusView" and the container of the actual Tip Texts (Title, Detail, Button). If the provided "focusView" is in the bottom half of the screen, the tip container is presented above it and this property is the distance from the bottom of the tip container to the top of the "focusView" mask. If the provided "focusView" is in the top half of the screen, the tip container is presented below it and this property is the distance from the top of the tip container to the bottom of the "focusView" mask. 58 | public var focusDistance: CGFloat = 0 59 | /// The spacing between the container of the actual Tip Texts (Title, Detail, Button) to it's superView's leading. 60 | public var tipContainerLeading: CGFloat = 20 61 | /// The spacing between the container of the actual Tip Texts (Title, Detail, Button) trailing to it's superView's trailing. 62 | public var tipContainerTrailing: CGFloat = 20 63 | /// The duration of any animation that takes place in the Tip View (except from the pulsating effect) 64 | public var animationsDuration: Double = 0.3 65 | 66 | public init() {} 67 | } 68 | 69 | public enum PRGTipViewFocusViewPulseMode { 70 | case none, pulse(repeatCount: Int, backgroundColors: [UIColor], borderColors: [UIColor], lineWidth: CGFloat) 71 | } 72 | -------------------------------------------------------------------------------- /PRGTipView/Classes/Pulsar/PulseLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PulseLayer.swift 3 | // Pulsar 4 | // 5 | // Created by Vincent Esche on 3/5/19. 6 | // Copyright © 2019 Regexident. All rights reserved. 7 | // 8 | 9 | import QuartzCore 10 | 11 | public class PulseLayer: CAShapeLayer { 12 | enum Constants { 13 | static let layersKey: String = "Pulsar.layers" 14 | static let animationKey: String = "Pulsar.animation" 15 | static let persistenceKey: String = "Pulsar.persistence" 16 | } 17 | 18 | fileprivate struct Persistence { 19 | let animations: [String: CAAnimation] 20 | let speed: Float 21 | } 22 | 23 | public var isAnimationsPaused: Bool { 24 | return self.speed == 0.0 25 | } 26 | 27 | fileprivate let pulse: Pulse 28 | fileprivate var persistence: Persistence? 29 | fileprivate let applicationObserver: ApplicationObserver = .init() 30 | 31 | init(pulse: Pulse) { 32 | self.pulse = pulse 33 | 34 | super.init() 35 | 36 | self.reset() 37 | 38 | self.applicationObserver.delegate = self 39 | } 40 | 41 | public override init(layer anyLayer: Any) { 42 | guard let layer = anyLayer as? PulseLayer else { 43 | fatalError("Expected \(PulseLayer.self), found \(type(of: anyLayer)).") 44 | } 45 | self.pulse = layer.pulse 46 | 47 | super.init(layer: layer) 48 | } 49 | 50 | public required init?(coder: NSCoder) { 51 | fatalError("init(coder:) has not been implemented") 52 | } 53 | 54 | fileprivate func reset(animated: Bool = false) { 55 | CATransaction.begin() 56 | CATransaction.setDisableActions(!animated) 57 | self.frame = pulse.frame 58 | self.fillColor = pulse.backgroundColors.first 59 | self.opacity = 0.0 60 | self.path = pulse.path 61 | self.strokeColor = pulse.borderColors.first 62 | self.lineWidth = pulse.lineWidth 63 | CATransaction.commit() 64 | } 65 | 66 | class func pulseAnimation(from pulse: Pulse) -> CAAnimation { 67 | var animations: [CAAnimation] = [] 68 | 69 | let opacityAnimation = CABasicAnimation(keyPath: "opacity") 70 | opacityAnimation.fromValue = 1.0 71 | opacityAnimation.toValue = 0.0 72 | opacityAnimation.duration = max(pulse.duration, 0.0) 73 | opacityAnimation.isRemovedOnCompletion = false 74 | animations.append(opacityAnimation) 75 | 76 | let transformAnimation = CABasicAnimation(keyPath: "transform") 77 | transformAnimation.fromValue = NSValue(caTransform3D: pulse.transformBefore) 78 | transformAnimation.toValue = NSValue(caTransform3D: pulse.transformAfter) 79 | transformAnimation.duration = max(pulse.duration, 0.0) 80 | transformAnimation.isRemovedOnCompletion = false 81 | animations.append(transformAnimation) 82 | 83 | if pulse.borderColors.count > 1 { 84 | let strokeColorAnimation = CAKeyframeAnimation(keyPath: "strokeColor") 85 | strokeColorAnimation.values = pulse.borderColors 86 | strokeColorAnimation.duration = max(pulse.duration, 0.0) 87 | strokeColorAnimation.isRemovedOnCompletion = false 88 | animations.append(strokeColorAnimation) 89 | } 90 | 91 | if pulse.backgroundColors.count > 1 { 92 | let fillColorAnimation = CAKeyframeAnimation(keyPath: "fillColor") 93 | fillColorAnimation.values = pulse.backgroundColors 94 | fillColorAnimation.duration = max(pulse.duration, 0.0) 95 | fillColorAnimation.isRemovedOnCompletion = false 96 | animations.append(fillColorAnimation) 97 | } 98 | 99 | let animationGroup = CAAnimationGroup() 100 | animationGroup.duration = max(pulse.duration, 0.0) 101 | if pulse.repeatCount > 0 { 102 | animationGroup.duration += max(pulse.repeatDelay, 0.0) 103 | } 104 | animationGroup.animations = animations 105 | animationGroup.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut) 106 | animationGroup.repeatCount = min(Float(pulse.repeatCount), Float.infinity) 107 | animationGroup.isRemovedOnCompletion = false 108 | 109 | return animationGroup 110 | } 111 | 112 | public func pauseAnimations() { 113 | // https://developer.apple.com/library/archive/qa/qa1673/_index.html 114 | 115 | let currentTime = CACurrentMediaTime() 116 | let pausedTime = self.convertTime(currentTime, from: nil) 117 | self.speed = 0.0 118 | self.timeOffset = pausedTime 119 | } 120 | 121 | public func resumeAnimations(speed: Float = 1.0) { 122 | // https://developer.apple.com/library/archive/qa/qa1673/_index.html 123 | 124 | let pausedTime = self.timeOffset 125 | self.speed = speed 126 | self.timeOffset = 0.0 127 | self.beginTime = 0.0 128 | let currentTime = CACurrentMediaTime() 129 | let timeSincePause = self.convertTime(currentTime, from: nil) - pausedTime 130 | self.beginTime = timeSincePause 131 | } 132 | 133 | fileprivate func restoreAnimations() -> Float { 134 | guard let persistence = self.persistence else { 135 | return self.speed 136 | } 137 | 138 | defer { 139 | self.persistence = nil 140 | } 141 | 142 | self.speed = persistence.speed 143 | 144 | for (key, animation) in persistence.animations { 145 | self.removeAnimation(forKey: key) 146 | self.add(animation, forKey: key) 147 | } 148 | 149 | return persistence.speed 150 | } 151 | 152 | fileprivate func persistAnimations() { 153 | guard self.persistence == nil else { 154 | return 155 | } 156 | 157 | let animationKeys = self.animationKeys() ?? [] 158 | let animationsByKey = animationKeys.compactMap { key in 159 | self.animation(forKey: key).map { (key, $0) } 160 | } 161 | let animations = Dictionary(uniqueKeysWithValues: animationsByKey) 162 | 163 | self.persistence = Persistence( 164 | animations: animations, 165 | speed: speed 166 | ) 167 | } 168 | } 169 | 170 | extension PulseLayer: ApplicationObserverDelegate { 171 | public func applicationWillEnterForeground() { 172 | let speed = self.restoreAnimations() 173 | self.resumeAnimations(speed: speed) 174 | } 175 | 176 | public func applicationDidEnterBackground() { 177 | self.persistAnimations() 178 | self.pauseAnimations() 179 | } 180 | } 181 | -------------------------------------------------------------------------------- /PRGTipView/Classes/PRGTipView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PRGTipView.swift 3 | // 4 | // Created by John Spiropoulos on 8/6/20. 5 | // 6 | 7 | import Foundation 8 | import UIKit 9 | import CoreGraphics 10 | 11 | public class PRGTipView: UIViewController { 12 | 13 | public var configuration: PRGTipViewConfiguration 14 | public var focusRect: CGRect? 15 | 16 | 17 | private var overlayView: PRGAnimatableMaskedView? 18 | 19 | private let containerView: UIStackView = { 20 | let view = UIStackView() 21 | view.alpha = 0 22 | view.translatesAutoresizingMaskIntoConstraints = false 23 | view.axis = .vertical 24 | view.spacing = 20 25 | return view 26 | }() 27 | private let titleLbl: UILabel = { 28 | let lbl = UILabel() 29 | lbl.numberOfLines = 0 30 | return lbl 31 | }() 32 | 33 | private let textLbl: UILabel = { 34 | let lbl = UILabel() 35 | lbl.numberOfLines = 0 36 | return lbl 37 | }() 38 | 39 | private let button: UIButton = { 40 | let btn = UIButton() 41 | btn.contentHorizontalAlignment = .left 42 | btn.backgroundColor = UIColor(white: 1, alpha: 0) 43 | btn.addTarget(self, action: #selector(btnTapped(_:)), for: .touchUpInside) 44 | return btn 45 | }() 46 | 47 | init(configuration: PRGTipViewConfiguration) { 48 | self.configuration = configuration 49 | var focusRect: CGRect { 50 | if let view = configuration.focusView, 51 | let viewRect = view.superview?.convert(view.frame, to: nil) { 52 | return viewRect 53 | } 54 | return CGRect(x: UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY, width: 0, height: 0) 55 | } 56 | self.overlayView = PRGAnimatableMaskedView( 57 | frame: UIScreen.main.bounds, 58 | backgroundColor: configuration.backgroundColor.withAlphaComponent(configuration.backgroundAlpha), 59 | maskFrame: focusRect, 60 | inset: configuration.focusInsets, 61 | isCircular: configuration.circularFocus, 62 | useLargestDimension: configuration.useLargestDimension, 63 | pulseMode: configuration.pulseMode, 64 | animationsDuration: configuration.animationsDuration 65 | ) 66 | self.focusRect = focusRect 67 | 68 | super.init(nibName: nil, bundle: nil) 69 | self.modalPresentationStyle = .overFullScreen 70 | self.modalTransitionStyle = .crossDissolve 71 | } 72 | 73 | public override func viewDidLoad() { 74 | super.viewDidLoad() 75 | containerView.spacing = configuration.tipTextYSpacing 76 | if let overlayView = overlayView { 77 | view.backgroundColor = .clear 78 | view.addSubview(overlayView) 79 | } else { 80 | view.backgroundColor = configuration.backgroundColor.withAlphaComponent(configuration.backgroundAlpha) 81 | } 82 | view.addSubview(containerView) 83 | containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: configuration.tipContainerLeading).isActive = true 84 | containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -configuration.tipContainerTrailing).isActive = true 85 | 86 | if configuration.focusView == nil { 87 | containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 88 | } else { 89 | let centerY = (focusRect?.origin.y ?? 0) + (focusRect?.size.height ?? 0)/2 90 | 91 | if centerY > (UIScreen.main.bounds.size.height)/2 { 92 | let distance = configuration.focusDistance + configuration.focusInsets.top 93 | let difference = UIScreen.main.bounds.height - (focusRect?.origin.y ?? 0) 94 | containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -(difference + distance)).isActive = true 95 | } else { 96 | let distance = configuration.focusDistance + configuration.focusInsets.bottom 97 | let difference = (focusRect?.origin.y ?? 0) + (focusRect?.size.height ?? 0) 98 | containerView.topAnchor.constraint(equalTo: view.topAnchor, constant: difference + distance).isActive = true 99 | } 100 | } 101 | containerView.addArrangedSubview(titleLbl) 102 | containerView.addArrangedSubview(textLbl) 103 | containerView.addArrangedSubview(button) 104 | 105 | titleLbl.font = configuration.titleTextFont 106 | titleLbl.textColor = configuration.titleTextColor 107 | if let attrTitle = configuration.attributedTitleText { 108 | titleLbl.attributedText = attrTitle 109 | } else { 110 | titleLbl.text = configuration.titleText 111 | } 112 | 113 | 114 | textLbl.font = configuration.detailTextFont 115 | textLbl.textColor = configuration.detailTextColor 116 | if let attrDetail = configuration.attributedDetailText { 117 | textLbl.attributedText = attrDetail 118 | } else { 119 | textLbl.text = configuration.detailText 120 | } 121 | 122 | 123 | button.setTitleColor(configuration.buttonTextColor, for: .normal) 124 | button.titleLabel?.font = configuration.buttonTextFont 125 | 126 | if let attrButton = configuration.attributedButtonText { 127 | button.setAttributedTitle(attrButton, for: .normal) 128 | } else { 129 | button.setTitle(configuration.buttonText, for: .normal) 130 | } 131 | 132 | UIView.animate(withDuration: configuration.animateIn ? configuration.animationsDuration : 0) { [weak self] in 133 | self?.containerView.alpha = 1 134 | } 135 | overlayView?.show(animated: configuration.animateIn) 136 | } 137 | 138 | @objc private func btnTapped(_ sender: UIButton) { 139 | UIView.animate(withDuration: configuration.animateOut ? configuration.animationsDuration : 0) { [weak self] in 140 | self?.containerView.alpha = 0 141 | } 142 | 143 | overlayView?.hide(animated: configuration.animateOut) {[weak self] in 144 | self?.dismiss(animated: false, completion: { 145 | self?.configuration.buttonAction?() 146 | }) 147 | 148 | 149 | } 150 | 151 | } 152 | required init?(coder: NSCoder) { 153 | fatalError("init(coder:) has not been implemented") 154 | } 155 | 156 | deinit { 157 | print("TipView has been deinitialised") 158 | } 159 | 160 | public static func show(fromViewController viewController: UIViewController, withConfiguration configuration: PRGTipViewConfiguration, completion: (()->())?) { 161 | let tipView = PRGTipView(configuration: configuration) 162 | viewController.present(tipView, animated: false, completion: completion) 163 | } 164 | } 165 | 166 | 167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PRGTipView 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/PRGTipView.svg?style=flat)](https://cocoapods.org/pods/PRGTipView) 4 | [![License](https://img.shields.io/cocoapods/l/PRGTipView.svg?style=flat)](https://cocoapods.org/pods/PRGTipView) 5 | [![Platform](https://img.shields.io/cocoapods/p/PRGTipView.svg?style=flat)](https://cocoapods.org/pods/PRGTipView) 6 | 7 | 8 | PRGTipView is a drop-in solution for adding onboarding tips to your apps. It supports: 9 | - Title, detail and dismissal button 10 | - Give focus on a particular view with configurable insets 11 | - Automatic placement of title, detail and the button above or below the focused view (if provided) 12 | - Presentation and dismissal animations 13 | - Focus view pulsating effect (using the [Pulsar](https://github.com/regexident/Pulsar) Library) 14 | 15 | ![](PRGTipView.gif) 16 | 17 | ## Example 18 | 19 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 20 | 21 | ## Requirements 22 | 23 | - iOS 9.3+ 24 | - Swift 5 25 | 26 | ## Installation 27 | 28 | PRGTipView is available through [CocoaPods](https://cocoapods.org). To install 29 | it, simply add the following line to your Podfile: 30 | 31 | ```ruby 32 | pod 'PRGTipView' 33 | ``` 34 | 35 | ## Usage 36 | 37 | 38 | ```swift 39 | //1. Create a PRGTipViewConfiguration instance 40 | let config = PRGTipViewConfiguration() 41 | 42 | //2. Customize the TipView via the properties 43 | config.titleText = "This is a title" 44 | config.detailText = "This is the detail text, that adds more information to your tip." 45 | config.buttonText = "OK" 46 | config.focusView = button 47 | config.focusInsets = UIEdgeInsets(top: 8, left: 4, bottom: 8, right: 4) 48 | config.focusDistance = 50 49 | config.circularFocus = false 50 | config.animateIn = true 51 | config.animateOut = true 52 | 53 | //3a. You can either use the static func TipView.show like described below: 54 | PRGTipView.show(fromViewController: self, withConfiguration: config, completion: nil) 55 | 56 | //3b. Or you can create a PRGTipView instance and present it (it's a ViewController subclass) 57 | let tipView = PRGTipView(configuration: config) 58 | present(tipView, animated: false, completion: nil) 59 | ``` 60 | 61 | ## Configuration Properties 62 | PRGTipViewConfiguration contains properties that help customize the presenting tip view: 63 | 64 | | PROPERTY | TYPE | DEFAULT VALUE | EXPLANATION | 65 | |-|-|-|-| 66 | | backgroundColor | UIColor | .black | The background color of the Tip View | 67 | | backgroundAlpha | CGFloat | 0.85 | The background alpha of the Tip View | 68 | | tipTextYSpacing | CGFloat | 30 | The vertical spacing between the Tip View Title, Detail and Button | 69 | | titleText | String? | | The string to be shown as the Tip View title | 70 | | titleTextFont | UIFont | systemFont(ofSize: 25) | The font of the Tip View title | 71 | | titleTextColor | UIColor | .white | The color of the Tip View title | 72 | | attributedTitleText | NSAttributedString? | | The attributed string to be shown as the Tip View title. If set, it overrides "titleText", "titleTextFont" and "titleTextColor" properties | 73 | | detailText | String? | | The string to be shown as the Tip View detail | 74 | | detailTextFont | UIFont | systemFont(ofSize: 29) | The font of the Tip View detail | 75 | | detailTextColor | UIColor | .white | The color of the Tip View detail | 76 | | attributedDetailText | NSAttributedString? | | The attributed string to be shown as the Tip View detail. If set, it overrides "detailText", "detailTextFont" and "detailTextColor" properties | 77 | | buttonText | String? | | The string to be shown as the Tip View dismissal button title | 78 | | buttonTextFont | UIFont | boldSystemFont(ofSize: 14) | The font of the Tip View dismissal button | 79 | | buttonTextColor | UIColor | .white | The color of the Tip View dismissal button | 80 | | attributedButtonText | NSAttributedString? | | The attributed string to be shown as the Tip View dismissal title. If set, it overrides "buttonText", "buttonTextFont" and "buttonTextColor" properties | 81 | | focusView | UIView? | | The UIView to be focused when the Tip View is presented | 82 | | circularFocus | Bool | false | If a "focusView" is provided, this property controls whether the mask used to focus on the view should be circular. In default "false" state, the mask is rectangular | 83 | | useLargestDimension | Bool | true | If "circularFocus" is set to true for a non square "focusView", leaving this property to "true" will use the "focusView"'s largest dimension to calculate the focus mask radius, while setting it to "false" will use the smallest dimension and centre the circular mask on the "focusView". | 84 | | focusInsets | UIEdgeInsets | .zero | Adds padding to the "focusView" mask. If "circularFocus" is set to "true", then it adds only the .top inset to the radius calculation. | 85 | | animateIn | Bool | true | Whether the Tip View should be presented animated. Helpful in situations where you want to chain several Tip Views and you do not want to repeat the animation on each and every one of them. | 86 | | animateOut | Bool | true | Whether the Tip View should be dismissed animated. Helpful in situations where you want to chain several Tip Views and you do not want to repeat the animation on each and every one of them. | 87 | | pulseMode | Enum | .none | Whether the "focusView", if provided, should pulse. | 88 | | focusDistance | CGfloat | 0 | The vertical spacing between the "focusView" and the container of the actual Tip Texts (Title, Detail, Button). If the provided "focusView" is in the bottom half of the screen, the tip container is presented above it and this property is the distance from the bottom of the tip container to the top of the "focusView" mask. If the provided "focusView" is in the top half of the screen, the tip container is presented below it and this property is the distance from the top of the tip container to the bottom of the "focusView" mask. | 89 | | tipContainerLeading | CGFloat | 20 | The spacing between the container of the actual Tip Texts (Title, Detail, Button) to it's superView's leading. | 90 | | tipContainerTrailing | CGFloat | 20 | The spacing between the container of the actual Tip Texts (Title, Detail, Button) trailing to it's superView's trailing. | 91 | | animationDuration | Double | 0.3 | The duration of any animation that takes place in the Tip View (except from the pulsating effect) | 92 | | buttonAction | (()->())? | | The code to be executed after the Tip View is dismissed | 93 | 94 | ## About the Pulsar Library 95 | 96 | At the time of publishing PRGTipView, the Pulsar library has not been updated on the Cocoapods repositories and cannot be used as a direct dependency, thus resorting in including the v2.0.5 source code in the bundle. As soon as the dependencies are satisfied via Cocoapods, we will update PRGTipView to use Pulsar as a pod dependency. 97 | 98 | ## License 99 | 100 | PRGTipView is made for [Programize LLC](https://www.programize.com) by John Spiropoulos and it is available under the MIT license. 101 | 102 | This product includes Pulsar code by Vincent Esche. License information is stored here: [LICENSE](LICENSE) 103 | 104 | -------------------------------------------------------------------------------- /PRGTipView/Classes/PRGAnimatableMaskView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PRGAnimatableMaskView.swift 3 | // 4 | // Created by John Spiropoulos on 8/6/20. 5 | // 6 | 7 | import UIKit 8 | 9 | public class PRGAnimatableMaskedView: UIView, CAAnimationDelegate { 10 | let kAnimatableMaskedViewDismissalAnimationKey = "MASK_LAYER_DISMISSAL_ANIMATION" 11 | let kAnimatableMaskedViewPresentationAnimationKey = "MASK_LAYER_PRESENTATION_ANIMATION" 12 | 13 | public var pathToEnd: CGPath 14 | public var pathToStart: CGPath 15 | public var maskLayer: CAShapeLayer 16 | public var pulseLayer: CAShapeLayer? 17 | public var pulseMode: PRGTipViewFocusViewPulseMode? 18 | public var animationsDuration: Double 19 | 20 | private var dismissalCompletion: (()->())? 21 | init(frame: CGRect, backgroundColor: UIColor, maskFrame: CGRect, inset: UIEdgeInsets, isCircular: Bool, useLargestDimension: Bool, pulseMode: PRGTipViewFocusViewPulseMode, animationsDuration: Double) { 22 | self.animationsDuration = animationsDuration 23 | let path = CGMutablePath() 24 | let endPath = CGMutablePath() 25 | let largest = useLargestDimension ? 26 | max(maskFrame.width, maskFrame.height) : min(maskFrame.width, maskFrame.height) 27 | 28 | if isCircular { 29 | let center = CGPoint(x: maskFrame.midX, y: maskFrame.midY) 30 | [path, endPath].forEach({ 31 | $0.addArc( 32 | center: center, 33 | radius: largest/2 + inset.top, 34 | startAngle: 0.0, 35 | endAngle: 2.0 * .pi, 36 | clockwise: false 37 | ) 38 | }) 39 | 40 | } else { 41 | let invertInset = UIEdgeInsets( 42 | top: -inset.top, 43 | left: -inset.left, 44 | bottom: -inset.bottom, 45 | right: -inset.right 46 | ) 47 | let rect = maskFrame.inset(by: invertInset) 48 | [path, endPath].forEach({ 49 | $0.addRect(rect) 50 | }) 51 | } 52 | let maskCenterPoint = CGPoint(x: maskFrame.midX, y: maskFrame.midY) 53 | endPath.addArc( 54 | center: maskCenterPoint, 55 | radius: AnimatableMaskViewHelpers.maximumCornerDistance(of: frame, from: maskCenterPoint), 56 | startAngle: 0.0, 57 | endAngle: 2.0 * .pi, 58 | clockwise: false 59 | ) 60 | 61 | self.pathToEnd = endPath 62 | 63 | 64 | path.addArc( 65 | center: maskCenterPoint, 66 | radius: (isCircular ? (largest/2) + inset.top: largest + inset.top + inset.bottom), 67 | startAngle: 0.0, 68 | endAngle: 2.0 * .pi, 69 | clockwise: false 70 | ) 71 | 72 | pathToStart = path 73 | maskLayer = CAShapeLayer() 74 | 75 | super.init(frame: frame) 76 | 77 | maskLayer.backgroundColor = UIColor.black.cgColor 78 | maskLayer.path = path 79 | maskLayer.fillRule = .evenOdd 80 | maskLayer.anchorPoint = CGPoint(x: 0, y: 0) 81 | self.backgroundColor = backgroundColor 82 | 83 | layer.mask = maskLayer 84 | self.pulseMode = pulseMode 85 | switch pulseMode { 86 | case .pulse: 87 | pulseLayer = CAShapeLayer() 88 | let pulseLayerPath = CGMutablePath() 89 | let invertInset = UIEdgeInsets( 90 | top: -inset.top, 91 | left: -inset.left, 92 | bottom: -inset.bottom, 93 | right: -inset.right 94 | ) 95 | let insetRect = maskFrame.inset(by: invertInset) 96 | pulseLayer?.frame = insetRect 97 | if isCircular { 98 | pulseLayerPath.addArc(center: CGPoint(x: insetRect.midX - insetRect.minX, y: insetRect.midY - insetRect.minY), radius: largest/2 + inset.top, startAngle: 0.0, endAngle: 2.0 * .pi, clockwise: false) 99 | } else { 100 | pulseLayerPath.addRect(CGRect(x: 0, y: 0, width: insetRect.width, height: insetRect.height)) 101 | } 102 | pulseLayer?.path = pulseLayerPath 103 | if let pulseLayer = pulseLayer { 104 | layer.addSublayer(pulseLayer) 105 | } 106 | default: 107 | break 108 | } 109 | } 110 | 111 | required init?(coder: NSCoder) { 112 | fatalError("init(coder:) has not been implemented") 113 | } 114 | 115 | func show(animated: Bool) { 116 | handlePresentation(animated: animated, dismissal: false) 117 | } 118 | 119 | func hide(animated: Bool, completion:(()->())? = nil) { 120 | handlePresentation(animated: animated, dismissal: true, dismissalCompletion: completion) 121 | } 122 | 123 | func handlePresentation(animated: Bool, dismissal: Bool = false, dismissalCompletion: (()->())? = nil) { 124 | self.dismissalCompletion = dismissalCompletion 125 | let anim = CABasicAnimation(keyPath: "path") 126 | anim.fromValue = dismissal ? pathToEnd : pathToStart 127 | anim.toValue = dismissal ? pathToStart : pathToEnd 128 | anim.fillMode = .forwards 129 | anim.isRemovedOnCompletion = false 130 | var duration: Double { 131 | if dismissal { return animated ? animationsDuration : 0.01} 132 | return animated ? animationsDuration : 0.01 133 | } 134 | anim.duration = duration 135 | anim.timingFunction = CAMediaTimingFunction(name: .linear) 136 | anim.delegate = self 137 | 138 | if dismissal { 139 | pulseLayer?.removePulses() 140 | } 141 | maskLayer.add(anim, forKey: dismissal ? kAnimatableMaskedViewDismissalAnimationKey : kAnimatableMaskedViewPresentationAnimationKey) 142 | } 143 | 144 | public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 145 | if anim == maskLayer.animation(forKey: kAnimatableMaskedViewDismissalAnimationKey), flag { 146 | dismissalCompletion?() 147 | } 148 | if anim == maskLayer.animation(forKey: kAnimatableMaskedViewPresentationAnimationKey) { 149 | switch pulseMode { 150 | case .some(.pulse(let repeatCount, let backgroundColors, let borderColors, let lineWidth)): 151 | DispatchQueue.main.async { [weak self] in 152 | _ = self?.pulseLayer?.addPulse { (pulse) in 153 | pulse.repeatCount = repeatCount 154 | pulse.borderColors = borderColors.map({$0.cgColor}) 155 | pulse.backgroundColors = backgroundColors.map({$0.cgColor}) 156 | pulse.lineWidth = lineWidth 157 | } 158 | } 159 | 160 | default: break 161 | } 162 | } 163 | } 164 | } 165 | 166 | private class AnimatableMaskViewHelpers { 167 | static func distance(fromPoint: CGPoint, to point: CGPoint) -> CGFloat { 168 | return sqrt(pow((point.x - fromPoint.x), 2) + pow((point.y - fromPoint.y), 2)) 169 | } 170 | 171 | static func maximumCornerDistance(of rect: CGRect, from point: CGPoint) -> CGFloat { 172 | let topLeft = rect.origin 173 | let fromTopLeft = distance(fromPoint: topLeft, to: point) 174 | let topRight = CGPoint(x: rect.maxX, y: rect.minY) 175 | let fromTopRight = distance(fromPoint: topRight, to: point) 176 | let bottomLeft = CGPoint(x: rect.minX, y: rect.maxY) 177 | let fromBottomLeft = distance(fromPoint: bottomLeft, to: point) 178 | let bottomRight = CGPoint(x: rect.maxX, y: rect.maxY) 179 | let fromBottomRight = distance(fromPoint: bottomRight, to: point) 180 | return max(fromBottomLeft, fromBottomRight, fromTopLeft, fromTopRight) 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | warn_missing_arch=${2:-true} 88 | if [ -r "$source" ]; then 89 | # Copy the dSYM into the targets temp dir. 90 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 91 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 92 | 93 | local basename 94 | basename="$(basename -s .dSYM "$source")" 95 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 96 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 97 | 98 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 99 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 100 | strip_invalid_archs "$binary" "$warn_missing_arch" 101 | fi 102 | 103 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 104 | # Move the stripped file into its final destination. 105 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 106 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 107 | else 108 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 109 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 110 | fi 111 | fi 112 | } 113 | 114 | # Copies the bcsymbolmap files of a vendored framework 115 | install_bcsymbolmap() { 116 | local bcsymbolmap_path="$1" 117 | local destination="${BUILT_PRODUCTS_DIR}" 118 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 119 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 120 | } 121 | 122 | # Signs a framework with the provided identity 123 | code_sign_if_enabled() { 124 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 125 | # Use the current code_sign_identity 126 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 127 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 128 | 129 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 130 | code_sign_cmd="$code_sign_cmd &" 131 | fi 132 | echo "$code_sign_cmd" 133 | eval "$code_sign_cmd" 134 | fi 135 | } 136 | 137 | # Strip invalid architectures 138 | strip_invalid_archs() { 139 | binary="$1" 140 | warn_missing_arch=${2:-true} 141 | # Get architectures for current target binary 142 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 143 | # Intersect them with the architectures we are building for 144 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 145 | # If there are no archs supported by this binary then warn the user 146 | if [[ -z "$intersected_archs" ]]; then 147 | if [[ "$warn_missing_arch" == "true" ]]; then 148 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 149 | fi 150 | STRIP_BINARY_RETVAL=0 151 | return 152 | fi 153 | stripped="" 154 | for arch in $binary_archs; do 155 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 156 | # Strip non-valid architectures in-place 157 | lipo -remove "$arch" -output "$binary" "$binary" 158 | stripped="$stripped $arch" 159 | fi 160 | done 161 | if [[ "$stripped" ]]; then 162 | echo "Stripped $binary of architectures:$stripped" 163 | fi 164 | STRIP_BINARY_RETVAL=1 165 | } 166 | 167 | install_artifact() { 168 | artifact="$1" 169 | base="$(basename "$artifact")" 170 | case $base in 171 | *.framework) 172 | install_framework "$artifact" 173 | ;; 174 | *.dSYM) 175 | # Suppress arch warnings since XCFrameworks will include many dSYM files 176 | install_dsym "$artifact" "false" 177 | ;; 178 | *.bcsymbolmap) 179 | install_bcsymbolmap "$artifact" 180 | ;; 181 | *) 182 | echo "error: Unrecognized artifact "$artifact"" 183 | ;; 184 | esac 185 | } 186 | 187 | copy_artifacts() { 188 | file_list="$1" 189 | while read artifact; do 190 | install_artifact "$artifact" 191 | done <$file_list 192 | } 193 | 194 | ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" 195 | if [ -r "${ARTIFACT_LIST_FILE}" ]; then 196 | copy_artifacts "${ARTIFACT_LIST_FILE}" 197 | fi 198 | 199 | if [[ "$CONFIGURATION" == "Debug" ]]; then 200 | install_framework "${BUILT_PRODUCTS_DIR}/PRGTipView/PRGTipView.framework" 201 | fi 202 | if [[ "$CONFIGURATION" == "Release" ]]; then 203 | install_framework "${BUILT_PRODUCTS_DIR}/PRGTipView/PRGTipView.framework" 204 | fi 205 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 206 | wait 207 | fi 208 | -------------------------------------------------------------------------------- /Example/PRGTipView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 36 | 47 | 61 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /Example/PRGTipView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 430C9159CFA520885C2E3EB6 /* Pods_PRGTipView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C94A578BB756F046CC7DC60F /* Pods_PRGTipView_Example.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 13 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 14 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 15 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 16 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 17 | F9A8F3E379BC2D93FEDE1330 /* Pods_PRGTipView_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC0E4546883C47624942900 /* Pods_PRGTipView_Tests.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = PRGTipView; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 0F064C7B3E8E35111549313C /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 32 | 607FACD01AFB9204008FA782 /* PRGTipView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PRGTipView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 35 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 36 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 37 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 38 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 39 | 607FACE51AFB9204008FA782 /* PRGTipView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PRGTipView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 42 | 9510F51020B1B75507E4317B /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 43 | BFC0E4546883C47624942900 /* Pods_PRGTipView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PRGTipView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | C94A578BB756F046CC7DC60F /* Pods_PRGTipView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PRGTipView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | D026385A5B3FA0DA70FD027F /* Pods-PRGTipView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PRGTipView_Example.debug.xcconfig"; path = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.debug.xcconfig"; sourceTree = ""; }; 46 | D6BE176196C84FF00769AD43 /* Pods-PRGTipView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PRGTipView_Example.release.xcconfig"; path = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.release.xcconfig"; sourceTree = ""; }; 47 | D6D7D3F8B2CBCF8B943B2E52 /* Pods-PRGTipView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PRGTipView_Tests.debug.xcconfig"; path = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.debug.xcconfig"; sourceTree = ""; }; 48 | D89ECA6322208C9E8E53ACB8 /* PRGTipView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = PRGTipView.podspec; path = ../PRGTipView.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 49 | F94668EF62210C16116ECE0C /* Pods-PRGTipView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PRGTipView_Tests.release.xcconfig"; path = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.release.xcconfig"; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 430C9159CFA520885C2E3EB6 /* Pods_PRGTipView_Example.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | F9A8F3E379BC2D93FEDE1330 /* Pods_PRGTipView_Tests.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 3C8A64F55224E33C088932B9 /* Pods */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | D026385A5B3FA0DA70FD027F /* Pods-PRGTipView_Example.debug.xcconfig */, 76 | D6BE176196C84FF00769AD43 /* Pods-PRGTipView_Example.release.xcconfig */, 77 | D6D7D3F8B2CBCF8B943B2E52 /* Pods-PRGTipView_Tests.debug.xcconfig */, 78 | F94668EF62210C16116ECE0C /* Pods-PRGTipView_Tests.release.xcconfig */, 79 | ); 80 | path = Pods; 81 | sourceTree = ""; 82 | }; 83 | 607FACC71AFB9204008FA782 = { 84 | isa = PBXGroup; 85 | children = ( 86 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 87 | 607FACD21AFB9204008FA782 /* Example for PRGTipView */, 88 | 607FACE81AFB9204008FA782 /* Tests */, 89 | 607FACD11AFB9204008FA782 /* Products */, 90 | 3C8A64F55224E33C088932B9 /* Pods */, 91 | 865070FAC61B11769F7C772F /* Frameworks */, 92 | ); 93 | sourceTree = ""; 94 | }; 95 | 607FACD11AFB9204008FA782 /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 607FACD01AFB9204008FA782 /* PRGTipView_Example.app */, 99 | 607FACE51AFB9204008FA782 /* PRGTipView_Tests.xctest */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | 607FACD21AFB9204008FA782 /* Example for PRGTipView */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 108 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 109 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 110 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 111 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 112 | 607FACD31AFB9204008FA782 /* Supporting Files */, 113 | ); 114 | name = "Example for PRGTipView"; 115 | path = PRGTipView; 116 | sourceTree = ""; 117 | }; 118 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 607FACD41AFB9204008FA782 /* Info.plist */, 122 | ); 123 | name = "Supporting Files"; 124 | sourceTree = ""; 125 | }; 126 | 607FACE81AFB9204008FA782 /* Tests */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 130 | 607FACE91AFB9204008FA782 /* Supporting Files */, 131 | ); 132 | path = Tests; 133 | sourceTree = ""; 134 | }; 135 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 607FACEA1AFB9204008FA782 /* Info.plist */, 139 | ); 140 | name = "Supporting Files"; 141 | sourceTree = ""; 142 | }; 143 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | D89ECA6322208C9E8E53ACB8 /* PRGTipView.podspec */, 147 | 9510F51020B1B75507E4317B /* README.md */, 148 | 0F064C7B3E8E35111549313C /* LICENSE */, 149 | ); 150 | name = "Podspec Metadata"; 151 | sourceTree = ""; 152 | }; 153 | 865070FAC61B11769F7C772F /* Frameworks */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | C94A578BB756F046CC7DC60F /* Pods_PRGTipView_Example.framework */, 157 | BFC0E4546883C47624942900 /* Pods_PRGTipView_Tests.framework */, 158 | ); 159 | name = Frameworks; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXNativeTarget section */ 165 | 607FACCF1AFB9204008FA782 /* PRGTipView_Example */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "PRGTipView_Example" */; 168 | buildPhases = ( 169 | D1C9C65509CC919CC11CBA52 /* [CP] Check Pods Manifest.lock */, 170 | 607FACCC1AFB9204008FA782 /* Sources */, 171 | 607FACCD1AFB9204008FA782 /* Frameworks */, 172 | 607FACCE1AFB9204008FA782 /* Resources */, 173 | EAF11A9B62E1F42F815C74BB /* [CP] Embed Pods Frameworks */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | ); 179 | name = PRGTipView_Example; 180 | productName = PRGTipView; 181 | productReference = 607FACD01AFB9204008FA782 /* PRGTipView_Example.app */; 182 | productType = "com.apple.product-type.application"; 183 | }; 184 | 607FACE41AFB9204008FA782 /* PRGTipView_Tests */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "PRGTipView_Tests" */; 187 | buildPhases = ( 188 | 59B7CD9206527765DB478A5F /* [CP] Check Pods Manifest.lock */, 189 | 607FACE11AFB9204008FA782 /* Sources */, 190 | 607FACE21AFB9204008FA782 /* Frameworks */, 191 | 607FACE31AFB9204008FA782 /* Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 197 | ); 198 | name = PRGTipView_Tests; 199 | productName = Tests; 200 | productReference = 607FACE51AFB9204008FA782 /* PRGTipView_Tests.xctest */; 201 | productType = "com.apple.product-type.bundle.unit-test"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | 607FACC81AFB9204008FA782 /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | LastSwiftUpdateCheck = 0830; 210 | LastUpgradeCheck = 1140; 211 | ORGANIZATIONNAME = CocoaPods; 212 | TargetAttributes = { 213 | 607FACCF1AFB9204008FA782 = { 214 | CreatedOnToolsVersion = 6.3.1; 215 | LastSwiftMigration = 1140; 216 | }; 217 | 607FACE41AFB9204008FA782 = { 218 | CreatedOnToolsVersion = 6.3.1; 219 | LastSwiftMigration = 1140; 220 | TestTargetID = 607FACCF1AFB9204008FA782; 221 | }; 222 | }; 223 | }; 224 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "PRGTipView" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = English; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | English, 230 | en, 231 | Base, 232 | ); 233 | mainGroup = 607FACC71AFB9204008FA782; 234 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 235 | projectDirPath = ""; 236 | projectRoot = ""; 237 | targets = ( 238 | 607FACCF1AFB9204008FA782 /* PRGTipView_Example */, 239 | 607FACE41AFB9204008FA782 /* PRGTipView_Tests */, 240 | ); 241 | }; 242 | /* End PBXProject section */ 243 | 244 | /* Begin PBXResourcesBuildPhase section */ 245 | 607FACCE1AFB9204008FA782 /* Resources */ = { 246 | isa = PBXResourcesBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 250 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 251 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | 607FACE31AFB9204008FA782 /* Resources */ = { 256 | isa = PBXResourcesBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | }; 262 | /* End PBXResourcesBuildPhase section */ 263 | 264 | /* Begin PBXShellScriptBuildPhase section */ 265 | 59B7CD9206527765DB478A5F /* [CP] Check Pods Manifest.lock */ = { 266 | isa = PBXShellScriptBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | ); 270 | inputFileListPaths = ( 271 | ); 272 | inputPaths = ( 273 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 274 | "${PODS_ROOT}/Manifest.lock", 275 | ); 276 | name = "[CP] Check Pods Manifest.lock"; 277 | outputFileListPaths = ( 278 | ); 279 | outputPaths = ( 280 | "$(DERIVED_FILE_DIR)/Pods-PRGTipView_Tests-checkManifestLockResult.txt", 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | shellPath = /bin/sh; 284 | 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"; 285 | showEnvVarsInLog = 0; 286 | }; 287 | D1C9C65509CC919CC11CBA52 /* [CP] Check Pods Manifest.lock */ = { 288 | isa = PBXShellScriptBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | inputFileListPaths = ( 293 | ); 294 | inputPaths = ( 295 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 296 | "${PODS_ROOT}/Manifest.lock", 297 | ); 298 | name = "[CP] Check Pods Manifest.lock"; 299 | outputFileListPaths = ( 300 | ); 301 | outputPaths = ( 302 | "$(DERIVED_FILE_DIR)/Pods-PRGTipView_Example-checkManifestLockResult.txt", 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | shellPath = /bin/sh; 306 | 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"; 307 | showEnvVarsInLog = 0; 308 | }; 309 | EAF11A9B62E1F42F815C74BB /* [CP] Embed Pods Frameworks */ = { 310 | isa = PBXShellScriptBuildPhase; 311 | buildActionMask = 2147483647; 312 | files = ( 313 | ); 314 | inputPaths = ( 315 | "${PODS_ROOT}/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-frameworks.sh", 316 | "${BUILT_PRODUCTS_DIR}/PRGTipView/PRGTipView.framework", 317 | ); 318 | name = "[CP] Embed Pods Frameworks"; 319 | outputPaths = ( 320 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PRGTipView.framework", 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | shellPath = /bin/sh; 324 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-frameworks.sh\"\n"; 325 | showEnvVarsInLog = 0; 326 | }; 327 | /* End PBXShellScriptBuildPhase section */ 328 | 329 | /* Begin PBXSourcesBuildPhase section */ 330 | 607FACCC1AFB9204008FA782 /* Sources */ = { 331 | isa = PBXSourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 335 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | }; 339 | 607FACE11AFB9204008FA782 /* Sources */ = { 340 | isa = PBXSourcesBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 344 | ); 345 | runOnlyForDeploymentPostprocessing = 0; 346 | }; 347 | /* End PBXSourcesBuildPhase section */ 348 | 349 | /* Begin PBXTargetDependency section */ 350 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 351 | isa = PBXTargetDependency; 352 | target = 607FACCF1AFB9204008FA782 /* PRGTipView_Example */; 353 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 354 | }; 355 | /* End PBXTargetDependency section */ 356 | 357 | /* Begin PBXVariantGroup section */ 358 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 359 | isa = PBXVariantGroup; 360 | children = ( 361 | 607FACDA1AFB9204008FA782 /* Base */, 362 | ); 363 | name = Main.storyboard; 364 | sourceTree = ""; 365 | }; 366 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 367 | isa = PBXVariantGroup; 368 | children = ( 369 | 607FACDF1AFB9204008FA782 /* Base */, 370 | ); 371 | name = LaunchScreen.xib; 372 | sourceTree = ""; 373 | }; 374 | /* End PBXVariantGroup section */ 375 | 376 | /* Begin XCBuildConfiguration section */ 377 | 607FACED1AFB9204008FA782 /* Debug */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 382 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 383 | CLANG_CXX_LIBRARY = "libc++"; 384 | CLANG_ENABLE_MODULES = YES; 385 | CLANG_ENABLE_OBJC_ARC = YES; 386 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 387 | CLANG_WARN_BOOL_CONVERSION = YES; 388 | CLANG_WARN_COMMA = YES; 389 | CLANG_WARN_CONSTANT_CONVERSION = YES; 390 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 391 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 392 | CLANG_WARN_EMPTY_BODY = YES; 393 | CLANG_WARN_ENUM_CONVERSION = YES; 394 | CLANG_WARN_INFINITE_RECURSION = YES; 395 | CLANG_WARN_INT_CONVERSION = YES; 396 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 397 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 398 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 400 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 401 | CLANG_WARN_STRICT_PROTOTYPES = YES; 402 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 403 | CLANG_WARN_UNREACHABLE_CODE = YES; 404 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 405 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 406 | COPY_PHASE_STRIP = NO; 407 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 408 | ENABLE_STRICT_OBJC_MSGSEND = YES; 409 | ENABLE_TESTABILITY = YES; 410 | GCC_C_LANGUAGE_STANDARD = gnu99; 411 | GCC_DYNAMIC_NO_PIC = NO; 412 | GCC_NO_COMMON_BLOCKS = YES; 413 | GCC_OPTIMIZATION_LEVEL = 0; 414 | GCC_PREPROCESSOR_DEFINITIONS = ( 415 | "DEBUG=1", 416 | "$(inherited)", 417 | ); 418 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 426 | MTL_ENABLE_DEBUG_INFO = YES; 427 | ONLY_ACTIVE_ARCH = YES; 428 | SDKROOT = iphoneos; 429 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 430 | }; 431 | name = Debug; 432 | }; 433 | 607FACEE1AFB9204008FA782 /* Release */ = { 434 | isa = XCBuildConfiguration; 435 | buildSettings = { 436 | ALWAYS_SEARCH_USER_PATHS = NO; 437 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 438 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 439 | CLANG_CXX_LIBRARY = "libc++"; 440 | CLANG_ENABLE_MODULES = YES; 441 | CLANG_ENABLE_OBJC_ARC = YES; 442 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 443 | CLANG_WARN_BOOL_CONVERSION = YES; 444 | CLANG_WARN_COMMA = YES; 445 | CLANG_WARN_CONSTANT_CONVERSION = YES; 446 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 447 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 448 | CLANG_WARN_EMPTY_BODY = YES; 449 | CLANG_WARN_ENUM_CONVERSION = YES; 450 | CLANG_WARN_INFINITE_RECURSION = YES; 451 | CLANG_WARN_INT_CONVERSION = YES; 452 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 453 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 454 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 455 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 456 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 457 | CLANG_WARN_STRICT_PROTOTYPES = YES; 458 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 459 | CLANG_WARN_UNREACHABLE_CODE = YES; 460 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 461 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 462 | COPY_PHASE_STRIP = NO; 463 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 464 | ENABLE_NS_ASSERTIONS = NO; 465 | ENABLE_STRICT_OBJC_MSGSEND = YES; 466 | GCC_C_LANGUAGE_STANDARD = gnu99; 467 | GCC_NO_COMMON_BLOCKS = YES; 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNDECLARED_SELECTOR = YES; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 475 | MTL_ENABLE_DEBUG_INFO = NO; 476 | SDKROOT = iphoneos; 477 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 478 | VALIDATE_PRODUCT = YES; 479 | }; 480 | name = Release; 481 | }; 482 | 607FACF01AFB9204008FA782 /* Debug */ = { 483 | isa = XCBuildConfiguration; 484 | baseConfigurationReference = D026385A5B3FA0DA70FD027F /* Pods-PRGTipView_Example.debug.xcconfig */; 485 | buildSettings = { 486 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 487 | INFOPLIST_FILE = PRGTipView/Info.plist; 488 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 489 | MODULE_NAME = ExampleApp; 490 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 491 | PRODUCT_NAME = "$(TARGET_NAME)"; 492 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 493 | SWIFT_VERSION = 5.0; 494 | }; 495 | name = Debug; 496 | }; 497 | 607FACF11AFB9204008FA782 /* Release */ = { 498 | isa = XCBuildConfiguration; 499 | baseConfigurationReference = D6BE176196C84FF00769AD43 /* Pods-PRGTipView_Example.release.xcconfig */; 500 | buildSettings = { 501 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 502 | INFOPLIST_FILE = PRGTipView/Info.plist; 503 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 504 | MODULE_NAME = ExampleApp; 505 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 506 | PRODUCT_NAME = "$(TARGET_NAME)"; 507 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 508 | SWIFT_VERSION = 5.0; 509 | }; 510 | name = Release; 511 | }; 512 | 607FACF31AFB9204008FA782 /* Debug */ = { 513 | isa = XCBuildConfiguration; 514 | baseConfigurationReference = D6D7D3F8B2CBCF8B943B2E52 /* Pods-PRGTipView_Tests.debug.xcconfig */; 515 | buildSettings = { 516 | FRAMEWORK_SEARCH_PATHS = ( 517 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 518 | "$(inherited)", 519 | ); 520 | GCC_PREPROCESSOR_DEFINITIONS = ( 521 | "DEBUG=1", 522 | "$(inherited)", 523 | ); 524 | INFOPLIST_FILE = Tests/Info.plist; 525 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 526 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 527 | PRODUCT_NAME = "$(TARGET_NAME)"; 528 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 529 | SWIFT_VERSION = 5.0; 530 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PRGTipView_Example.app/PRGTipView_Example"; 531 | }; 532 | name = Debug; 533 | }; 534 | 607FACF41AFB9204008FA782 /* Release */ = { 535 | isa = XCBuildConfiguration; 536 | baseConfigurationReference = F94668EF62210C16116ECE0C /* Pods-PRGTipView_Tests.release.xcconfig */; 537 | buildSettings = { 538 | FRAMEWORK_SEARCH_PATHS = ( 539 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 540 | "$(inherited)", 541 | ); 542 | INFOPLIST_FILE = Tests/Info.plist; 543 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 544 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 545 | PRODUCT_NAME = "$(TARGET_NAME)"; 546 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 547 | SWIFT_VERSION = 5.0; 548 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PRGTipView_Example.app/PRGTipView_Example"; 549 | }; 550 | name = Release; 551 | }; 552 | /* End XCBuildConfiguration section */ 553 | 554 | /* Begin XCConfigurationList section */ 555 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "PRGTipView" */ = { 556 | isa = XCConfigurationList; 557 | buildConfigurations = ( 558 | 607FACED1AFB9204008FA782 /* Debug */, 559 | 607FACEE1AFB9204008FA782 /* Release */, 560 | ); 561 | defaultConfigurationIsVisible = 0; 562 | defaultConfigurationName = Release; 563 | }; 564 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "PRGTipView_Example" */ = { 565 | isa = XCConfigurationList; 566 | buildConfigurations = ( 567 | 607FACF01AFB9204008FA782 /* Debug */, 568 | 607FACF11AFB9204008FA782 /* Release */, 569 | ); 570 | defaultConfigurationIsVisible = 0; 571 | defaultConfigurationName = Release; 572 | }; 573 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "PRGTipView_Tests" */ = { 574 | isa = XCConfigurationList; 575 | buildConfigurations = ( 576 | 607FACF31AFB9204008FA782 /* Debug */, 577 | 607FACF41AFB9204008FA782 /* Release */, 578 | ); 579 | defaultConfigurationIsVisible = 0; 580 | defaultConfigurationName = Release; 581 | }; 582 | /* End XCConfigurationList section */ 583 | }; 584 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 585 | } 586 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0741A8A8A05B31445B794E3E9FE98B3F /* PRGTipViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47505A85DC4E13197D53E67BC27EAF0 /* PRGTipViewConfiguration.swift */; }; 11 | 2BCBDFEE39B881CA21311CB036514281 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 12 | 45B863C8A98E856CF4B909538894B467 /* Pulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9F1728D6EDB3761A4C04F4D11C80DC3 /* Pulse.swift */; }; 13 | 720F055B1834C0241C623FF9E376FB8C /* PulseLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E4C6E574443DBF05241C72737E7DBF /* PulseLayer.swift */; }; 14 | 76BA8B0B7899333DEF02026E0286DDD8 /* PRGAnimatableMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60D7A8B2AFE82F1753CF6AB8AE283EC7 /* PRGAnimatableMaskView.swift */; }; 15 | 852FC2D40893E4710C4392A89091A545 /* AnimationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 424E8B14772B6E41C6229011E88DCD79 /* AnimationDelegate.swift */; }; 16 | 906D8FF9FBF97D31519DDFC7BD5D81FE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 17 | 98885BD2945199385F62CAA9BF48F5AA /* Pods-PRGTipView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 32517AAD6FF92AB809D4825D6E1BFED5 /* Pods-PRGTipView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 9B7B5A982CE772C484D75E418F964F6C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 19 | BCA166307A526C6CF27568C1A04C662C /* Pods-PRGTipView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BAC55062F80FD5BBB1D2A3D557271AF5 /* Pods-PRGTipView_Tests-dummy.m */; }; 20 | C40FC4D401505EA1AF6BC992AC2782C4 /* Pods-PRGTipView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3331FABF9A51FDF49DDA65E52D879B77 /* Pods-PRGTipView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | C4790281BD7A09A6932CABF1271BC06C /* Pods-PRGTipView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CFE77FF68BC95E42DE54B94A1231C29 /* Pods-PRGTipView_Example-dummy.m */; }; 22 | CF6572E791F36334D1C1F228C2743DDE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */; }; 23 | D37D8A76C39248EDC200F325966D056B /* CALayer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FC1503AD3AB06E710A687C7F077003 /* CALayer+Extensions.swift */; }; 24 | D37F4F3D8FEC19DAD02CF4470EDCF2EA /* PRGTipView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EA164F40DEAAC0A269100D471C0DAF3 /* PRGTipView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | E4691DF3C875DF257D7E101AA1F51BC9 /* PRGTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14C15A32605B5A3C4B3C74758E057 /* PRGTipView.swift */; }; 26 | EA9F29251A8ED8DF2DF48AC398F55431 /* PRGTipView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 274EE20D27CA830D47F3BCE95989DD87 /* PRGTipView-dummy.m */; }; 27 | FBE630564BB84F1E875E2CFBF9FCE64F /* ApplicationObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCBFA9AE668A1CE5E603A035BD1C8E5 /* ApplicationObserver.swift */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 26FBB3991ACDEFA8313311DA7D3680BC /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 8514FC466B5B9BB89AB70702905B76C1; 36 | remoteInfo = PRGTipView; 37 | }; 38 | B9825DDDA5E1BCD8BCFB9F7EC695452C /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 41 | proxyType = 1; 42 | remoteGlobalIDString = BE1D415EE88EF5A76DFC866BD459CB56; 43 | remoteInfo = "Pods-PRGTipView_Example"; 44 | }; 45 | /* End PBXContainerItemProxy section */ 46 | 47 | /* Begin PBXFileReference section */ 48 | 0AE14C15A32605B5A3C4B3C74758E057 /* PRGTipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PRGTipView.swift; path = PRGTipView/Classes/PRGTipView.swift; sourceTree = ""; }; 49 | 0C2A48BEE14CADC3C4FF8CB93A87D8BF /* Pods-PRGTipView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PRGTipView_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | 112F5C95C869BCA58AD48F5878F1B82F /* Pods-PRGTipView_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PRGTipView_Example-Info.plist"; sourceTree = ""; }; 51 | 1F88D9B2AEA99704C5CF39BA04295282 /* PRGTipView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PRGTipView.modulemap; sourceTree = ""; }; 52 | 274EE20D27CA830D47F3BCE95989DD87 /* PRGTipView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PRGTipView-dummy.m"; sourceTree = ""; }; 53 | 2F58F8EA687D39FFBE4F6AB2C0AA46AD /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 54 | 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 55 | 32517AAD6FF92AB809D4825D6E1BFED5 /* Pods-PRGTipView_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PRGTipView_Tests-umbrella.h"; sourceTree = ""; }; 56 | 3331FABF9A51FDF49DDA65E52D879B77 /* Pods-PRGTipView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PRGTipView_Example-umbrella.h"; sourceTree = ""; }; 57 | 33C426A5FA9D239DBFFCD90A25AFF791 /* Pods-PRGTipView_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PRGTipView_Tests-acknowledgements.markdown"; sourceTree = ""; }; 58 | 36DB4805C11D3250923204D5C80A8D5F /* Pods-PRGTipView_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PRGTipView_Tests.modulemap"; sourceTree = ""; }; 59 | 3AC5EF93CF9DD267112335CBDEC2C850 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 60 | 3E9542F27A703E18229DF51472862790 /* Pods-PRGTipView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PRGTipView_Example-frameworks.sh"; sourceTree = ""; }; 61 | 424E8B14772B6E41C6229011E88DCD79 /* AnimationDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AnimationDelegate.swift; sourceTree = ""; }; 62 | 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 63 | 4BCBFA9AE668A1CE5E603A035BD1C8E5 /* ApplicationObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApplicationObserver.swift; sourceTree = ""; }; 64 | 4EA164F40DEAAC0A269100D471C0DAF3 /* PRGTipView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PRGTipView-umbrella.h"; sourceTree = ""; }; 65 | 52B41F66AAF74ED297A14BC845B3CE05 /* PRGTipView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PRGTipView.release.xcconfig; sourceTree = ""; }; 66 | 60D7A8B2AFE82F1753CF6AB8AE283EC7 /* PRGAnimatableMaskView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PRGAnimatableMaskView.swift; path = PRGTipView/Classes/PRGAnimatableMaskView.swift; sourceTree = ""; }; 67 | 65CA07652D21A560DAB57234E639404D /* Pods_PRGTipView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PRGTipView_Example.framework; path = "Pods-PRGTipView_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | 665BB11C66DDD77FE5EA7A8292DBA490 /* Pods-PRGTipView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PRGTipView_Example-acknowledgements.plist"; sourceTree = ""; }; 69 | 6A4DC4D503944EB189FB72E156C8256F /* Pods-PRGTipView_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PRGTipView_Tests-acknowledgements.plist"; sourceTree = ""; }; 70 | 6BBA6B65012944F97C88669F7949C5C7 /* PRGTipView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PRGTipView-prefix.pch"; sourceTree = ""; }; 71 | 7BE2C1E5B2EC9737D4CAC42DF641C4CE /* Pods-PRGTipView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PRGTipView_Example.debug.xcconfig"; sourceTree = ""; }; 72 | 90618F61FDAE2ECF3AA500D1982051BF /* PRGTipView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PRGTipView.debug.xcconfig; sourceTree = ""; }; 73 | 987AE418BEB93FD765C4226C3CEAEC96 /* PRGTipView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = PRGTipView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 74 | 9CFE77FF68BC95E42DE54B94A1231C29 /* Pods-PRGTipView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PRGTipView_Example-dummy.m"; sourceTree = ""; }; 75 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 76 | A9FC1503AD3AB06E710A687C7F077003 /* CALayer+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CALayer+Extensions.swift"; sourceTree = ""; }; 77 | B6618207AA750104F8AD7396C0A88508 /* Pods-PRGTipView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PRGTipView_Tests.release.xcconfig"; sourceTree = ""; }; 78 | BAC55062F80FD5BBB1D2A3D557271AF5 /* Pods-PRGTipView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PRGTipView_Tests-dummy.m"; sourceTree = ""; }; 79 | BE315200B9A427FBDB52437D937A77C8 /* Pods_PRGTipView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PRGTipView_Tests.framework; path = "Pods-PRGTipView_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | D3D175472E1CC37FE4FF1501516EEE17 /* PRGTipView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PRGTipView.framework; path = PRGTipView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 81 | D67AD97B64C4280179003EBE768F4686 /* Pods-PRGTipView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PRGTipView_Example-acknowledgements.markdown"; sourceTree = ""; }; 82 | D70F62E493A9B917EE8EA825DC834C18 /* Pods-PRGTipView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PRGTipView_Example.release.xcconfig"; sourceTree = ""; }; 83 | D98AEEE1E936F44A7E4FCBCBA86C71D7 /* Pods-PRGTipView_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PRGTipView_Tests-Info.plist"; sourceTree = ""; }; 84 | E9F1728D6EDB3761A4C04F4D11C80DC3 /* Pulse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Pulse.swift; sourceTree = ""; }; 85 | EF00410777B77DC4D28DBD87A264B041 /* PRGTipView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PRGTipView-Info.plist"; sourceTree = ""; }; 86 | F3E4C6E574443DBF05241C72737E7DBF /* PulseLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PulseLayer.swift; sourceTree = ""; }; 87 | F47505A85DC4E13197D53E67BC27EAF0 /* PRGTipViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PRGTipViewConfiguration.swift; path = PRGTipView/Classes/PRGTipViewConfiguration.swift; sourceTree = ""; }; 88 | FDC196C66553A026E642C236C0862AF9 /* Pods-PRGTipView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PRGTipView_Example.modulemap"; sourceTree = ""; }; 89 | /* End PBXFileReference section */ 90 | 91 | /* Begin PBXFrameworksBuildPhase section */ 92 | 2B112E00FC07C17F07BB2C19FCE3E88C /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | 906D8FF9FBF97D31519DDFC7BD5D81FE /* Foundation.framework in Frameworks */, 97 | CF6572E791F36334D1C1F228C2743DDE /* UIKit.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | 891D4B86EC661BD4F2EFEF1AF618DDE9 /* Frameworks */ = { 102 | isa = PBXFrameworksBuildPhase; 103 | buildActionMask = 2147483647; 104 | files = ( 105 | 2BCBDFEE39B881CA21311CB036514281 /* Foundation.framework in Frameworks */, 106 | ); 107 | runOnlyForDeploymentPostprocessing = 0; 108 | }; 109 | 92ED6495960CB3B592FDF6AFE09CEF8D /* Frameworks */ = { 110 | isa = PBXFrameworksBuildPhase; 111 | buildActionMask = 2147483647; 112 | files = ( 113 | 9B7B5A982CE772C484D75E418F964F6C /* Foundation.framework in Frameworks */, 114 | ); 115 | runOnlyForDeploymentPostprocessing = 0; 116 | }; 117 | /* End PBXFrameworksBuildPhase section */ 118 | 119 | /* Begin PBXGroup section */ 120 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | E2983683FD097A93297E2F5D4E382B36 /* iOS */, 124 | ); 125 | name = Frameworks; 126 | sourceTree = ""; 127 | }; 128 | 3F32A6CDCE01C478A219ABF774F6FFDC /* Development Pods */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 8FC235C3FD904A6A7DE9960C9FC2B467 /* PRGTipView */, 132 | ); 133 | name = "Development Pods"; 134 | sourceTree = ""; 135 | }; 136 | 70EE45A586A4BD5C51851988FB03E3C6 /* Support Files */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 1F88D9B2AEA99704C5CF39BA04295282 /* PRGTipView.modulemap */, 140 | 274EE20D27CA830D47F3BCE95989DD87 /* PRGTipView-dummy.m */, 141 | EF00410777B77DC4D28DBD87A264B041 /* PRGTipView-Info.plist */, 142 | 6BBA6B65012944F97C88669F7949C5C7 /* PRGTipView-prefix.pch */, 143 | 4EA164F40DEAAC0A269100D471C0DAF3 /* PRGTipView-umbrella.h */, 144 | 90618F61FDAE2ECF3AA500D1982051BF /* PRGTipView.debug.xcconfig */, 145 | 52B41F66AAF74ED297A14BC845B3CE05 /* PRGTipView.release.xcconfig */, 146 | ); 147 | name = "Support Files"; 148 | path = "Example/Pods/Target Support Files/PRGTipView"; 149 | sourceTree = ""; 150 | }; 151 | 89ECF77D0A9CE1A7EDE4DFFB74689601 /* Pods-PRGTipView_Tests */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 36DB4805C11D3250923204D5C80A8D5F /* Pods-PRGTipView_Tests.modulemap */, 155 | 33C426A5FA9D239DBFFCD90A25AFF791 /* Pods-PRGTipView_Tests-acknowledgements.markdown */, 156 | 6A4DC4D503944EB189FB72E156C8256F /* Pods-PRGTipView_Tests-acknowledgements.plist */, 157 | BAC55062F80FD5BBB1D2A3D557271AF5 /* Pods-PRGTipView_Tests-dummy.m */, 158 | D98AEEE1E936F44A7E4FCBCBA86C71D7 /* Pods-PRGTipView_Tests-Info.plist */, 159 | 32517AAD6FF92AB809D4825D6E1BFED5 /* Pods-PRGTipView_Tests-umbrella.h */, 160 | 0C2A48BEE14CADC3C4FF8CB93A87D8BF /* Pods-PRGTipView_Tests.debug.xcconfig */, 161 | B6618207AA750104F8AD7396C0A88508 /* Pods-PRGTipView_Tests.release.xcconfig */, 162 | ); 163 | name = "Pods-PRGTipView_Tests"; 164 | path = "Target Support Files/Pods-PRGTipView_Tests"; 165 | sourceTree = ""; 166 | }; 167 | 8FC235C3FD904A6A7DE9960C9FC2B467 /* PRGTipView */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 60D7A8B2AFE82F1753CF6AB8AE283EC7 /* PRGAnimatableMaskView.swift */, 171 | 0AE14C15A32605B5A3C4B3C74758E057 /* PRGTipView.swift */, 172 | F47505A85DC4E13197D53E67BC27EAF0 /* PRGTipViewConfiguration.swift */, 173 | FDCE590950FF90B12F7DD1D0B063663E /* Pod */, 174 | D0DD4B11A878BD0933E6652F22D82E23 /* Pulsar */, 175 | 70EE45A586A4BD5C51851988FB03E3C6 /* Support Files */, 176 | ); 177 | name = PRGTipView; 178 | path = ../..; 179 | sourceTree = ""; 180 | }; 181 | 9B0EA0A469FF6B797E9CB7CBE024E8FE /* Targets Support Files */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | E58BE4149CC6FEDA2D33236873B3265F /* Pods-PRGTipView_Example */, 185 | 89ECF77D0A9CE1A7EDE4DFFB74689601 /* Pods-PRGTipView_Tests */, 186 | ); 187 | name = "Targets Support Files"; 188 | sourceTree = ""; 189 | }; 190 | AD01C07DE227CA1C8A0A3C32EA2DCE77 /* Products */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 65CA07652D21A560DAB57234E639404D /* Pods_PRGTipView_Example.framework */, 194 | BE315200B9A427FBDB52437D937A77C8 /* Pods_PRGTipView_Tests.framework */, 195 | D3D175472E1CC37FE4FF1501516EEE17 /* PRGTipView.framework */, 196 | ); 197 | name = Products; 198 | sourceTree = ""; 199 | }; 200 | CF1408CF629C7361332E53B88F7BD30C = { 201 | isa = PBXGroup; 202 | children = ( 203 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 204 | 3F32A6CDCE01C478A219ABF774F6FFDC /* Development Pods */, 205 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, 206 | AD01C07DE227CA1C8A0A3C32EA2DCE77 /* Products */, 207 | 9B0EA0A469FF6B797E9CB7CBE024E8FE /* Targets Support Files */, 208 | ); 209 | sourceTree = ""; 210 | }; 211 | D0DD4B11A878BD0933E6652F22D82E23 /* Pulsar */ = { 212 | isa = PBXGroup; 213 | children = ( 214 | 424E8B14772B6E41C6229011E88DCD79 /* AnimationDelegate.swift */, 215 | 4BCBFA9AE668A1CE5E603A035BD1C8E5 /* ApplicationObserver.swift */, 216 | A9FC1503AD3AB06E710A687C7F077003 /* CALayer+Extensions.swift */, 217 | E9F1728D6EDB3761A4C04F4D11C80DC3 /* Pulse.swift */, 218 | F3E4C6E574443DBF05241C72737E7DBF /* PulseLayer.swift */, 219 | ); 220 | name = Pulsar; 221 | path = PRGTipView/Classes/Pulsar; 222 | sourceTree = ""; 223 | }; 224 | E2983683FD097A93297E2F5D4E382B36 /* iOS */ = { 225 | isa = PBXGroup; 226 | children = ( 227 | 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */, 228 | 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */, 229 | ); 230 | name = iOS; 231 | sourceTree = ""; 232 | }; 233 | E58BE4149CC6FEDA2D33236873B3265F /* Pods-PRGTipView_Example */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | FDC196C66553A026E642C236C0862AF9 /* Pods-PRGTipView_Example.modulemap */, 237 | D67AD97B64C4280179003EBE768F4686 /* Pods-PRGTipView_Example-acknowledgements.markdown */, 238 | 665BB11C66DDD77FE5EA7A8292DBA490 /* Pods-PRGTipView_Example-acknowledgements.plist */, 239 | 9CFE77FF68BC95E42DE54B94A1231C29 /* Pods-PRGTipView_Example-dummy.m */, 240 | 3E9542F27A703E18229DF51472862790 /* Pods-PRGTipView_Example-frameworks.sh */, 241 | 112F5C95C869BCA58AD48F5878F1B82F /* Pods-PRGTipView_Example-Info.plist */, 242 | 3331FABF9A51FDF49DDA65E52D879B77 /* Pods-PRGTipView_Example-umbrella.h */, 243 | 7BE2C1E5B2EC9737D4CAC42DF641C4CE /* Pods-PRGTipView_Example.debug.xcconfig */, 244 | D70F62E493A9B917EE8EA825DC834C18 /* Pods-PRGTipView_Example.release.xcconfig */, 245 | ); 246 | name = "Pods-PRGTipView_Example"; 247 | path = "Target Support Files/Pods-PRGTipView_Example"; 248 | sourceTree = ""; 249 | }; 250 | FDCE590950FF90B12F7DD1D0B063663E /* Pod */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | 2F58F8EA687D39FFBE4F6AB2C0AA46AD /* LICENSE */, 254 | 987AE418BEB93FD765C4226C3CEAEC96 /* PRGTipView.podspec */, 255 | 3AC5EF93CF9DD267112335CBDEC2C850 /* README.md */, 256 | ); 257 | name = Pod; 258 | sourceTree = ""; 259 | }; 260 | /* End PBXGroup section */ 261 | 262 | /* Begin PBXHeadersBuildPhase section */ 263 | 18C10F4C9C57FE64828362C686F43176 /* Headers */ = { 264 | isa = PBXHeadersBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | 98885BD2945199385F62CAA9BF48F5AA /* Pods-PRGTipView_Tests-umbrella.h in Headers */, 268 | ); 269 | runOnlyForDeploymentPostprocessing = 0; 270 | }; 271 | 7534CDBBAA0477912A24AEE18A72118E /* Headers */ = { 272 | isa = PBXHeadersBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | C40FC4D401505EA1AF6BC992AC2782C4 /* Pods-PRGTipView_Example-umbrella.h in Headers */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | FA5A5EC992A19ECC938C112A3D2E10C3 /* Headers */ = { 280 | isa = PBXHeadersBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | D37F4F3D8FEC19DAD02CF4470EDCF2EA /* PRGTipView-umbrella.h in Headers */, 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXHeadersBuildPhase section */ 288 | 289 | /* Begin PBXNativeTarget section */ 290 | 1283A8BBCD3881226BFCDE6F6F0613F4 /* Pods-PRGTipView_Tests */ = { 291 | isa = PBXNativeTarget; 292 | buildConfigurationList = E411CAE103D1867FB94FB5D826CAB369 /* Build configuration list for PBXNativeTarget "Pods-PRGTipView_Tests" */; 293 | buildPhases = ( 294 | 18C10F4C9C57FE64828362C686F43176 /* Headers */, 295 | 147D1A75EB51186D200F6F54AD72C20E /* Sources */, 296 | 92ED6495960CB3B592FDF6AFE09CEF8D /* Frameworks */, 297 | 53F3BE069C8CDE7D617F098942D7B535 /* Resources */, 298 | ); 299 | buildRules = ( 300 | ); 301 | dependencies = ( 302 | F81C853A029B6A84FCC31497ED417493 /* PBXTargetDependency */, 303 | ); 304 | name = "Pods-PRGTipView_Tests"; 305 | productName = "Pods-PRGTipView_Tests"; 306 | productReference = BE315200B9A427FBDB52437D937A77C8 /* Pods_PRGTipView_Tests.framework */; 307 | productType = "com.apple.product-type.framework"; 308 | }; 309 | 8514FC466B5B9BB89AB70702905B76C1 /* PRGTipView */ = { 310 | isa = PBXNativeTarget; 311 | buildConfigurationList = 614DA4EE7534DEE42853FA3CA59DFCAA /* Build configuration list for PBXNativeTarget "PRGTipView" */; 312 | buildPhases = ( 313 | FA5A5EC992A19ECC938C112A3D2E10C3 /* Headers */, 314 | BD93CD788299BF7D391CA81463F693E9 /* Sources */, 315 | 2B112E00FC07C17F07BB2C19FCE3E88C /* Frameworks */, 316 | F8A6CA3D1EDB5170B9B8D440E92E6DDF /* Resources */, 317 | ); 318 | buildRules = ( 319 | ); 320 | dependencies = ( 321 | ); 322 | name = PRGTipView; 323 | productName = PRGTipView; 324 | productReference = D3D175472E1CC37FE4FF1501516EEE17 /* PRGTipView.framework */; 325 | productType = "com.apple.product-type.framework"; 326 | }; 327 | BE1D415EE88EF5A76DFC866BD459CB56 /* Pods-PRGTipView_Example */ = { 328 | isa = PBXNativeTarget; 329 | buildConfigurationList = 6513B08EB8088D8DB1126454B333FE0E /* Build configuration list for PBXNativeTarget "Pods-PRGTipView_Example" */; 330 | buildPhases = ( 331 | 7534CDBBAA0477912A24AEE18A72118E /* Headers */, 332 | 6018CD0C97183C0EBFB4A844099A763F /* Sources */, 333 | 891D4B86EC661BD4F2EFEF1AF618DDE9 /* Frameworks */, 334 | A4318BA9B8C2E0534CA8801DDA2B55D7 /* Resources */, 335 | ); 336 | buildRules = ( 337 | ); 338 | dependencies = ( 339 | 42791D4B5F080ACFD04DF44CED211F5A /* PBXTargetDependency */, 340 | ); 341 | name = "Pods-PRGTipView_Example"; 342 | productName = "Pods-PRGTipView_Example"; 343 | productReference = 65CA07652D21A560DAB57234E639404D /* Pods_PRGTipView_Example.framework */; 344 | productType = "com.apple.product-type.framework"; 345 | }; 346 | /* End PBXNativeTarget section */ 347 | 348 | /* Begin PBXProject section */ 349 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 350 | isa = PBXProject; 351 | attributes = { 352 | LastSwiftUpdateCheck = 1100; 353 | LastUpgradeCheck = 1100; 354 | }; 355 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 356 | compatibilityVersion = "Xcode 3.2"; 357 | developmentRegion = en; 358 | hasScannedForEncodings = 0; 359 | knownRegions = ( 360 | en, 361 | Base, 362 | ); 363 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 364 | productRefGroup = AD01C07DE227CA1C8A0A3C32EA2DCE77 /* Products */; 365 | projectDirPath = ""; 366 | projectRoot = ""; 367 | targets = ( 368 | BE1D415EE88EF5A76DFC866BD459CB56 /* Pods-PRGTipView_Example */, 369 | 1283A8BBCD3881226BFCDE6F6F0613F4 /* Pods-PRGTipView_Tests */, 370 | 8514FC466B5B9BB89AB70702905B76C1 /* PRGTipView */, 371 | ); 372 | }; 373 | /* End PBXProject section */ 374 | 375 | /* Begin PBXResourcesBuildPhase section */ 376 | 53F3BE069C8CDE7D617F098942D7B535 /* Resources */ = { 377 | isa = PBXResourcesBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | ); 381 | runOnlyForDeploymentPostprocessing = 0; 382 | }; 383 | A4318BA9B8C2E0534CA8801DDA2B55D7 /* Resources */ = { 384 | isa = PBXResourcesBuildPhase; 385 | buildActionMask = 2147483647; 386 | files = ( 387 | ); 388 | runOnlyForDeploymentPostprocessing = 0; 389 | }; 390 | F8A6CA3D1EDB5170B9B8D440E92E6DDF /* Resources */ = { 391 | isa = PBXResourcesBuildPhase; 392 | buildActionMask = 2147483647; 393 | files = ( 394 | ); 395 | runOnlyForDeploymentPostprocessing = 0; 396 | }; 397 | /* End PBXResourcesBuildPhase section */ 398 | 399 | /* Begin PBXSourcesBuildPhase section */ 400 | 147D1A75EB51186D200F6F54AD72C20E /* Sources */ = { 401 | isa = PBXSourcesBuildPhase; 402 | buildActionMask = 2147483647; 403 | files = ( 404 | BCA166307A526C6CF27568C1A04C662C /* Pods-PRGTipView_Tests-dummy.m in Sources */, 405 | ); 406 | runOnlyForDeploymentPostprocessing = 0; 407 | }; 408 | 6018CD0C97183C0EBFB4A844099A763F /* Sources */ = { 409 | isa = PBXSourcesBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | C4790281BD7A09A6932CABF1271BC06C /* Pods-PRGTipView_Example-dummy.m in Sources */, 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | }; 416 | BD93CD788299BF7D391CA81463F693E9 /* Sources */ = { 417 | isa = PBXSourcesBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | 852FC2D40893E4710C4392A89091A545 /* AnimationDelegate.swift in Sources */, 421 | FBE630564BB84F1E875E2CFBF9FCE64F /* ApplicationObserver.swift in Sources */, 422 | D37D8A76C39248EDC200F325966D056B /* CALayer+Extensions.swift in Sources */, 423 | 76BA8B0B7899333DEF02026E0286DDD8 /* PRGAnimatableMaskView.swift in Sources */, 424 | EA9F29251A8ED8DF2DF48AC398F55431 /* PRGTipView-dummy.m in Sources */, 425 | E4691DF3C875DF257D7E101AA1F51BC9 /* PRGTipView.swift in Sources */, 426 | 0741A8A8A05B31445B794E3E9FE98B3F /* PRGTipViewConfiguration.swift in Sources */, 427 | 45B863C8A98E856CF4B909538894B467 /* Pulse.swift in Sources */, 428 | 720F055B1834C0241C623FF9E376FB8C /* PulseLayer.swift in Sources */, 429 | ); 430 | runOnlyForDeploymentPostprocessing = 0; 431 | }; 432 | /* End PBXSourcesBuildPhase section */ 433 | 434 | /* Begin PBXTargetDependency section */ 435 | 42791D4B5F080ACFD04DF44CED211F5A /* PBXTargetDependency */ = { 436 | isa = PBXTargetDependency; 437 | name = PRGTipView; 438 | target = 8514FC466B5B9BB89AB70702905B76C1 /* PRGTipView */; 439 | targetProxy = 26FBB3991ACDEFA8313311DA7D3680BC /* PBXContainerItemProxy */; 440 | }; 441 | F81C853A029B6A84FCC31497ED417493 /* PBXTargetDependency */ = { 442 | isa = PBXTargetDependency; 443 | name = "Pods-PRGTipView_Example"; 444 | target = BE1D415EE88EF5A76DFC866BD459CB56 /* Pods-PRGTipView_Example */; 445 | targetProxy = B9825DDDA5E1BCD8BCFB9F7EC695452C /* PBXContainerItemProxy */; 446 | }; 447 | /* End PBXTargetDependency section */ 448 | 449 | /* Begin XCBuildConfiguration section */ 450 | 4AF474650ADDA79FC9F53B984CE6E246 /* Debug */ = { 451 | isa = XCBuildConfiguration; 452 | baseConfigurationReference = 0C2A48BEE14CADC3C4FF8CB93A87D8BF /* Pods-PRGTipView_Tests.debug.xcconfig */; 453 | buildSettings = { 454 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 455 | CODE_SIGN_IDENTITY = ""; 456 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 457 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 458 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 459 | CURRENT_PROJECT_VERSION = 1; 460 | DEFINES_MODULE = YES; 461 | DYLIB_COMPATIBILITY_VERSION = 1; 462 | DYLIB_CURRENT_VERSION = 1; 463 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 464 | INFOPLIST_FILE = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-Info.plist"; 465 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 466 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 467 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 468 | MACH_O_TYPE = staticlib; 469 | MODULEMAP_FILE = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.modulemap"; 470 | OTHER_LDFLAGS = ""; 471 | OTHER_LIBTOOLFLAGS = ""; 472 | PODS_ROOT = "$(SRCROOT)"; 473 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 474 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 475 | SDKROOT = iphoneos; 476 | SKIP_INSTALL = YES; 477 | TARGETED_DEVICE_FAMILY = "1,2"; 478 | VERSIONING_SYSTEM = "apple-generic"; 479 | VERSION_INFO_PREFIX = ""; 480 | }; 481 | name = Debug; 482 | }; 483 | 57CC5FFFEE6C4580B9995534F1304D13 /* Debug */ = { 484 | isa = XCBuildConfiguration; 485 | baseConfigurationReference = 90618F61FDAE2ECF3AA500D1982051BF /* PRGTipView.debug.xcconfig */; 486 | buildSettings = { 487 | CODE_SIGN_IDENTITY = ""; 488 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 489 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 490 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 491 | CURRENT_PROJECT_VERSION = 1; 492 | DEFINES_MODULE = YES; 493 | DYLIB_COMPATIBILITY_VERSION = 1; 494 | DYLIB_CURRENT_VERSION = 1; 495 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 496 | GCC_PREFIX_HEADER = "Target Support Files/PRGTipView/PRGTipView-prefix.pch"; 497 | INFOPLIST_FILE = "Target Support Files/PRGTipView/PRGTipView-Info.plist"; 498 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 499 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 500 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 501 | MODULEMAP_FILE = "Target Support Files/PRGTipView/PRGTipView.modulemap"; 502 | PRODUCT_MODULE_NAME = PRGTipView; 503 | PRODUCT_NAME = PRGTipView; 504 | SDKROOT = iphoneos; 505 | SKIP_INSTALL = YES; 506 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 507 | SWIFT_VERSION = 5.0; 508 | TARGETED_DEVICE_FAMILY = "1,2"; 509 | VERSIONING_SYSTEM = "apple-generic"; 510 | VERSION_INFO_PREFIX = ""; 511 | }; 512 | name = Debug; 513 | }; 514 | 932C832EA60475A87C1514A0A0B649C4 /* Release */ = { 515 | isa = XCBuildConfiguration; 516 | baseConfigurationReference = 52B41F66AAF74ED297A14BC845B3CE05 /* PRGTipView.release.xcconfig */; 517 | buildSettings = { 518 | CODE_SIGN_IDENTITY = ""; 519 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 520 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 521 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 522 | CURRENT_PROJECT_VERSION = 1; 523 | DEFINES_MODULE = YES; 524 | DYLIB_COMPATIBILITY_VERSION = 1; 525 | DYLIB_CURRENT_VERSION = 1; 526 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 527 | GCC_PREFIX_HEADER = "Target Support Files/PRGTipView/PRGTipView-prefix.pch"; 528 | INFOPLIST_FILE = "Target Support Files/PRGTipView/PRGTipView-Info.plist"; 529 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 530 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 531 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 532 | MODULEMAP_FILE = "Target Support Files/PRGTipView/PRGTipView.modulemap"; 533 | PRODUCT_MODULE_NAME = PRGTipView; 534 | PRODUCT_NAME = PRGTipView; 535 | SDKROOT = iphoneos; 536 | SKIP_INSTALL = YES; 537 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 538 | SWIFT_VERSION = 5.0; 539 | TARGETED_DEVICE_FAMILY = "1,2"; 540 | VALIDATE_PRODUCT = YES; 541 | VERSIONING_SYSTEM = "apple-generic"; 542 | VERSION_INFO_PREFIX = ""; 543 | }; 544 | name = Release; 545 | }; 546 | 9DFFFE261349C359DB58FFAC06115F1E /* Release */ = { 547 | isa = XCBuildConfiguration; 548 | baseConfigurationReference = D70F62E493A9B917EE8EA825DC834C18 /* Pods-PRGTipView_Example.release.xcconfig */; 549 | buildSettings = { 550 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 551 | CODE_SIGN_IDENTITY = ""; 552 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 553 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 554 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 555 | CURRENT_PROJECT_VERSION = 1; 556 | DEFINES_MODULE = YES; 557 | DYLIB_COMPATIBILITY_VERSION = 1; 558 | DYLIB_CURRENT_VERSION = 1; 559 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 560 | INFOPLIST_FILE = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-Info.plist"; 561 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 562 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 563 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 564 | MACH_O_TYPE = staticlib; 565 | MODULEMAP_FILE = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.modulemap"; 566 | OTHER_LDFLAGS = ""; 567 | OTHER_LIBTOOLFLAGS = ""; 568 | PODS_ROOT = "$(SRCROOT)"; 569 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 570 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 571 | SDKROOT = iphoneos; 572 | SKIP_INSTALL = YES; 573 | TARGETED_DEVICE_FAMILY = "1,2"; 574 | VALIDATE_PRODUCT = YES; 575 | VERSIONING_SYSTEM = "apple-generic"; 576 | VERSION_INFO_PREFIX = ""; 577 | }; 578 | name = Release; 579 | }; 580 | AC957C35E2454E910E45F60A6873722E /* Debug */ = { 581 | isa = XCBuildConfiguration; 582 | baseConfigurationReference = 7BE2C1E5B2EC9737D4CAC42DF641C4CE /* Pods-PRGTipView_Example.debug.xcconfig */; 583 | buildSettings = { 584 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 585 | CODE_SIGN_IDENTITY = ""; 586 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 587 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 588 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 589 | CURRENT_PROJECT_VERSION = 1; 590 | DEFINES_MODULE = YES; 591 | DYLIB_COMPATIBILITY_VERSION = 1; 592 | DYLIB_CURRENT_VERSION = 1; 593 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 594 | INFOPLIST_FILE = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example-Info.plist"; 595 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 596 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 597 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 598 | MACH_O_TYPE = staticlib; 599 | MODULEMAP_FILE = "Target Support Files/Pods-PRGTipView_Example/Pods-PRGTipView_Example.modulemap"; 600 | OTHER_LDFLAGS = ""; 601 | OTHER_LIBTOOLFLAGS = ""; 602 | PODS_ROOT = "$(SRCROOT)"; 603 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 604 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 605 | SDKROOT = iphoneos; 606 | SKIP_INSTALL = YES; 607 | TARGETED_DEVICE_FAMILY = "1,2"; 608 | VERSIONING_SYSTEM = "apple-generic"; 609 | VERSION_INFO_PREFIX = ""; 610 | }; 611 | name = Debug; 612 | }; 613 | B0087CB4594321EF41619F3181FE120E /* Release */ = { 614 | isa = XCBuildConfiguration; 615 | buildSettings = { 616 | ALWAYS_SEARCH_USER_PATHS = NO; 617 | CLANG_ANALYZER_NONNULL = YES; 618 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 619 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 620 | CLANG_CXX_LIBRARY = "libc++"; 621 | CLANG_ENABLE_MODULES = YES; 622 | CLANG_ENABLE_OBJC_ARC = YES; 623 | CLANG_ENABLE_OBJC_WEAK = YES; 624 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 625 | CLANG_WARN_BOOL_CONVERSION = YES; 626 | CLANG_WARN_COMMA = YES; 627 | CLANG_WARN_CONSTANT_CONVERSION = YES; 628 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 629 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 630 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 631 | CLANG_WARN_EMPTY_BODY = YES; 632 | CLANG_WARN_ENUM_CONVERSION = YES; 633 | CLANG_WARN_INFINITE_RECURSION = YES; 634 | CLANG_WARN_INT_CONVERSION = YES; 635 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 636 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 637 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 638 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 639 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 640 | CLANG_WARN_STRICT_PROTOTYPES = YES; 641 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 642 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 643 | CLANG_WARN_UNREACHABLE_CODE = YES; 644 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 645 | COPY_PHASE_STRIP = NO; 646 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 647 | ENABLE_NS_ASSERTIONS = NO; 648 | ENABLE_STRICT_OBJC_MSGSEND = YES; 649 | GCC_C_LANGUAGE_STANDARD = gnu11; 650 | GCC_NO_COMMON_BLOCKS = YES; 651 | GCC_PREPROCESSOR_DEFINITIONS = ( 652 | "POD_CONFIGURATION_RELEASE=1", 653 | "$(inherited)", 654 | ); 655 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 656 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 657 | GCC_WARN_UNDECLARED_SELECTOR = YES; 658 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 659 | GCC_WARN_UNUSED_FUNCTION = YES; 660 | GCC_WARN_UNUSED_VARIABLE = YES; 661 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 662 | MTL_ENABLE_DEBUG_INFO = NO; 663 | MTL_FAST_MATH = YES; 664 | PRODUCT_NAME = "$(TARGET_NAME)"; 665 | STRIP_INSTALLED_PRODUCT = NO; 666 | SWIFT_COMPILATION_MODE = wholemodule; 667 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 668 | SWIFT_VERSION = 5.0; 669 | SYMROOT = "${SRCROOT}/../build"; 670 | }; 671 | name = Release; 672 | }; 673 | B8BCBD0110C2658BB5DAADB9B7D97B92 /* Debug */ = { 674 | isa = XCBuildConfiguration; 675 | buildSettings = { 676 | ALWAYS_SEARCH_USER_PATHS = NO; 677 | CLANG_ANALYZER_NONNULL = YES; 678 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 679 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 680 | CLANG_CXX_LIBRARY = "libc++"; 681 | CLANG_ENABLE_MODULES = YES; 682 | CLANG_ENABLE_OBJC_ARC = YES; 683 | CLANG_ENABLE_OBJC_WEAK = YES; 684 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 685 | CLANG_WARN_BOOL_CONVERSION = YES; 686 | CLANG_WARN_COMMA = YES; 687 | CLANG_WARN_CONSTANT_CONVERSION = YES; 688 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 689 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 690 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 691 | CLANG_WARN_EMPTY_BODY = YES; 692 | CLANG_WARN_ENUM_CONVERSION = YES; 693 | CLANG_WARN_INFINITE_RECURSION = YES; 694 | CLANG_WARN_INT_CONVERSION = YES; 695 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 696 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 697 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 698 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 699 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 700 | CLANG_WARN_STRICT_PROTOTYPES = YES; 701 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 702 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 703 | CLANG_WARN_UNREACHABLE_CODE = YES; 704 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 705 | COPY_PHASE_STRIP = NO; 706 | DEBUG_INFORMATION_FORMAT = dwarf; 707 | ENABLE_STRICT_OBJC_MSGSEND = YES; 708 | ENABLE_TESTABILITY = YES; 709 | GCC_C_LANGUAGE_STANDARD = gnu11; 710 | GCC_DYNAMIC_NO_PIC = NO; 711 | GCC_NO_COMMON_BLOCKS = YES; 712 | GCC_OPTIMIZATION_LEVEL = 0; 713 | GCC_PREPROCESSOR_DEFINITIONS = ( 714 | "POD_CONFIGURATION_DEBUG=1", 715 | "DEBUG=1", 716 | "$(inherited)", 717 | ); 718 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 719 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 720 | GCC_WARN_UNDECLARED_SELECTOR = YES; 721 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 722 | GCC_WARN_UNUSED_FUNCTION = YES; 723 | GCC_WARN_UNUSED_VARIABLE = YES; 724 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 725 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 726 | MTL_FAST_MATH = YES; 727 | ONLY_ACTIVE_ARCH = YES; 728 | PRODUCT_NAME = "$(TARGET_NAME)"; 729 | STRIP_INSTALLED_PRODUCT = NO; 730 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 731 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 732 | SWIFT_VERSION = 5.0; 733 | SYMROOT = "${SRCROOT}/../build"; 734 | }; 735 | name = Debug; 736 | }; 737 | E7EF667F06C2AB9705029D83F0B19C9B /* Release */ = { 738 | isa = XCBuildConfiguration; 739 | baseConfigurationReference = B6618207AA750104F8AD7396C0A88508 /* Pods-PRGTipView_Tests.release.xcconfig */; 740 | buildSettings = { 741 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 742 | CODE_SIGN_IDENTITY = ""; 743 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 744 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 745 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 746 | CURRENT_PROJECT_VERSION = 1; 747 | DEFINES_MODULE = YES; 748 | DYLIB_COMPATIBILITY_VERSION = 1; 749 | DYLIB_CURRENT_VERSION = 1; 750 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 751 | INFOPLIST_FILE = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests-Info.plist"; 752 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 753 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 754 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 755 | MACH_O_TYPE = staticlib; 756 | MODULEMAP_FILE = "Target Support Files/Pods-PRGTipView_Tests/Pods-PRGTipView_Tests.modulemap"; 757 | OTHER_LDFLAGS = ""; 758 | OTHER_LIBTOOLFLAGS = ""; 759 | PODS_ROOT = "$(SRCROOT)"; 760 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 761 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 762 | SDKROOT = iphoneos; 763 | SKIP_INSTALL = YES; 764 | TARGETED_DEVICE_FAMILY = "1,2"; 765 | VALIDATE_PRODUCT = YES; 766 | VERSIONING_SYSTEM = "apple-generic"; 767 | VERSION_INFO_PREFIX = ""; 768 | }; 769 | name = Release; 770 | }; 771 | /* End XCBuildConfiguration section */ 772 | 773 | /* Begin XCConfigurationList section */ 774 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 775 | isa = XCConfigurationList; 776 | buildConfigurations = ( 777 | B8BCBD0110C2658BB5DAADB9B7D97B92 /* Debug */, 778 | B0087CB4594321EF41619F3181FE120E /* Release */, 779 | ); 780 | defaultConfigurationIsVisible = 0; 781 | defaultConfigurationName = Release; 782 | }; 783 | 614DA4EE7534DEE42853FA3CA59DFCAA /* Build configuration list for PBXNativeTarget "PRGTipView" */ = { 784 | isa = XCConfigurationList; 785 | buildConfigurations = ( 786 | 57CC5FFFEE6C4580B9995534F1304D13 /* Debug */, 787 | 932C832EA60475A87C1514A0A0B649C4 /* Release */, 788 | ); 789 | defaultConfigurationIsVisible = 0; 790 | defaultConfigurationName = Release; 791 | }; 792 | 6513B08EB8088D8DB1126454B333FE0E /* Build configuration list for PBXNativeTarget "Pods-PRGTipView_Example" */ = { 793 | isa = XCConfigurationList; 794 | buildConfigurations = ( 795 | AC957C35E2454E910E45F60A6873722E /* Debug */, 796 | 9DFFFE261349C359DB58FFAC06115F1E /* Release */, 797 | ); 798 | defaultConfigurationIsVisible = 0; 799 | defaultConfigurationName = Release; 800 | }; 801 | E411CAE103D1867FB94FB5D826CAB369 /* Build configuration list for PBXNativeTarget "Pods-PRGTipView_Tests" */ = { 802 | isa = XCConfigurationList; 803 | buildConfigurations = ( 804 | 4AF474650ADDA79FC9F53B984CE6E246 /* Debug */, 805 | E7EF667F06C2AB9705029D83F0B19C9B /* Release */, 806 | ); 807 | defaultConfigurationIsVisible = 0; 808 | defaultConfigurationName = Release; 809 | }; 810 | /* End XCConfigurationList section */ 811 | }; 812 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 813 | } 814 | --------------------------------------------------------------------------------