├── RPInteraction ├── Classes │ ├── .gitkeep │ ├── Constants │ │ ├── RPRate.h │ │ ├── Constants.h │ │ └── Constants.m │ ├── Utils │ │ ├── UIFont+Utils.h │ │ ├── UIColor+Utils.h │ │ ├── UIFont+Utils.m │ │ └── UIColor+Utils.m │ ├── Views │ │ ├── DescriptionView.h │ │ ├── ReelView.h │ │ ├── ScrollView.h │ │ ├── FaceView.h │ │ ├── ConfirmView.h │ │ ├── ScrollView.m │ │ ├── DescriptionView.m │ │ ├── ConfirmView.m │ │ ├── ReelView.m │ │ └── FaceView.m │ ├── Models │ │ ├── Gradient.h │ │ ├── Pie.m │ │ ├── Gradient.m │ │ └── Pie.h │ ├── Factories │ │ ├── AnimationFactory.h │ │ ├── LayerFactory.h │ │ ├── LayerFactory.m │ │ └── AnimationFactory.m │ └── Controllers │ │ ├── RPViewController.h │ │ └── RPViewController.m └── Assets │ ├── close.png │ ├── close@2x.png │ └── close@3x.png ├── _Pods.xcodeproj ├── Example ├── RPInteraction │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── RPExampleViewController.h │ ├── RPAppDelegate.h │ ├── RPInteraction-Prefix.pch │ ├── main.m │ ├── RPAppDelegate.m │ ├── RPInteraction-Info.plist │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ └── RPExampleViewController.m ├── Podfile ├── Pods │ ├── Target Support Files │ │ ├── RPInteraction │ │ │ ├── RPInteraction.modulemap │ │ │ ├── RPInteraction-dummy.m │ │ │ ├── RPInteraction-prefix.pch │ │ │ ├── RPInteraction.xcconfig │ │ │ ├── RPInteraction-umbrella.h │ │ │ ├── ResourceBundle-RPInteraction-Info.plist │ │ │ └── Info.plist │ │ └── Pods-RPInteraction_Example │ │ │ ├── Pods-RPInteraction_Example.modulemap │ │ │ ├── Pods-RPInteraction_Example-dummy.m │ │ │ ├── Pods-RPInteraction_Example-umbrella.h │ │ │ ├── Pods-RPInteraction_Example.debug.xcconfig │ │ │ ├── Pods-RPInteraction_Example.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-RPInteraction_Example-acknowledgements.markdown │ │ │ ├── Pods-RPInteraction_Example-acknowledgements.plist │ │ │ ├── Pods-RPInteraction_Example-resources.sh │ │ │ └── Pods-RPInteraction_Example-frameworks.sh │ ├── Pods.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj │ ├── Manifest.lock │ └── Local Podspecs │ │ └── RPInteraction.podspec.json ├── RPInteraction.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── RPInteraction-Example.xcscheme │ └── project.pbxproj ├── RPInteraction.xcworkspace │ └── contents.xcworkspacedata ├── Podfile.lock └── RPInteraction_ExampleUITests │ ├── Info.plist │ └── RPInteraction_ExampleUITests.m ├── Screenshots └── rpinteraction.gif ├── .travis.yml ├── .gitignore ├── LICENSE ├── RPInteraction.podspec └── README.md /RPInteraction/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /Example/RPInteraction/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /RPInteraction/Assets/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nurdabolatov/RPInteraction/HEAD/RPInteraction/Assets/close.png -------------------------------------------------------------------------------- /Screenshots/rpinteraction.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nurdabolatov/RPInteraction/HEAD/Screenshots/rpinteraction.gif -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'RPInteraction_Example' do 4 | pod 'RPInteraction', :path => '../' 5 | end 6 | -------------------------------------------------------------------------------- /RPInteraction/Assets/close@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nurdabolatov/RPInteraction/HEAD/RPInteraction/Assets/close@2x.png -------------------------------------------------------------------------------- /RPInteraction/Assets/close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nurdabolatov/RPInteraction/HEAD/RPInteraction/Assets/close@3x.png -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/RPInteraction.modulemap: -------------------------------------------------------------------------------- 1 | framework module RPInteraction { 2 | umbrella header "RPInteraction-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/RPInteraction-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_RPInteraction : NSObject 3 | @end 4 | @implementation PodsDummy_RPInteraction 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_RPInteraction_Example { 2 | umbrella header "Pods-RPInteraction_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/RPInteraction.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_RPInteraction_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_RPInteraction_Example 5 | @end 6 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Constants/RPRate.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPRate.h 3 | // Pods 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // 7 | 8 | typedef NS_ENUM(NSUInteger, RPRate) { 9 | RPRateBad = 0, 10 | RPRateUgh = 1, 11 | RPRateOk = 2, 12 | RPRateGood = 3, 13 | }; 14 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Utils/UIFont+Utils.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIFont+Utils.h 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/30/18. 6 | // 7 | 8 | #import 9 | 10 | @interface UIFont (Utils) 11 | 12 | + (UIFont *)heavyFontOfSize:(CGFloat)fontSize; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/RPInteraction-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/RPInteraction.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPExampleViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPExampleViewController.h 3 | // RPInteraction_Example 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // Copyright © 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RPExampleViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - RPInteraction (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - RPInteraction (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | RPInteraction: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | RPInteraction: f3787add8da990277f7c03fe60ecf43057e986ce 13 | 14 | PODFILE CHECKSUM: 0e8ba9af12262de60ba36d232ebe5efa97e254c9 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPAppDelegate.h 3 | // RPInteraction 4 | // 5 | // Created by nbolatov on 07/01/2018. 6 | // Copyright (c) 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface RPAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - RPInteraction (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - RPInteraction (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | RPInteraction: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | RPInteraction: f3787add8da990277f7c03fe60ecf43057e986ce 13 | 14 | PODFILE CHECKSUM: 0e8ba9af12262de60ba36d232ebe5efa97e254c9 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Utils/UIColor+Utils.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Utils.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIColor (Utils) 12 | 13 | + (UIColor *)colorWithHexString:(NSString *)hex; 14 | + (UIColor *)colorWithHexValue:(NSInteger)hex; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPInteraction-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/RPInteraction/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RPInteraction 4 | // 5 | // Created by nbolatov on 07/01/2018. 6 | // Copyright (c) 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "RPAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([RPAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/DescriptionView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DescriptionView.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/12/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RPRate.h" 11 | 12 | @interface DescriptionView : UIView 13 | 14 | - (void)configureLabelWithRate:(RPRate)rate title:(NSString *)title color:(UIColor *)color; 15 | - (void)updateLayers:(CGFloat)progress; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Utils/UIFont+Utils.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIFont+Utils.m 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/30/18. 6 | // 7 | 8 | #import "UIFont+Utils.h" 9 | 10 | @implementation UIFont (Utils) 11 | 12 | + (UIFont *)heavyFontOfSize:(CGFloat)fontSize { 13 | if (@available(iOS 8.2, *)) { 14 | return [UIFont systemFontOfSize:fontSize weight:UIFontWeightHeavy]; 15 | } 16 | return [UIFont systemFontOfSize:fontSize]; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_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_RPInteraction_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_RPInteraction_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ReelView.h: -------------------------------------------------------------------------------- 1 | // 2 | // ReelView.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Pie.h" 11 | 12 | @interface ReelView : UIView 13 | 14 | - (void)configureWithBadPie:(Pie *)badPie 15 | ughPie:(Pie *)ughPie 16 | okPie:(Pie *)okPie 17 | goodPie:(Pie *)goodPie; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollView.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/13/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol ScrollViewDelegate 12 | 13 | - (void)scrollViewDidChangeProgress:(CGFloat)progress; 14 | 15 | @end 16 | 17 | @interface ScrollView : UIView 18 | 19 | @property (weak) id delegate; 20 | 21 | - (void)configure; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Models/Gradient.h: -------------------------------------------------------------------------------- 1 | // 2 | // Gradient.h 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // 7 | 8 | #import 9 | 10 | @interface Gradient : NSObject 11 | 12 | - (instancetype)initWithStartGradientColor:(UIColor *)startGradientColor 13 | endGradientColor:(UIColor *)endGradientColor; 14 | 15 | @property (strong, nonatomic) UIColor *startGradientColor; 16 | @property (strong, nonatomic) UIColor *endGradientColor; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Models/Pie.m: -------------------------------------------------------------------------------- 1 | // 2 | // Pie.m 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // 7 | 8 | #import "Pie.h" 9 | 10 | @implementation Pie 11 | 12 | - (instancetype)initWithTitle:(NSString *)title 13 | titleColor:(UIColor *)titleColor 14 | gradient:(Gradient *)gradient { 15 | if (self = [super init]) { 16 | _title = title; 17 | _titleColor = titleColor; 18 | _gradient = gradient; 19 | } 20 | return self; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/RPInteraction.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RPInteraction 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Models/Gradient.m: -------------------------------------------------------------------------------- 1 | // 2 | // Gradient.m 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // 7 | 8 | #import "Gradient.h" 9 | 10 | @implementation Gradient 11 | 12 | - (instancetype)initWithStartGradientColor:(UIColor *)startGradientColor 13 | endGradientColor:(UIColor *)endGradientColor { 14 | if (self = [super init]) { 15 | _startGradientColor = startGradientColor; 16 | _endGradientColor = endGradientColor; 17 | } 18 | return self; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Models/Pie.h: -------------------------------------------------------------------------------- 1 | // 2 | // Pie.h 3 | // RPInteraction 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // 7 | 8 | #import 9 | #import "Gradient.h" 10 | 11 | @interface Pie : NSObject 12 | 13 | - (instancetype)initWithTitle:(NSString *)title 14 | titleColor:(UIColor *)titleColor 15 | gradient:(Gradient *)gradient; 16 | 17 | @property (copy, nonatomic) NSString *title; 18 | @property (strong, nonatomic) UIColor *titleColor; 19 | @property (strong, nonatomic) Gradient *gradient; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | osx_image: xcode9.2 5 | language: objective-c 6 | cache: cocoapods 7 | podfile: Example/Podfile 8 | before_install: 9 | - gem install cocoapods # Since Travis is not always on latest version 10 | - pod install --project-directory=Example 11 | 12 | script: 13 | - set -o pipefail 14 | - xcodebuild test -enableCodeCoverage YES -workspace Example/RPInteraction.xcworkspace -scheme RPInteraction-Example -destination 'platform=iOS Simulator,name=iPhone 6,OS=11.2' | xcpretty 15 | - pod lib lint 16 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPAppDelegate.m 3 | // RPInteraction 4 | // 5 | // Created by nbolatov on 07/01/2018. 6 | // Copyright (c) 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | #import "RPAppDelegate.h" 10 | #import "RPExampleViewController.h" 11 | 12 | @implementation RPAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | _window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 17 | _window.rootViewController = [RPExampleViewController new]; 18 | [_window makeKeyAndVisible]; 19 | return YES; 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/FaceView.h: -------------------------------------------------------------------------------- 1 | // 2 | // FaceView.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Gradient.h" 11 | 12 | @interface FaceView : UIView 13 | 14 | - (void)configureWithBackgroundColor:(UIColor *)backgroundColor 15 | badGradient:(Gradient *)badGradient 16 | ughGradient:(Gradient *)ughGradient 17 | okGradient:(Gradient *)okGradient 18 | goodGradient:(Gradient *)goodGradient; 19 | - (void)updateLayers:(CGFloat)progress; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RPInteraction" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RPInteraction/RPInteraction.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "RPInteraction" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RPInteraction" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RPInteraction/RPInteraction.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "RPInteraction" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Constants/Constants.h: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern NSString *const BAD_START; 12 | extern NSString *const BAD_END; 13 | extern NSString *const UGH_START; 14 | extern NSString *const UGH_END; 15 | extern NSString *const OK_START; 16 | extern NSString *const OK_END; 17 | extern NSString *const GOOD_START; 18 | extern NSString *const GOOD_END; 19 | extern NSString *const BAD_TITLE; 20 | extern NSString *const UGH_TITLE; 21 | extern NSString *const OK_TITLE; 22 | extern NSString *const GOOD_TITLE; 23 | extern NSString *const MAIN_TITLE; 24 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Constants/Constants.m: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "Constants.h" 10 | 11 | NSString *const BAD_START = @"#FE0D46"; 12 | NSString *const BAD_END = @"#FEAD96"; 13 | NSString *const UGH_START = @"#F9D975"; 14 | NSString *const UGH_END = @"#F39F86"; 15 | NSString *const OK_START = @"#12E6F9"; 16 | NSString *const OK_END = @"#41B0FD"; 17 | NSString *const GOOD_START = @"#3EE882"; 18 | NSString *const GOOD_END = @"#3DF9CF"; 19 | NSString *const BAD_TITLE = @"#FE5C6E"; 20 | NSString *const UGH_TITLE = @"#F6BC7E"; 21 | NSString *const OK_TITLE = @"#28CDFC"; 22 | NSString *const GOOD_TITLE = @"#41F8C7"; 23 | NSString *const MAIN_TITLE = @"#656565"; 24 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ConfirmView.h: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmView.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Gradient.h" 11 | 12 | @interface ConfirmView : UIView 13 | 14 | @property (strong, nonatomic) UIButton *button; 15 | 16 | - (void)configureWithBackgroundColor:(UIColor *)backgroundColor 17 | title:(NSString *)title 18 | badGradient:(Gradient *)badGradient 19 | ughGradient:(Gradient *)ughGradient 20 | okGradient:(Gradient *)okGradient 21 | goodGradient:(Gradient *)goodGradient; 22 | - (void)updateLayers:(CGFloat)progress; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Example/RPInteraction_ExampleUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/RPInteraction-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 | #import "Constants.h" 14 | #import "RPRate.h" 15 | #import "RPViewController.h" 16 | #import "AnimationFactory.h" 17 | #import "LayerFactory.h" 18 | #import "Gradient.h" 19 | #import "Pie.h" 20 | #import "UIColor+Utils.h" 21 | #import "UIFont+Utils.h" 22 | #import "ConfirmView.h" 23 | #import "DescriptionView.h" 24 | #import "FaceView.h" 25 | #import "ReelView.h" 26 | #import "ScrollView.h" 27 | 28 | FOUNDATION_EXPORT double RPInteractionVersionNumber; 29 | FOUNDATION_EXPORT const unsigned char RPInteractionVersionString[]; 30 | 31 | -------------------------------------------------------------------------------- /.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/RPInteraction/ResourceBundle-RPInteraction-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 0.1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Factories/AnimationFactory.h: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationFactory.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RPRate.h" 11 | #import "Gradient.h" 12 | 13 | @interface AnimationFactory : NSObject 14 | 15 | + (CAAnimation *)mouthAnimationWithFrame:(CGRect)frame; 16 | + (CAAnimation *)eyeCircleCoverAnimationWithOffset:(CGFloat)offset; 17 | + (CAAnimation *)eyeRectCoverAnimationWithOffset:(CGFloat)offset; 18 | + (CAAnimation *)descriptionAnimationWithRate:(RPRate)rate offset:(CGFloat)offset; 19 | + (CAAnimation *)gradientAnimationWithBadGradient:(Gradient *)badGradient 20 | ughGradient:(Gradient *)ughGradient 21 | okGradient:(Gradient *)okGradient 22 | goodGradient:(Gradient *)goodGradient; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/RPInteraction/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-RPInteraction_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 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Utils/UIColor+Utils.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Utils.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "UIColor+Utils.h" 10 | 11 | @implementation UIColor (Utils) 12 | 13 | + (UIColor *)colorWithHexString:(NSString *)hexstr { 14 | NSScanner *scanner; 15 | unsigned int rgbval; 16 | 17 | scanner = [NSScanner scannerWithString: hexstr]; 18 | [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]]; 19 | [scanner scanHexInt: &rgbval]; 20 | 21 | return [UIColor colorWithHexValue: rgbval]; 22 | } 23 | 24 | + (UIColor *)colorWithHexValue:(NSInteger) rgbValue { 25 | return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 26 | green:((float)((rgbValue & 0xFF00) >> 8))/255.0 27 | blue:((float)(rgbValue & 0xFF))/255.0 28 | alpha:1.0]; 29 | 30 | } 31 | 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 nbolatov 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/RPInteraction.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "RPInteraction", 3 | "version": "0.1.0", 4 | "summary": "Review page interaction - handy and pretty way to ask for review.", 5 | "description": "Review page interaction - handy and pretty way to ask for review.\nInspired by https://dribbble.com/shots/4332677-Review-Page-Interaction.\nHow to use:\n1. Create an instance of RPViewController()\n2. Set titles, fonts and colors\n3. Present it!", 6 | "homepage": "https://github.com/nbolatov/RPInteraction", 7 | "screenshots": "https://cdn.dribbble.com/users/1233499/screenshots/4332677/attachments/987086/attachment.png", 8 | "license": { 9 | "type": "MIT", 10 | "file": "LICENSE" 11 | }, 12 | "authors": { 13 | "nbolatov": "nurda.bolatov@gmail.com" 14 | }, 15 | "source": { 16 | "git": "https://github.com/nbolatov/RPInteraction.git", 17 | "tag": "0.1.0" 18 | }, 19 | "platforms": { 20 | "ios": "8.0" 21 | }, 22 | "source_files": "RPInteraction/Classes/**/*", 23 | "resource_bundles": { 24 | "RPInteraction": [ 25 | "RPInteraction/Assets/*.png" 26 | ] 27 | }, 28 | "requires_arc": true, 29 | "ios": { 30 | "frameworks": [ 31 | "UIKit", 32 | "Foundation" 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /RPInteraction.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'RPInteraction' 3 | s.version = '0.1.1' 4 | s.summary = 'Review page interaction - handy and pretty way to ask for review.' 5 | 6 | s.description = <<-DESC 7 | Review page interaction - handy and pretty way to ask for review. 8 | Inspired by https://dribbble.com/shots/4332677-Review-Page-Interaction. 9 | How to use: 10 | 1. Create an instance of RPViewController() 11 | 2. Set titles, fonts and colors 12 | 3. Present it! 13 | DESC 14 | 15 | s.homepage = 'https://github.com/nbolatov/RPInteraction' 16 | s.screenshots = 'https://cdn.dribbble.com/users/1233499/screenshots/4332677/attachments/987086/attachment.png' 17 | s.license = { :type => 'MIT', :file => 'LICENSE' } 18 | s.author = { 'nbolatov' => 'nurda.bolatov@gmail.com' } 19 | s.source = { :git => 'https://github.com/nbolatov/RPInteraction.git', :tag => s.version.to_s } 20 | 21 | s.ios.deployment_target = '8.0' 22 | 23 | s.source_files = 'RPInteraction/Classes/**/*' 24 | 25 | s.resource_bundles = { 26 | 'RPInteraction' => ['RPInteraction/Assets/*.png'] 27 | } 28 | 29 | s.requires_arc = true 30 | s.ios.frameworks = 'UIKit', 'Foundation' 31 | end 32 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## RPInteraction 5 | 6 | Copyright (c) 2018 nbolatov 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 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Factories/LayerFactory.h: -------------------------------------------------------------------------------- 1 | // 2 | // LayerFactory.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LayerFactory : NSObject 12 | 13 | + (CALayer *)mouthLayer; 14 | + (CALayer *)eyeLayerWithSize:(CGSize)size; 15 | + (CALayer *)eyeCircleCoverLayerWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor; 16 | + (CALayer *)eyeRectCoverLayerWithFrame:(CGRect)frame angleDegree:(CGFloat)angleDegree backgroundColor:(UIColor *)backgroundColor; 17 | + (CALayer *)faceLayerWithSize:(CGSize)size; 18 | + (CALayer *)gradientLayerWithMask:(CALayer *)mask frame:(CGRect)frame; 19 | + (CALayer *)gradientLayerWithMask:(CALayer *)mask 20 | frame:(CGRect)frame 21 | colors:(NSArray *)colors 22 | startPoint:(CGPoint)startPoint 23 | endPoint:(CGPoint)endPoint; 24 | + (CALayer *)pieLayerWithFrame:(CGRect)frame 25 | startAngleDegree:(CGFloat)startAngleDegree 26 | endAngleDegree:(CGFloat)endAngleDegree; 27 | + (CALayer *)pieTitleLayerWithTitle:(NSString *)title 28 | titleColor:(UIColor *)titleColor 29 | frame:(CGRect)frame 30 | angleDegree:(CGFloat)angleDegree; 31 | + (CALayer *)pieLinesLayerWithFrame:(CGRect)frame 32 | startAngleDegree:(CGFloat)startAngleDegree; 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPInteraction-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollView.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/13/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "ScrollView.h" 10 | 11 | @interface ScrollView () 12 | @end 13 | 14 | @implementation ScrollView { 15 | UIScrollView *scrollView; 16 | } 17 | 18 | - (void)configure { 19 | CGFloat radius = self.bounds.size.width / 2; 20 | CGFloat circumference = 2 * M_PI * radius; 21 | CGFloat initialOffset = M_PI_4 / (2 * M_PI) * circumference; 22 | CGRect frame = self.bounds; 23 | frame.size.width = initialOffset; 24 | scrollView = [[UIScrollView alloc] initWithFrame:frame]; 25 | scrollView.clipsToBounds = NO; 26 | scrollView.pagingEnabled = YES; 27 | scrollView.delegate = self; 28 | scrollView.showsHorizontalScrollIndicator = false; 29 | scrollView.contentSize = CGSizeMake(100000, self.bounds.size.height); 30 | [scrollView setContentOffset:CGPointMake(initialOffset * 200, 0)]; 31 | [self addSubview:scrollView]; 32 | } 33 | 34 | - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 35 | if ([self pointInside:point withEvent:event]) { 36 | if ([self.subviews count] == 0) return nil; 37 | else return [self.subviews lastObject]; 38 | } 39 | return nil; 40 | } 41 | 42 | #pragma mark UIScrollViewDelegate 43 | 44 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 45 | CGFloat radius = self.bounds.size.width / 2; 46 | CGFloat circumference = 2 * M_PI * radius; 47 | CGFloat offset = fmod(scrollView.contentOffset.x, circumference); 48 | [self.delegate scrollViewDidChangeProgress:offset / circumference]; 49 | } 50 | 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/DescriptionView.m: -------------------------------------------------------------------------------- 1 | // 2 | // DescriptionView.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/12/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "DescriptionView.h" 10 | #import "Constants.h" 11 | #import "UIColor+Utils.h" 12 | #import "UIFont+Utils.h" 13 | #import "AnimationFactory.h" 14 | #import "LayerFactory.h" 15 | 16 | @implementation DescriptionView { 17 | NSMutableArray *layers; 18 | } 19 | 20 | - (instancetype)initWithFrame:(CGRect)frame { 21 | if (self = [super initWithFrame:frame]) { 22 | layers = [NSMutableArray new]; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)configureLabelWithRate:(RPRate)rate title:(NSString *)title color:(UIColor *)color { 28 | UILabel *label = [UILabel new]; 29 | label.frame = self.bounds; 30 | label.text = title; 31 | label.textAlignment = NSTextAlignmentCenter; 32 | label.textColor = color; 33 | [self addSubview:label]; 34 | 35 | CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height; 36 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 37 | if(screenHeight == 480 || screenHeight == 568) { 38 | label.font = [UIFont heavyFontOfSize:32]; 39 | } else { 40 | label.font = [UIFont heavyFontOfSize:48]; 41 | } 42 | } 43 | 44 | CGFloat offset = [[UIScreen mainScreen] bounds].size.width / 3; 45 | CAAnimation *descriptionAnimation = [AnimationFactory descriptionAnimationWithRate:rate 46 | offset:offset]; 47 | [label.layer addAnimation:descriptionAnimation forKey:@"animateLabel"]; 48 | label.layer.speed = 0; 49 | [layers addObjectsFromArray:@[label.layer]]; 50 | } 51 | 52 | - (void)updateLayers:(CGFloat)progress { 53 | for (CALayer *layer in layers) { 54 | layer.timeOffset = progress; 55 | } 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /Example/RPInteraction/Base.lproj/LaunchScreen.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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Controllers/RPViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPViewController.h 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RPRate.h" 11 | 12 | @interface RPViewController : UIViewController { 13 | void(^_confirmHandler)(RPRate rate); 14 | void(^_cancelHandler)(void); 15 | } 16 | 17 | @property (copy, nonatomic) NSString *rateTitle; 18 | @property (copy, nonatomic) NSString *badTitle; 19 | @property (copy, nonatomic) NSString *ughTitle; 20 | @property (copy, nonatomic) NSString *okTitle; 21 | @property (copy, nonatomic) NSString *goodTitle; 22 | @property (copy, nonatomic) NSString *confirmTitle; 23 | 24 | @property (strong, nonatomic) UIFont *rateTitleFont; 25 | @property (strong, nonatomic) UIFont *confirmTitleFont; 26 | 27 | @property (strong, nonatomic) UIColor *backgroundColor; 28 | @property (strong, nonatomic) UIColor *closeIconColor; 29 | 30 | @property (strong, nonatomic) UIColor *rateTitleColor; 31 | @property (strong, nonatomic) UIColor *reelTitleColor; 32 | @property (strong, nonatomic) UIColor *confirmTitleColor; 33 | 34 | @property (strong, nonatomic) UIColor *badTitleColor; 35 | @property (strong, nonatomic) UIColor *ughTitleColor; 36 | @property (strong, nonatomic) UIColor *okTitleColor; 37 | @property (strong, nonatomic) UIColor *goodTitleColor; 38 | 39 | @property (strong, nonatomic) UIColor *badStartGradientColor; 40 | @property (strong, nonatomic) UIColor *badEndGradientColor; 41 | @property (strong, nonatomic) UIColor *ughStartGradientColor; 42 | @property (strong, nonatomic) UIColor *ughEndGradientColor; 43 | @property (strong, nonatomic) UIColor *okStartGradientColor; 44 | @property (strong, nonatomic) UIColor *okEndGradientColor; 45 | @property (strong, nonatomic) UIColor *goodStartGradientColor; 46 | @property (strong, nonatomic) UIColor *goodEndGradientColor; 47 | 48 | - (void)onConfirmHandler:(void(^)(RPRate rate))confirmHandler; 49 | - (void)onCancelHandler:(void(^)(void))cancelHandler; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Example/RPInteraction/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/RPInteraction/RPExampleViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPExampleViewController.m 3 | // RPInteraction_Example 4 | // 5 | // Created by Nurdaulet Bolatov on 7/31/18. 6 | // Copyright © 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | #import "RPExampleViewController.h" 10 | @import RPInteraction; 11 | 12 | @interface RPExampleViewController () 13 | 14 | @end 15 | 16 | @implementation RPExampleViewController { 17 | UILabel *titleLabel; 18 | } 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | self.view.backgroundColor = UIColor.whiteColor; 23 | 24 | titleLabel = [UILabel new]; 25 | titleLabel.textAlignment = NSTextAlignmentCenter; 26 | titleLabel.text = @"Review Page Interaction"; 27 | titleLabel.frame = CGRectMake(0, 0, 200, 50); 28 | titleLabel.center = CGPointMake(self.view.center.x, self.view.center.y - 100); 29 | [self.view addSubview:titleLabel]; 30 | 31 | UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 32 | button.frame = CGRectMake(0, 0, 100, 50); 33 | button.center = self.view.center; 34 | [button setTitle:@"Show" forState:UIControlStateNormal]; 35 | [button addTarget:self action:@selector(show) forControlEvents:UIControlEventTouchUpInside]; 36 | [self.view addSubview:button]; 37 | } 38 | 39 | - (void)show { 40 | RPViewController *vc = [RPViewController new]; 41 | [vc onConfirmHandler:^(RPRate rate) { 42 | switch (rate) { 43 | case RPRateBad: 44 | titleLabel.text = @"BAD"; 45 | break; 46 | case RPRateUgh: 47 | titleLabel.text = @"UGH"; 48 | break; 49 | case RPRateOk: 50 | titleLabel.text = @"OK"; 51 | break; 52 | case RPRateGood: 53 | titleLabel.text = @"GOOD"; 54 | break; 55 | } 56 | [self dismissViewControllerAnimated:YES completion:nil]; 57 | }]; 58 | [vc onCancelHandler:^{ 59 | [self dismissViewControllerAnimated:YES completion:nil]; 60 | }]; 61 | [self presentViewController:vc animated:YES completion:nil]; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_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) 2018 nbolatov <nurda.bolatov@gmail.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 | RPInteraction 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 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ConfirmView.m: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmView.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "ConfirmView.h" 10 | #import "AnimationFactory.h" 11 | #import "LayerFactory.h" 12 | 13 | @implementation ConfirmView { 14 | CALayer *gradientLayer; 15 | } 16 | 17 | - (void)configureSubmitButtonWithTitle:(NSString *)title 18 | badGradient:(Gradient *)badGradient 19 | ughGradient:(Gradient *)ughGradient 20 | okGradient:(Gradient *)okGradient 21 | goodGradient:(Gradient *)goodGradient { 22 | _button = [UIButton buttonWithType:UIButtonTypeSystem]; 23 | _button.frame = CGRectMake(self.bounds.size.width / 2 - 75, self.bounds.size.height / 8, 150, 50); 24 | _button.layer.cornerRadius = _button.frame.size.height / 2; 25 | [_button setTitle:title forState:UIControlStateNormal]; 26 | [_button setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; 27 | 28 | CAAnimation *gradientAnimation = [AnimationFactory gradientAnimationWithBadGradient:badGradient 29 | ughGradient:ughGradient 30 | okGradient:okGradient 31 | goodGradient:goodGradient]; 32 | gradientLayer = [LayerFactory gradientLayerWithMask:nil frame:_button.bounds]; 33 | gradientLayer.cornerRadius = _button.layer.cornerRadius; 34 | [_button.layer insertSublayer:gradientLayer atIndex:0]; 35 | [gradientLayer addAnimation:gradientAnimation forKey:@"animateGradient"]; 36 | gradientLayer.speed = 0; 37 | 38 | [self addSubview:_button]; 39 | } 40 | 41 | - (void)configureWithBackgroundColor:(UIColor *)backgroundColor 42 | title:(NSString *)title 43 | badGradient:(Gradient *)badGradient 44 | ughGradient:(Gradient *)ughGradient 45 | okGradient:(Gradient *)okGradient 46 | goodGradient:(Gradient *)goodGradient { 47 | self.backgroundColor = backgroundColor; 48 | self.layer.cornerRadius = self.bounds.size.width / 2; 49 | self.layer.shadowColor = UIColor.blackColor.CGColor; 50 | self.layer.shadowOffset = CGSizeMake(0, 0); 51 | self.layer.shadowRadius = 10; 52 | self.layer.shadowOpacity = 0.3; 53 | [self configureSubmitButtonWithTitle:(NSString *)title 54 | badGradient:badGradient 55 | ughGradient:ughGradient 56 | okGradient:okGradient 57 | goodGradient:goodGradient]; 58 | } 59 | 60 | - (void)updateLayers:(CGFloat)progress { 61 | gradientLayer.timeOffset = progress; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /Example/RPInteraction_ExampleUITests/RPInteraction_ExampleUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPInteraction_ExampleUITests.m 3 | // RPInteraction_ExampleUITests 4 | // 5 | // Created by Nurdaulet Bolatov on 8/2/18. 6 | // Copyright © 2018 nbolatov. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RPInteraction_ExampleUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation RPInteraction_ExampleUITests { 16 | XCUIApplication *app; 17 | } 18 | 19 | - (void)setUp { 20 | [super setUp]; 21 | self.continueAfterFailure = NO; 22 | app = [[XCUIApplication alloc] init]; 23 | [app launch]; 24 | } 25 | 26 | - (void)tearDown { 27 | [super tearDown]; 28 | } 29 | 30 | - (void)testBad { 31 | XCUIElement *showButton = [[app buttons] objectForKeyedSubscript:@"Show"]; 32 | [showButton tap]; 33 | 34 | XCUIElement *confirmButton = [[app buttons] objectForKeyedSubscript:@"SUBMIT"]; 35 | [confirmButton tap]; 36 | 37 | XCUIElement *rateLabel = [[app staticTexts] elementBoundByIndex:0]; 38 | XCTAssertEqualObjects([rateLabel label], @"BAD"); 39 | } 40 | 41 | - (void)testUgh { 42 | XCUIElement *showButton = [[app buttons] objectForKeyedSubscript:@"Show"]; 43 | [showButton tap]; 44 | 45 | XCUIElement *scrollView = [[app scrollViews] elementBoundByIndex:0]; 46 | XCUICoordinate *start = [scrollView coordinateWithNormalizedOffset:CGVectorMake(2, 0)]; 47 | XCUICoordinate *end = [scrollView coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; 48 | [start pressForDuration:0 thenDragToCoordinate:end]; 49 | 50 | XCUIElement *confirmButton = [[app buttons] objectForKeyedSubscript:@"SUBMIT"]; 51 | [confirmButton tap]; 52 | 53 | XCUIElement *rateLabel = [[app staticTexts] elementBoundByIndex:0]; 54 | XCTAssertEqualObjects([rateLabel label], @"UGH"); 55 | } 56 | 57 | - (void)testOk { 58 | XCUIElement *showButton = [[app buttons] objectForKeyedSubscript:@"Show"]; 59 | [showButton tap]; 60 | 61 | XCUIElement *scrollView = [[app scrollViews] elementBoundByIndex:0]; 62 | 63 | XCUICoordinate *start1 = [scrollView coordinateWithNormalizedOffset:CGVectorMake(2, 0)]; 64 | XCUICoordinate *end1 = [scrollView coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; 65 | [start1 pressForDuration:0 thenDragToCoordinate:end1]; 66 | 67 | XCUICoordinate *start2 = [scrollView coordinateWithNormalizedOffset:CGVectorMake(2, 0)]; 68 | XCUICoordinate *end2 = [scrollView coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; 69 | [start2 pressForDuration:0 thenDragToCoordinate:end2]; 70 | 71 | XCUIElement *confirmButton = [[app buttons] objectForKeyedSubscript:@"SUBMIT"]; 72 | [confirmButton tap]; 73 | 74 | XCUIElement *rateLabel = [[app staticTexts] elementBoundByIndex:0]; 75 | XCTAssertEqualObjects([rateLabel label], @"OK"); 76 | } 77 | 78 | - (void)testGood { 79 | XCUIElement *showButton = [[app buttons] objectForKeyedSubscript:@"Show"]; 80 | [showButton tap]; 81 | 82 | XCUIElement *scrollView = [[app scrollViews] elementBoundByIndex:0]; 83 | XCUICoordinate *start = [scrollView coordinateWithNormalizedOffset:CGVectorMake(0, 0)]; 84 | XCUICoordinate *end = [scrollView coordinateWithNormalizedOffset:CGVectorMake(2, 0)]; 85 | [start pressForDuration:0 thenDragToCoordinate:end]; 86 | 87 | XCUIElement *confirmButton = [[app buttons] objectForKeyedSubscript:@"SUBMIT"]; 88 | [confirmButton tap]; 89 | 90 | XCUIElement *rateLabel = [[app staticTexts] elementBoundByIndex:0]; 91 | XCTAssertEqualObjects([rateLabel label], @"GOOD"); 92 | } 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RPInteraction 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/RPInteraction.svg?style=flat)](https://cocoapods.org/pods/RPInteraction) 4 | [![License](https://img.shields.io/cocoapods/l/RPInteraction.svg?style=flat)](https://cocoapods.org/pods/RPInteraction) 5 | [![Platform](https://img.shields.io/cocoapods/p/RPInteraction.svg?style=flat)](https://cocoapods.org/pods/RPInteraction) 6 | [![Build Status](https://travis-ci.com/nbolatov/RPInteraction.svg?branch=master)](https://travis-ci.com/nbolatov/RPInteraction) 7 | 8 | ![demo](Screenshots/rpinteraction.gif) 9 | 10 | ## Overview 11 | 12 | Review page interaction - handy and pretty way to ask for review. 13 | Inspired by [dribbble shot](https://dribbble.com/shots/4332677-Review-Page-Interaction). 14 | 15 | ## Requirements 16 | 17 | * iOS8 18 | 19 | ## Installation 20 | 21 | RPInteraction is available through [CocoaPods](https://cocoapods.org). To install 22 | it, simply add the following line to your Podfile: 23 | 24 | ```ruby 25 | pod 'RPInteraction' 26 | ``` 27 | 28 | ## Usage 29 | 30 | ```Objective-C 31 | @import RPInteraction; 32 | 33 | RPViewController *vc = [RPViewController new]; 34 | 35 | [vc onConfirmHandler:^(RPRate rate) { 36 | switch (rate) { 37 | case RPRateBad: 38 | titleLabel.text = @"BAD"; 39 | break; 40 | case RPRateUgh: 41 | titleLabel.text = @"UGH"; 42 | break; 43 | case RPRateOk: 44 | titleLabel.text = @"OK"; 45 | break; 46 | case RPRateGood: 47 | titleLabel.text = @"GOOD"; 48 | break; 49 | } 50 | [self dismissViewControllerAnimated:YES completion:nil]; 51 | }]; 52 | 53 | [vc onCancelHandler:^{ 54 | [self dismissViewControllerAnimated:YES completion:nil]; 55 | }]; 56 | 57 | [self presentViewController:vc animated:YES completion:nil]; 58 | ``` 59 | 60 | ### Available properties 61 | 62 | Property | Type | Default Value 63 | --- | --- | --- 64 | `rateTitle` | `NSString` | How was your experience with us? 65 | `badTitle` | `NSString` | BAD 66 | `ughTitle` | `NSString` | UGH 67 | `okTitle` | `NSString` | OK 68 | `goodTitle` | `NSString` | GOOD 69 | `confirmTitle` | `NSString` | SUBMIT 70 | `rateTitleFont` | `UIFont` | `[UIFont systemFontOfSize:24]` 71 | `confirmTitleFont` | `UIFont` | `[UIFont systemFontOfSize:24]` 72 | `backgroundColor` | `UIColor` | `#FFFFFF` 73 | `closeIconColor` | `UIColor` | `#656565` 74 | `rateTitleColor` | `UIColor` | `#656565` 75 | `reelTitleColor` | `UIColor` | `#FFFFFF` 76 | `confirmTitleColor` | `UIColor` | `#FFFFFF` 77 | `badTitleColor` | `UIColor` | `#FE5C6E` 78 | `ughTitleColor` | `UIColor` | `#F6BC7E` 79 | `okTitleColor` | `UIColor` | `#28CDFC` 80 | `goodTitleColor` | `UIColor` | `#41F8C7` 81 | `badStartGradientColor` | `UIColor` | `#FE0D46` 82 | `badEndGradientColor` | `UIColor` | `#FEAD96` 83 | `ughStartGradientColor` | `UIColor` | `#F9D975` 84 | `ughEndGradientColor` | `UIColor` | `#F39F86` 85 | `okStartGradientColor` | `UIColor` | `#12E6F9` 86 | `okEndGradientColor` | `UIColor` | `#41B0FD` 87 | `goodStartGradientColor` | `UIColor` | `#3EE882` 88 | `goodEndGradientColor` | `UIColor` | `#3DF9CF` 89 | 90 | ## Example Project 91 | 92 | An example project is included with this repo. To run the example project, clone the repo, and run `pod install` from the Example directory first. 93 | 94 | ## Author 95 | 96 | nbolatov, nurda.bolatov@gmail.com 97 | 98 | ## License 99 | 100 | RPInteraction is available under the MIT license. See the LICENSE file for more info. 101 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/ReelView.m: -------------------------------------------------------------------------------- 1 | // 2 | // ReelView.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 5/9/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "Constants.h" 10 | #import "UIColor+Utils.h" 11 | #import "ReelView.h" 12 | #import "LayerFactory.h" 13 | 14 | @implementation ReelView 15 | 16 | - (void)configurePieLayerWithTitle:(NSString *)title 17 | titleColor:(UIColor *)titleColor 18 | angleDegree:(CGFloat)angleDegree 19 | colors:(NSArray *)colors 20 | startPoint:(CGPoint)startPoint 21 | endPoint:(CGPoint)endPoint { 22 | CALayer *pieLayer = [LayerFactory pieLayerWithFrame:self.bounds 23 | startAngleDegree:angleDegree 24 | endAngleDegree:angleDegree + 45]; 25 | 26 | CALayer *gradientLayer = [LayerFactory gradientLayerWithMask:pieLayer 27 | frame:self.bounds 28 | colors:colors 29 | startPoint:startPoint 30 | endPoint:endPoint]; 31 | 32 | CGRect titleFrame = CGRectMake(50, 50, self.bounds.size.width - 100, self.bounds.size.height - 100); 33 | CALayer *pieTitleLayer = [LayerFactory pieTitleLayerWithTitle:title 34 | titleColor:titleColor 35 | frame:titleFrame 36 | angleDegree:angleDegree + 112.5]; 37 | 38 | CALayer *pieLinesLayer = [LayerFactory pieLinesLayerWithFrame:self.bounds 39 | startAngleDegree:angleDegree - 45]; 40 | 41 | [self.layer addSublayer:gradientLayer]; 42 | [self.layer addSublayer:pieTitleLayer]; 43 | [self.layer addSublayer:pieLinesLayer]; 44 | } 45 | 46 | - (void)configureWithBadPie:(Pie *)badPie 47 | ughPie:(Pie *)ughPie 48 | okPie:(Pie *)okPie 49 | goodPie:(Pie *)goodPie { 50 | NSArray *badGradient = @[(__bridge id) badPie.gradient.startGradientColor.CGColor, 51 | (__bridge id) badPie.gradient.endGradientColor.CGColor]; 52 | NSArray *ughGradient = @[(__bridge id) ughPie.gradient.startGradientColor.CGColor, 53 | (__bridge id) ughPie.gradient.endGradientColor.CGColor]; 54 | NSArray *okGradient = @[(__bridge id) okPie.gradient.startGradientColor.CGColor, 55 | (__bridge id) okPie.gradient.endGradientColor.CGColor]; 56 | NSArray *goodGradient = @[(__bridge id) goodPie.gradient.startGradientColor.CGColor, 57 | (__bridge id) goodPie.gradient.endGradientColor.CGColor]; 58 | 59 | CGFloat angleDegree = 22.5; 60 | [self configurePieLayerWithTitle:goodPie.title titleColor:goodPie.titleColor angleDegree:angleDegree 61 | colors:goodGradient startPoint:CGPointMake(0.75, 0.5) endPoint:CGPointMake(0.5, 0.75)]; 62 | 63 | angleDegree += 45; 64 | [self configurePieLayerWithTitle:badPie.title titleColor:badPie.titleColor angleDegree:angleDegree 65 | colors:badGradient startPoint:CGPointMake(0.75, 0.75) endPoint:CGPointMake(0.25, 0.75)]; 66 | 67 | angleDegree += 45; 68 | [self configurePieLayerWithTitle:ughPie.title titleColor:ughPie.titleColor angleDegree:angleDegree 69 | colors:ughGradient startPoint:CGPointMake(0.5, 0.75) endPoint:CGPointMake(0.25, 0.5)]; 70 | 71 | angleDegree += 45; 72 | [self configurePieLayerWithTitle:okPie.title titleColor:okPie.titleColor angleDegree:angleDegree 73 | colors:okGradient startPoint:CGPointMake(0.25, 0.75) endPoint:CGPointMake(0.25, 0.25)]; 74 | 75 | angleDegree += 45; 76 | [self configurePieLayerWithTitle:goodPie.title titleColor:goodPie.titleColor angleDegree:angleDegree 77 | colors:goodGradient startPoint:CGPointMake(0.25, 0.5) endPoint:CGPointMake(0.5, 0.25)]; 78 | 79 | angleDegree += 45; 80 | [self configurePieLayerWithTitle:badPie.title titleColor:badPie.titleColor angleDegree:angleDegree 81 | colors:badGradient startPoint:CGPointMake(0.25, 0.25) endPoint:CGPointMake(0.75, 0.25)]; 82 | 83 | angleDegree += 45; 84 | [self configurePieLayerWithTitle:ughPie.title titleColor:ughPie.titleColor angleDegree:angleDegree 85 | colors:ughGradient startPoint:CGPointMake(0.5, 0.25) endPoint:CGPointMake(0.75, 0.5)]; 86 | 87 | angleDegree += 45; 88 | [self configurePieLayerWithTitle:okPie.title titleColor:okPie.titleColor angleDegree:angleDegree 89 | colors:okGradient startPoint:CGPointMake(0.75, 0.25) endPoint:CGPointMake(0.75, 0.75)]; 90 | } 91 | 92 | @end 93 | -------------------------------------------------------------------------------- /Example/RPInteraction.xcodeproj/xcshareddata/xcschemes/RPInteraction-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 66 | 67 | 73 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 92 | 93 | 94 | 95 | 96 | 97 | 108 | 110 | 116 | 117 | 118 | 119 | 120 | 121 | 127 | 129 | 135 | 136 | 137 | 138 | 140 | 141 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Factories/LayerFactory.m: -------------------------------------------------------------------------------- 1 | // 2 | // LayerFactory.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "LayerFactory.h" 10 | 11 | @implementation LayerFactory 12 | 13 | + (CALayer *)mouthLayer { 14 | CAShapeLayer *layer = [CAShapeLayer new]; 15 | layer.strokeColor = UIColor.blackColor.CGColor; 16 | layer.fillColor = UIColor.clearColor.CGColor; 17 | layer.lineWidth = 10; 18 | layer.lineCap = @"round"; 19 | layer.contentsScale = [[UIScreen mainScreen] scale]; 20 | return layer; 21 | } 22 | 23 | + (CALayer *)eyeLayerWithSize:(CGSize)size { 24 | UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, size.width, size.height) 25 | cornerRadius:size.height / 2]; 26 | CAShapeLayer *layer = [CAShapeLayer new]; 27 | layer.fillColor = UIColor.blackColor.CGColor; 28 | layer.path = path.CGPath; 29 | layer.contentsScale = [[UIScreen mainScreen] scale]; 30 | return layer; 31 | } 32 | 33 | + (CALayer *)eyeCircleCoverLayerWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor { 34 | UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, frame.size.width, frame.size.height) 35 | cornerRadius:frame.size.height / 2]; 36 | CAShapeLayer *layer = [CAShapeLayer new]; 37 | layer.frame = frame; 38 | layer.fillColor = backgroundColor.CGColor; 39 | layer.path = path.CGPath; 40 | layer.contentsScale = [[UIScreen mainScreen] scale]; 41 | return layer; 42 | } 43 | 44 | + (CALayer *)eyeRectCoverLayerWithFrame:(CGRect)frame angleDegree:(CGFloat)angleDegree backgroundColor:(UIColor *)backgroundColor { 45 | UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 46 | CAShapeLayer *layer = [CAShapeLayer new]; 47 | layer.frame = frame; 48 | layer.fillColor = backgroundColor.CGColor; 49 | layer.path = path.CGPath; 50 | CGFloat angle = angleDegree / 180.0 * M_PI; 51 | layer.affineTransform = CGAffineTransformMakeRotation(angle); 52 | layer.contentsScale = [[UIScreen mainScreen] scale]; 53 | return layer; 54 | } 55 | 56 | + (CALayer *)faceLayerWithSize:(CGSize)size { 57 | CGFloat width = size.width - 10; 58 | CGFloat height = size.height - 10; 59 | UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(5, 5, width, height) 60 | cornerRadius:height / 2]; 61 | CAShapeLayer *layer = [CAShapeLayer new]; 62 | layer.path = path.CGPath; 63 | layer.strokeColor = UIColor.blackColor.CGColor; 64 | layer.fillColor = UIColor.clearColor.CGColor; 65 | layer.lineWidth = 10; 66 | layer.contentsScale = [[UIScreen mainScreen] scale]; 67 | return layer; 68 | } 69 | 70 | + (CALayer *)gradientLayerWithMask:(CALayer *)mask frame:(CGRect)frame { 71 | return [self gradientLayerWithMask:mask 72 | frame:frame 73 | colors:@[(__bridge id) UIColor.blackColor.CGColor, (__bridge id) UIColor.blackColor.CGColor] 74 | startPoint:CGPointMake(0, .5) 75 | endPoint:CGPointMake(1, .5)]; 76 | } 77 | 78 | + (CALayer *)gradientLayerWithMask:(CALayer *)mask 79 | frame:(CGRect)frame 80 | colors:(NSArray *)colors 81 | startPoint:(CGPoint)startPoint 82 | endPoint:(CGPoint)endPoint { 83 | CAGradientLayer *layer = [CAGradientLayer new]; 84 | layer.frame = frame; 85 | layer.colors = colors; 86 | layer.startPoint = startPoint; 87 | layer.endPoint = endPoint; 88 | layer.mask = mask; 89 | layer.contentsScale = [[UIScreen mainScreen] scale]; 90 | return layer; 91 | } 92 | 93 | + (CALayer *)pieLayerWithFrame:(CGRect)frame 94 | startAngleDegree:(CGFloat)startAngleDegree 95 | endAngleDegree:(CGFloat)endAngleDegree { 96 | CGPoint center = CGPointMake(frame.size.width / 2, frame.size.height / 2); 97 | CGFloat radius = frame.size.height / 2; 98 | UIBezierPath *path = [UIBezierPath bezierPath]; 99 | [path moveToPoint:center]; 100 | [path addArcWithCenter:center 101 | radius:radius 102 | startAngle:startAngleDegree / 180.0 * M_PI 103 | endAngle:endAngleDegree / 180.0 * M_PI 104 | clockwise:YES]; 105 | [path addLineToPoint:center]; 106 | [path closePath]; 107 | CAShapeLayer *layer = [CAShapeLayer new]; 108 | layer.fillColor = UIColor.blackColor.CGColor; 109 | layer.path = path.CGPath; 110 | layer.contentsScale = [[UIScreen mainScreen] scale]; 111 | return layer; 112 | } 113 | 114 | + (CALayer *)pieLinesLayerWithFrame:(CGRect)frame 115 | startAngleDegree:(CGFloat)startAngleDegree { 116 | CGPoint center = CGPointMake(frame.size.width / 2, frame.size.height / 2); 117 | CGFloat radius = frame.size.height / 2; 118 | CGFloat longLength = radius * 0.7; 119 | CGFloat shortLength = radius * 0.66; 120 | CGFloat angleDegree = startAngleDegree; 121 | CGFloat degreeBetweenLines = 7.5; 122 | UIBezierPath *path = [UIBezierPath bezierPath]; 123 | [path moveToPoint:center]; 124 | [path addLineToPoint:CGPointMake(center.x - sin(angleDegree / 180.0 * M_PI) * longLength, 125 | center.y + cos(angleDegree / 180.0 * M_PI) * longLength)]; 126 | for (int i = 0; i < 2; i++) { 127 | angleDegree -= degreeBetweenLines; 128 | [path moveToPoint:center]; 129 | [path addLineToPoint:CGPointMake(center.x - sin(angleDegree / 180.0 * M_PI) * shortLength, 130 | center.y + cos(angleDegree / 180.0 * M_PI) * shortLength)]; 131 | } 132 | angleDegree -= degreeBetweenLines; 133 | [path moveToPoint:center]; 134 | [path addLineToPoint:CGPointMake(center.x - sin(angleDegree / 180.0 * M_PI) * longLength, 135 | center.y + cos(angleDegree / 180.0 * M_PI) * longLength)]; 136 | for (int i = 0; i < 2; i++) { 137 | angleDegree -= degreeBetweenLines; 138 | [path moveToPoint:center]; 139 | [path addLineToPoint:CGPointMake(center.x - sin(angleDegree / 180.0 * M_PI) * shortLength, 140 | center.y + cos(angleDegree / 180.0 * M_PI) * shortLength)]; 141 | } 142 | CAShapeLayer *layer = [CAShapeLayer new]; 143 | layer.strokeColor = UIColor.blackColor.CGColor; 144 | layer.fillColor = UIColor.clearColor.CGColor; 145 | layer.lineWidth = 0.5; 146 | layer.opacity = 0.6; 147 | layer.path = path.CGPath; 148 | layer.contentsScale = [[UIScreen mainScreen] scale]; 149 | return layer; 150 | } 151 | 152 | + (CALayer *)pieTitleLayerWithTitle:(NSString *)title 153 | titleColor:(UIColor *)titleColor 154 | frame:(CGRect)frame 155 | angleDegree:(CGFloat)angleDegree { 156 | CATextLayer *layer = [CATextLayer new]; 157 | layer.fontSize = 28; 158 | layer.frame = frame; 159 | layer.string = title; 160 | layer.alignmentMode = kCAAlignmentCenter; 161 | layer.foregroundColor = titleColor.CGColor; 162 | CGFloat angle = angleDegree / 180.0 * M_PI; 163 | layer.affineTransform = CGAffineTransformMakeRotation(angle); 164 | layer.contentsScale = [[UIScreen mainScreen] scale]; 165 | return layer; 166 | } 167 | 168 | @end 169 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | 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}\"" 80 | 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}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # 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. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | 145 | if [[ "$CONFIGURATION" == "Debug" ]]; then 146 | install_framework "${BUILT_PRODUCTS_DIR}/RPInteraction/RPInteraction.framework" 147 | fi 148 | if [[ "$CONFIGURATION" == "Release" ]]; then 149 | install_framework "${BUILT_PRODUCTS_DIR}/RPInteraction/RPInteraction.framework" 150 | fi 151 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 152 | wait 153 | fi 154 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Views/FaceView.m: -------------------------------------------------------------------------------- 1 | // 2 | // FaceView.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "AnimationFactory.h" 10 | #import "LayerFactory.h" 11 | #import "FaceView.h" 12 | 13 | @implementation FaceView { 14 | NSMutableArray *layers; 15 | } 16 | 17 | - (void)configureMouthWithBadGradient:(Gradient *)badGradient 18 | ughGradient:(Gradient *)ughGradient 19 | okGradient:(Gradient *)okGradient 20 | goodGradient:(Gradient *)goodGradient { 21 | CGPoint mouthCenter = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2 + 45); 22 | CGRect mouthFrame = CGRectMake(mouthCenter.x - 50, mouthCenter.y - 27.5, 100, 55); 23 | 24 | CAAnimation *mouthAnimation = [AnimationFactory mouthAnimationWithFrame:mouthFrame]; 25 | CAAnimation *gradientAnimation = [AnimationFactory gradientAnimationWithBadGradient:badGradient 26 | ughGradient:ughGradient 27 | okGradient:okGradient 28 | goodGradient:goodGradient]; 29 | 30 | CALayer *mouthLayer = [LayerFactory mouthLayer]; 31 | CALayer *gradientLayer = [LayerFactory gradientLayerWithMask:mouthLayer frame:mouthFrame]; 32 | 33 | [self.layer addSublayer:gradientLayer]; 34 | 35 | [mouthLayer addAnimation:mouthAnimation forKey:@"animateMouth"]; 36 | [gradientLayer addAnimation:gradientAnimation forKey:@"animateMouthGradient"]; 37 | 38 | mouthLayer.speed = 0; 39 | gradientLayer.speed = 0; 40 | 41 | [layers addObjectsFromArray:@[mouthLayer, gradientLayer]]; 42 | } 43 | 44 | - (void)configureEyesWithBackgroundColor:(UIColor *)backgroundColor 45 | badGradient:(Gradient *)badGradient 46 | ughGradient:(Gradient *)ughGradient 47 | okGradient:(Gradient *)okGradient 48 | goodGradient:(Gradient *)goodGradient { 49 | CGPoint center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); 50 | CGRect leftEyeFrame = CGRectMake(center.x - 45, center.y - 35, 30, 30); 51 | CGRect leftEyeCircleCoverFrame = CGRectMake(center.x - 60, center.y - 52, 20, 20); 52 | CGRect leftEyeRectCoverFrame = CGRectMake(center.x - 48, center.y - 48, 40, 20); 53 | CGRect rightEyeFrame = CGRectMake(center.x + 15, center.y - 35, 30, 30); 54 | CGRect rightEyeCircleCoverFrame = CGRectMake(center.x + 40, center.y - 52, 20, 20); 55 | CGRect rightEyeRectCoverFrame = CGRectMake(center.x + 8, center.y - 48, 40, 20); 56 | CAAnimation *gradientAnimation = [AnimationFactory gradientAnimationWithBadGradient:badGradient 57 | ughGradient:ughGradient 58 | okGradient:okGradient 59 | goodGradient:goodGradient]; 60 | [self configureEyeWithFrame:leftEyeFrame 61 | circleCoverFrame:leftEyeCircleCoverFrame 62 | rectCoverFrame:leftEyeRectCoverFrame 63 | animationOffset:10 64 | rectCoverAngleDegree:15 65 | gradientAnimation:gradientAnimation 66 | backgroundColor:backgroundColor]; 67 | [self configureEyeWithFrame:rightEyeFrame 68 | circleCoverFrame:rightEyeCircleCoverFrame 69 | rectCoverFrame:rightEyeRectCoverFrame 70 | animationOffset:-10 71 | rectCoverAngleDegree:-15 72 | gradientAnimation:gradientAnimation 73 | backgroundColor:backgroundColor]; 74 | } 75 | 76 | - (void)configureEyeWithFrame:(CGRect)frame 77 | circleCoverFrame:(CGRect)circleCoverFrame 78 | rectCoverFrame:(CGRect)rectCoverFrame 79 | animationOffset:(CGFloat)offset 80 | rectCoverAngleDegree:(CGFloat)rectCoverAngleDegree 81 | gradientAnimation:(CAAnimation *)gradientAnimation 82 | backgroundColor:(UIColor *)backgroundColor { 83 | CAAnimation *eyeCircleCoverAnimation = [AnimationFactory eyeCircleCoverAnimationWithOffset:offset]; 84 | CAAnimation *eyeRectCoverAnimation = [AnimationFactory eyeRectCoverAnimationWithOffset:offset]; 85 | 86 | CALayer *eyeLayer = [LayerFactory eyeLayerWithSize:frame.size]; 87 | CALayer *gradientLayer = [LayerFactory gradientLayerWithMask:eyeLayer frame:frame]; 88 | CALayer *eyeCircleCoverLayer = [LayerFactory eyeCircleCoverLayerWithFrame:circleCoverFrame 89 | backgroundColor:backgroundColor]; 90 | CALayer *eyeRectCoverLayer = [LayerFactory eyeRectCoverLayerWithFrame:rectCoverFrame 91 | angleDegree:rectCoverAngleDegree 92 | backgroundColor:backgroundColor]; 93 | 94 | [self.layer addSublayer:gradientLayer]; 95 | [self.layer addSublayer:eyeCircleCoverLayer]; 96 | [self.layer addSublayer:eyeRectCoverLayer]; 97 | 98 | [gradientLayer addAnimation:gradientAnimation forKey:@"animateEyeGradient"]; 99 | [eyeCircleCoverLayer addAnimation:eyeCircleCoverAnimation forKey:@"animateEyeCircleCover"]; 100 | [eyeRectCoverLayer addAnimation:eyeRectCoverAnimation forKey:@"animateEyeRectCover"]; 101 | 102 | gradientLayer.speed = 0; 103 | eyeCircleCoverLayer.speed = 0; 104 | eyeRectCoverLayer.speed = 0; 105 | 106 | [layers addObjectsFromArray:@[gradientLayer, eyeCircleCoverLayer, eyeRectCoverLayer]]; 107 | } 108 | 109 | - (void)configureFaceWithBadGradient:(Gradient *)badGradient 110 | ughGradient:(Gradient *)ughGradient 111 | okGradient:(Gradient *)okGradient 112 | goodGradient:(Gradient *)goodGradient { 113 | CAAnimation *gradientAnimation = [AnimationFactory gradientAnimationWithBadGradient:badGradient 114 | ughGradient:ughGradient 115 | okGradient:okGradient 116 | goodGradient:goodGradient]; 117 | 118 | CALayer *faceLayer = [LayerFactory faceLayerWithSize:self.bounds.size]; 119 | CALayer *gradientLayer = [LayerFactory gradientLayerWithMask:faceLayer frame:self.bounds]; 120 | 121 | [self.layer addSublayer:gradientLayer]; 122 | 123 | [gradientLayer addAnimation:gradientAnimation forKey:@"animateFaceGradient"]; 124 | 125 | gradientLayer.speed = 0; 126 | 127 | [layers addObjectsFromArray:@[gradientLayer]]; 128 | } 129 | 130 | - (void)configureWithBackgroundColor:(UIColor *)backgroundColor 131 | badGradient:(Gradient *)badGradient 132 | ughGradient:(Gradient *)ughGradient 133 | okGradient:(Gradient *)okGradient 134 | goodGradient:(Gradient *)goodGradient { 135 | self.backgroundColor = backgroundColor; 136 | layers = [NSMutableArray new]; 137 | [self configureMouthWithBadGradient:badGradient ughGradient:ughGradient okGradient:okGradient goodGradient:goodGradient]; 138 | [self configureEyesWithBackgroundColor:backgroundColor 139 | badGradient:badGradient 140 | ughGradient:ughGradient 141 | okGradient:okGradient 142 | goodGradient:goodGradient]; 143 | [self configureFaceWithBadGradient:badGradient ughGradient:ughGradient okGradient:okGradient goodGradient:goodGradient]; 144 | } 145 | 146 | - (void)updateLayers:(CGFloat)progress { 147 | for (CALayer *layer in layers) { 148 | layer.timeOffset = progress; 149 | } 150 | } 151 | 152 | @end 153 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Controllers/RPViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPViewController.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "RPViewController.h" 10 | #import "FaceView.h" 11 | #import "ReelView.h" 12 | #import "ConfirmView.h" 13 | #import "DescriptionView.h" 14 | #import "Constants.h" 15 | #import "UIColor+Utils.h" 16 | #import "ScrollView.h" 17 | #import "Pie.h" 18 | 19 | @interface RPViewController () { 20 | CGFloat currentProgress; 21 | CGFloat screenWidth; 22 | Gradient *badGradient; 23 | Gradient *ughGradient; 24 | Gradient *okGradient; 25 | Gradient *goodGradient; 26 | Boolean isViewDidAppear; 27 | } 28 | 29 | @property (strong, nonatomic) UILabel *titleLabel; 30 | @property (strong, nonatomic) ReelView *reelView; 31 | @property (strong, nonatomic) ScrollView *scrollView; 32 | @property (strong, nonatomic) FaceView *faceView; 33 | @property (strong, nonatomic) ConfirmView *confirmView; 34 | @property (strong, nonatomic) DescriptionView *descriptionView; 35 | 36 | @end 37 | 38 | @implementation RPViewController 39 | 40 | - (instancetype)init { 41 | if (self = [super init]) { 42 | _rateTitle = @"How was your experience with us?"; 43 | _badTitle = @"BAD"; 44 | _ughTitle = @"UGH"; 45 | _okTitle = @"OK"; 46 | _goodTitle = @"GOOD"; 47 | _confirmTitle = @"SUBMIT"; 48 | 49 | _rateTitleFont = [UIFont systemFontOfSize:24]; 50 | _confirmTitleFont = [UIFont systemFontOfSize:24]; 51 | 52 | _backgroundColor = UIColor.whiteColor; 53 | _closeIconColor = [UIColor colorWithHexString:MAIN_TITLE]; 54 | 55 | _rateTitleColor = [UIColor colorWithHexString:MAIN_TITLE]; 56 | _reelTitleColor = UIColor.whiteColor; 57 | _confirmTitleColor = UIColor.whiteColor; 58 | 59 | _badTitleColor = [UIColor colorWithHexString:BAD_TITLE]; 60 | _ughTitleColor = [UIColor colorWithHexString:UGH_TITLE]; 61 | _okTitleColor = [UIColor colorWithHexString:OK_TITLE]; 62 | _goodTitleColor = [UIColor colorWithHexString:GOOD_TITLE]; 63 | 64 | _badStartGradientColor = [UIColor colorWithHexString:BAD_START]; 65 | _badEndGradientColor = [UIColor colorWithHexString:BAD_END]; 66 | _ughStartGradientColor = [UIColor colorWithHexString:UGH_START]; 67 | _ughEndGradientColor = [UIColor colorWithHexString:UGH_END]; 68 | _okStartGradientColor = [UIColor colorWithHexString:OK_START]; 69 | _okEndGradientColor = [UIColor colorWithHexString:OK_END]; 70 | _goodStartGradientColor = [UIColor colorWithHexString:GOOD_START]; 71 | _goodEndGradientColor = [UIColor colorWithHexString:GOOD_END]; 72 | } 73 | return self; 74 | } 75 | 76 | - (void)viewDidLoad { 77 | [super viewDidLoad]; 78 | self.view.backgroundColor = _backgroundColor; 79 | screenWidth = [[UIScreen mainScreen] bounds].size.width; 80 | 81 | badGradient = [[Gradient alloc] initWithStartGradientColor:_badStartGradientColor 82 | endGradientColor:_badEndGradientColor]; 83 | ughGradient = [[Gradient alloc] initWithStartGradientColor:_ughStartGradientColor 84 | endGradientColor:_ughEndGradientColor]; 85 | okGradient = [[Gradient alloc] initWithStartGradientColor:_okStartGradientColor 86 | endGradientColor:_okEndGradientColor]; 87 | goodGradient = [[Gradient alloc] initWithStartGradientColor:_goodStartGradientColor 88 | endGradientColor:_goodEndGradientColor]; 89 | 90 | [self configureTitle]; 91 | [self configureFace]; 92 | [self configureReel]; 93 | [self configureDescription]; 94 | [self configureConfirmation]; 95 | [self configureCancel]; 96 | } 97 | 98 | - (void)viewDidAppear:(BOOL)animated { 99 | [super viewDidAppear:animated]; 100 | isViewDidAppear = YES; 101 | } 102 | 103 | - (void)configureReel { 104 | CGFloat reelWidth = screenWidth + 300; 105 | CGRect reelViewRect = CGRectMake(0, 0, reelWidth, reelWidth); 106 | _reelView = [[ReelView alloc] initWithFrame:reelViewRect]; 107 | _reelView.center = CGPointMake(self.view.center.x, self.view.bounds.size.height + 70); 108 | [self.view addSubview:_reelView]; 109 | Pie *badPie = [[Pie alloc] initWithTitle:_badTitle titleColor:_reelTitleColor gradient:badGradient]; 110 | Pie *ughPie = [[Pie alloc] initWithTitle:_ughTitle titleColor:_reelTitleColor gradient:ughGradient]; 111 | Pie *okPie = [[Pie alloc] initWithTitle:_okTitle titleColor:_reelTitleColor gradient:okGradient]; 112 | Pie *goodPie = [[Pie alloc] initWithTitle:_goodTitle titleColor:_reelTitleColor gradient:goodGradient]; 113 | [_reelView configureWithBadPie:badPie ughPie:ughPie okPie:okPie goodPie:goodPie]; 114 | 115 | _scrollView = [[ScrollView alloc] initWithFrame:_reelView.frame]; 116 | _scrollView.delegate = self; 117 | [self.view addSubview:_scrollView]; 118 | [_scrollView configure]; 119 | } 120 | 121 | - (void)configureTitle { 122 | _titleLabel = [UILabel new]; 123 | CGFloat y = 30; 124 | CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height; 125 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 126 | if(screenHeight == 480 || screenHeight == 568) { 127 | y = 20; 128 | } else if (screenHeight == 812) { 129 | y = 60; 130 | } 131 | } 132 | _titleLabel.frame = CGRectMake(50, y, screenWidth - 100, 60); 133 | _titleLabel.font = _rateTitleFont; 134 | _titleLabel.numberOfLines = 2; 135 | _titleLabel.textAlignment = NSTextAlignmentCenter; 136 | _titleLabel.textColor = _rateTitleColor; 137 | _titleLabel.text = _rateTitle; 138 | [self.view addSubview:_titleLabel]; 139 | } 140 | 141 | - (void)configureFace { 142 | CGRect faceViewRect = CGRectMake(0, 0, 180, 180); 143 | CGFloat titleLabelMaxY = _titleLabel.frame.origin.y + _titleLabel.frame.size.height; 144 | _faceView = [[FaceView alloc] initWithFrame:faceViewRect]; 145 | _faceView.center = CGPointMake(self.view.center.x, (self.view.center.y + titleLabelMaxY) / 2); 146 | _faceView.backgroundColor = UIColor.grayColor; 147 | [self.view addSubview:_faceView]; 148 | [_faceView configureWithBackgroundColor:_backgroundColor 149 | badGradient:badGradient 150 | ughGradient:ughGradient 151 | okGradient:okGradient 152 | goodGradient:goodGradient]; 153 | } 154 | 155 | - (void)configureDescription { 156 | CGRect descriptionViewRect = CGRectMake(0, 0, 180, 50); 157 | CGFloat faceViewMaxY = _faceView.frame.origin.y + _faceView.frame.size.height; 158 | _descriptionView = [[DescriptionView alloc] initWithFrame:descriptionViewRect]; 159 | _descriptionView.center = CGPointMake(self.view.center.x, (faceViewMaxY + _reelView.frame.origin.y) / 2); 160 | [self.view addSubview:_descriptionView]; 161 | [_descriptionView configureLabelWithRate:RPRateBad title:_badTitle color:_badTitleColor]; 162 | [_descriptionView configureLabelWithRate:RPRateUgh title:_ughTitle color:_ughTitleColor]; 163 | [_descriptionView configureLabelWithRate:RPRateOk title:_okTitle color:_okTitleColor]; 164 | [_descriptionView configureLabelWithRate:RPRateGood title:_goodTitle color:_goodTitleColor]; 165 | } 166 | 167 | - (void)configureConfirmation { 168 | CGFloat confirmWidth = _reelView.frame.size.width * 0.64; 169 | CGRect confirmViewRect = CGRectMake(0, 0, confirmWidth, confirmWidth); 170 | _confirmView = [[ConfirmView alloc] initWithFrame:confirmViewRect]; 171 | _confirmView.center = CGPointMake(self.view.center.x, self.view.bounds.size.height + 70); 172 | _confirmView.backgroundColor = UIColor.blueColor; 173 | [self.view addSubview:_confirmView]; 174 | [_confirmView configureWithBackgroundColor:_backgroundColor 175 | title:_confirmTitle 176 | badGradient:badGradient 177 | ughGradient:ughGradient 178 | okGradient:okGradient 179 | goodGradient:goodGradient]; 180 | _confirmView.button.titleLabel.font = _confirmTitleFont; 181 | [_confirmView.button addTarget:self action:@selector(confirm) forControlEvents:UIControlEventTouchUpInside]; 182 | } 183 | 184 | - (void)configureCancel { 185 | NSString *imageName = @"close.png"; 186 | NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 187 | NSBundle *resources = [NSBundle bundleWithURL:[bundle URLForResource:@"RPInteraction" withExtension:@"bundle"]]; 188 | UIImage *closeIcon = [UIImage imageNamed:imageName]; 189 | if (closeIcon == nil) closeIcon = [UIImage imageNamed:imageName inBundle:resources compatibleWithTraitCollection:nil]; 190 | UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 191 | button.frame = CGRectMake(screenWidth - 38, _titleLabel.frame.origin.y, 26, 60); 192 | button.tintColor = _closeIconColor; 193 | [button setImage:closeIcon forState:UIControlStateNormal]; 194 | [button addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; 195 | [self.view addSubview:button]; 196 | } 197 | 198 | - (void)onConfirmHandler:(void(^)(RPRate rate))confirmHandler { 199 | _confirmHandler = [confirmHandler copy]; 200 | } 201 | 202 | - (void)onCancelHandler:(void(^)(void))cancelHandler { 203 | _cancelHandler = [cancelHandler copy]; 204 | } 205 | 206 | - (void)confirm { 207 | RPRate rate = RPRateGood; 208 | if ((-0.1 < currentProgress && currentProgress < 0.1) || (0.4 < currentProgress && currentProgress < 0.6) 209 | || (0.9 < currentProgress)) { 210 | rate = RPRateBad; 211 | } else if ((0.1 < currentProgress && currentProgress < 0.2) || (0.6 < currentProgress && currentProgress < 0.7)) { 212 | rate = RPRateUgh; 213 | } else if ((0.2 < currentProgress && currentProgress < 0.3) || (0.7 < currentProgress && currentProgress < 0.8)) { 214 | rate = RPRateOk; 215 | } 216 | if (_confirmHandler) { 217 | __weak RPViewController *weakSelf = self; 218 | dispatch_async(dispatch_get_main_queue(), ^{ 219 | RPViewController *ref = weakSelf; 220 | if (ref == nil) return; 221 | ref->_confirmHandler(rate); 222 | ref->_confirmHandler = nil; 223 | }); 224 | } 225 | } 226 | 227 | - (void)cancel { 228 | if (_cancelHandler) { 229 | __weak RPViewController *weakSelf = self; 230 | dispatch_async(dispatch_get_main_queue(), ^{ 231 | RPViewController *ref = weakSelf; 232 | if (ref == nil) return; 233 | ref->_cancelHandler(); 234 | ref->_cancelHandler = nil; 235 | }); 236 | } 237 | } 238 | 239 | #pragma mark ScrollViewDelegate 240 | 241 | - (void)scrollViewDidChangeProgress:(CGFloat)progress { 242 | if (!isViewDidAppear) return; 243 | CGFloat angle = -2 * M_PI * progress; 244 | CGFloat newProgress = progress < 0 ? 1 + progress : progress; 245 | currentProgress = newProgress; 246 | __weak RPViewController *weakSelf = self; 247 | dispatch_block_t updateLayers = ^{ 248 | weakSelf.reelView.transform = CGAffineTransformMakeRotation(angle); 249 | [weakSelf.faceView updateLayers:newProgress]; 250 | [weakSelf.confirmView updateLayers:newProgress]; 251 | [weakSelf.descriptionView updateLayers:newProgress]; 252 | }; 253 | if ([NSThread isMainThread]) { 254 | updateLayers(); 255 | } else { 256 | dispatch_sync(dispatch_get_main_queue(), updateLayers); 257 | } 258 | } 259 | 260 | @end 261 | -------------------------------------------------------------------------------- /RPInteraction/Classes/Factories/AnimationFactory.m: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationFactory.m 3 | // AwesomeApp 4 | // 5 | // Created by Nurdaulet Bolatov on 3/30/18. 6 | // Copyright © 2018 Nurdaulet Bolatov. All rights reserved. 7 | // 8 | 9 | #import "Constants.h" 10 | #import "UIColor+Utils.h" 11 | #import "AnimationFactory.h" 12 | 13 | @implementation AnimationFactory 14 | 15 | + (CAAnimation *)mouthAnimationWithFrame:(CGRect)frame { 16 | CGPoint center = CGPointMake(frame.size.width / 2, frame.size.height / 2); 17 | NSArray *mouthPaths = [AnimationFactory mouthPathsWithCenter:center]; 18 | CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animation]; 19 | pathAnimation.keyPath = @"path"; 20 | pathAnimation.values = mouthPaths; 21 | pathAnimation.duration = 1; 22 | 23 | CAKeyframeAnimation *yAnimation = [CAKeyframeAnimation animation]; 24 | yAnimation.keyPath = @"transform.translation.y"; 25 | yAnimation.values = @[[NSNumber numberWithFloat:0], 26 | [NSNumber numberWithFloat:0], 27 | [NSNumber numberWithFloat:-5], 28 | [NSNumber numberWithFloat:-8], 29 | [NSNumber numberWithFloat:0], 30 | [NSNumber numberWithFloat:0], 31 | [NSNumber numberWithFloat:-5], 32 | [NSNumber numberWithFloat:-8], 33 | [NSNumber numberWithFloat:0]]; 34 | 35 | CAAnimationGroup *group = [CAAnimationGroup animation]; 36 | group.duration = 1; 37 | group.animations = @[pathAnimation, yAnimation]; 38 | group.removedOnCompletion = NO; 39 | group.fillMode = kCAFillModeBoth; 40 | return group; 41 | } 42 | 43 | + (CAAnimation *)eyeCircleCoverAnimationWithOffset:(CGFloat)offset { 44 | CAKeyframeAnimation *xAnimation = [CAKeyframeAnimation animation]; 45 | xAnimation.keyPath = @"transform.translation.x"; 46 | xAnimation.values = @[[NSNumber numberWithFloat:0], 47 | [NSNumber numberWithFloat:offset], 48 | [NSNumber numberWithFloat:0], 49 | [NSNumber numberWithFloat:0], 50 | [NSNumber numberWithFloat:0], 51 | [NSNumber numberWithFloat:offset], 52 | [NSNumber numberWithFloat:0], 53 | [NSNumber numberWithFloat:0], 54 | [NSNumber numberWithFloat:0]]; 55 | 56 | CAKeyframeAnimation *yAnimation = [CAKeyframeAnimation animation]; 57 | yAnimation.keyPath = @"transform.translation.y"; 58 | yAnimation.values = @[[NSNumber numberWithFloat:0], 59 | [NSNumber numberWithFloat:fabs(offset)], 60 | [NSNumber numberWithFloat:0], 61 | [NSNumber numberWithFloat:0], 62 | [NSNumber numberWithFloat:0], 63 | [NSNumber numberWithFloat:fabs(offset)], 64 | [NSNumber numberWithFloat:0], 65 | [NSNumber numberWithFloat:0], 66 | [NSNumber numberWithFloat:0]]; 67 | 68 | CAAnimationGroup *group = [CAAnimationGroup animation]; 69 | group.duration = 1; 70 | group.animations = @[xAnimation, yAnimation]; 71 | group.removedOnCompletion = NO; 72 | group.fillMode = kCAFillModeBoth; 73 | return group; 74 | } 75 | 76 | + (CAAnimation *)eyeRectCoverAnimationWithOffset:(CGFloat)offset { 77 | CAKeyframeAnimation *xAnimation = [CAKeyframeAnimation animation]; 78 | xAnimation.keyPath = @"transform.translation.x"; 79 | xAnimation.values = @[[NSNumber numberWithFloat:0], 80 | [NSNumber numberWithFloat:offset], 81 | [NSNumber numberWithFloat:offset], 82 | [NSNumber numberWithFloat:offset], 83 | [NSNumber numberWithFloat:0], 84 | [NSNumber numberWithFloat:offset], 85 | [NSNumber numberWithFloat:offset], 86 | [NSNumber numberWithFloat:offset], 87 | [NSNumber numberWithFloat:0]]; 88 | 89 | CAKeyframeAnimation *yAnimation = [CAKeyframeAnimation animation]; 90 | yAnimation.keyPath = @"transform.translation.y"; 91 | yAnimation.values = @[[NSNumber numberWithFloat:0], 92 | [NSNumber numberWithFloat:-fabs(offset)], 93 | [NSNumber numberWithFloat:-fabs(offset)], 94 | [NSNumber numberWithFloat:-fabs(offset)], 95 | [NSNumber numberWithFloat:0], 96 | [NSNumber numberWithFloat:-fabs(offset)], 97 | [NSNumber numberWithFloat:-fabs(offset)], 98 | [NSNumber numberWithFloat:-fabs(offset)], 99 | [NSNumber numberWithFloat:0]]; 100 | 101 | CAAnimationGroup *group = [CAAnimationGroup animation]; 102 | group.duration = 1; 103 | group.animations = @[xAnimation, yAnimation]; 104 | group.removedOnCompletion = NO; 105 | group.fillMode = kCAFillModeBoth; 106 | return group; 107 | } 108 | 109 | + (CAAnimation *)descriptionAnimationWithRate:(RPRate)rate offset:(CGFloat)offset { 110 | NSMutableArray *xAnimationValues = [NSMutableArray new]; 111 | NSMutableArray *opacityAnimationValues = [NSMutableArray new]; 112 | 113 | for (NSUInteger i = 0; i < 9; i++) { 114 | NSUInteger current = i % 4; 115 | NSUInteger prev = (i == 0 ? 8 : i - 1) % 4; 116 | NSNumber *xAnimationValue; 117 | NSNumber *opacityAnimationValue; 118 | if (current == rate) { 119 | xAnimationValue = [NSNumber numberWithFloat:0]; 120 | opacityAnimationValue = [NSNumber numberWithFloat:1]; 121 | } else { 122 | xAnimationValue = [NSNumber numberWithFloat:prev == rate ? -offset : offset]; 123 | opacityAnimationValue = [NSNumber numberWithFloat:0]; 124 | } 125 | [xAnimationValues addObject:xAnimationValue]; 126 | [opacityAnimationValues addObject:opacityAnimationValue]; 127 | } 128 | 129 | CAKeyframeAnimation *xAnimation = [CAKeyframeAnimation animation]; 130 | xAnimation.keyPath = @"transform.translation.x"; 131 | xAnimation.values = xAnimationValues; 132 | 133 | CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animation]; 134 | opacityAnimation.keyPath = @"opacity"; 135 | opacityAnimation.values = opacityAnimationValues; 136 | 137 | CAAnimationGroup *group = [CAAnimationGroup animation]; 138 | group.duration = 1; 139 | group.animations = @[xAnimation, opacityAnimation]; 140 | group.removedOnCompletion = NO; 141 | group.fillMode = kCAFillModeBoth; 142 | return group; 143 | } 144 | 145 | + (CAAnimation *)gradientAnimationWithBadGradient:(Gradient *)badGradient 146 | ughGradient:(Gradient *)ughGradient 147 | okGradient:(Gradient *)okGradient 148 | goodGradient:(Gradient *)goodGradient { 149 | NSArray *colors = @[@[(__bridge id) badGradient.startGradientColor.CGColor, 150 | (__bridge id) badGradient.endGradientColor.CGColor], 151 | @[(__bridge id) ughGradient.startGradientColor.CGColor, 152 | (__bridge id) ughGradient.endGradientColor.CGColor], 153 | @[(__bridge id) okGradient.startGradientColor.CGColor, 154 | (__bridge id) okGradient.endGradientColor.CGColor], 155 | @[(__bridge id) goodGradient.startGradientColor.CGColor, 156 | (__bridge id) goodGradient.endGradientColor.CGColor], 157 | @[(__bridge id) badGradient.startGradientColor.CGColor, 158 | (__bridge id) badGradient.endGradientColor.CGColor], 159 | @[(__bridge id) ughGradient.startGradientColor.CGColor, 160 | (__bridge id) ughGradient.endGradientColor.CGColor], 161 | @[(__bridge id) okGradient.startGradientColor.CGColor, 162 | (__bridge id) okGradient.endGradientColor.CGColor], 163 | @[(__bridge id) goodGradient.startGradientColor.CGColor, 164 | (__bridge id) goodGradient.endGradientColor.CGColor], 165 | @[(__bridge id) badGradient.startGradientColor.CGColor, 166 | (__bridge id) badGradient.endGradientColor.CGColor]]; 167 | CAKeyframeAnimation *colorsAnimation = [CAKeyframeAnimation animation]; 168 | colorsAnimation.keyPath = @"colors"; 169 | colorsAnimation.values = colors; 170 | colorsAnimation.duration = 1; 171 | 172 | CAKeyframeAnimation *startPointYAnimation = [CAKeyframeAnimation animation]; 173 | startPointYAnimation.keyPath = @"startPoint.y"; 174 | startPointYAnimation.values = @[[NSNumber numberWithFloat:.5], 175 | [NSNumber numberWithFloat:.5], 176 | [NSNumber numberWithFloat:0], 177 | [NSNumber numberWithFloat:0], 178 | [NSNumber numberWithFloat:.5], 179 | [NSNumber numberWithFloat:.5], 180 | [NSNumber numberWithFloat:0], 181 | [NSNumber numberWithFloat:0], 182 | [NSNumber numberWithFloat:.5]]; 183 | startPointYAnimation.duration = 1; 184 | 185 | CAKeyframeAnimation *endPointYAnimation = [CAKeyframeAnimation animation]; 186 | endPointYAnimation.keyPath = @"endPoint.y"; 187 | endPointYAnimation.values = @[[NSNumber numberWithFloat:.5], 188 | [NSNumber numberWithFloat:.5], 189 | [NSNumber numberWithFloat:1], 190 | [NSNumber numberWithFloat:1], 191 | [NSNumber numberWithFloat:.5], 192 | [NSNumber numberWithFloat:.5], 193 | [NSNumber numberWithFloat:1], 194 | [NSNumber numberWithFloat:1], 195 | [NSNumber numberWithFloat:.5]]; 196 | endPointYAnimation.duration = 1; 197 | 198 | CAAnimationGroup *group = [CAAnimationGroup animation]; 199 | group.duration = 1; 200 | group.animations = @[colorsAnimation, startPointYAnimation, endPointYAnimation]; 201 | group.removedOnCompletion = NO; 202 | group.fillMode = kCAFillModeBoth; 203 | return group; 204 | } 205 | 206 | + (NSArray *)mouthPathsWithCenter:(CGPoint)center { 207 | CGFloat width = center.x - 10; 208 | CGFloat height = center.y - 10; 209 | 210 | UIBezierPath *path1 = [UIBezierPath bezierPath]; 211 | [path1 moveToPoint:CGPointMake(center.x - width, center.y)]; 212 | [path1 addQuadCurveToPoint:CGPointMake(center.x, center.y - height) 213 | controlPoint:CGPointMake(center.x - width * 0.7, center.y - height)]; 214 | [path1 addQuadCurveToPoint:CGPointMake(center.x + width, center.y) 215 | controlPoint:CGPointMake(center.x + width * 0.7, center.y - height)]; 216 | 217 | UIBezierPath *path2 = [UIBezierPath bezierPath]; 218 | [path2 moveToPoint:CGPointMake(center.x - width, center.y)]; 219 | [path2 addQuadCurveToPoint:CGPointMake(center.x, center.y - height) 220 | controlPoint:CGPointMake(center.x - width * 0.7, center.y - height)]; 221 | [path2 addQuadCurveToPoint:CGPointMake(center.x + width, center.y - height) 222 | controlPoint:CGPointMake(center.x + width / 2, center.y - height)]; 223 | 224 | UIBezierPath *path3 = [UIBezierPath bezierPath]; 225 | [path3 moveToPoint:CGPointMake(center.x - width, center.y)]; 226 | [path3 addQuadCurveToPoint:CGPointMake(center.x, center.y) 227 | controlPoint:CGPointMake(center.x - width / 2, center.y)]; 228 | [path3 addQuadCurveToPoint:CGPointMake(center.x + width, center.y) 229 | controlPoint:CGPointMake(center.x + width / 2, center.y)]; 230 | 231 | UIBezierPath *path4 = [UIBezierPath bezierPath]; 232 | [path4 moveToPoint:CGPointMake(center.x - width, center.y)]; 233 | [path4 addQuadCurveToPoint:CGPointMake(center.x, center.y + height) 234 | controlPoint:CGPointMake(center.x - width * 0.7, center.y + height)]; 235 | [path4 addQuadCurveToPoint:CGPointMake(center.x + width, center.y) 236 | controlPoint:CGPointMake(center.x + width * 0.7, center.y + height)]; 237 | 238 | return @[(__bridge id) path1.CGPath, (__bridge id) path2.CGPath, (__bridge id) path3.CGPath, (__bridge id) path4.CGPath, 239 | (__bridge id) path1.CGPath, (__bridge id) path2.CGPath, (__bridge id) path3.CGPath, (__bridge id) path4.CGPath, 240 | (__bridge id) path1.CGPath]; 241 | } 242 | 243 | @end 244 | -------------------------------------------------------------------------------- /Example/RPInteraction.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 11 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 12 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 13 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 14 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 15 | 6003F59E195388D20070C39A /* RPAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* RPAppDelegate.m */; }; 16 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 17 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; 18 | 9335543F2110539E00433A76 /* RPExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9335543E2110539E00433A76 /* RPExampleViewController.m */; }; 19 | 935A29922112F36800B92F39 /* RPInteraction_ExampleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 935A29912112F36800B92F39 /* RPInteraction_ExampleUITests.m */; }; 20 | B19AC4F23FB552D461E3B6E3 /* Pods_RPInteraction_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D3434C21D3C2F476AA3B090 /* Pods_RPInteraction_Example.framework */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 935A29942112F36800B92F39 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 6003F582195388D10070C39A /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 6003F589195388D20070C39A; 29 | remoteInfo = RPInteraction_Example; 30 | }; 31 | /* End PBXContainerItemProxy section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 1012A3D600B0D9C5EAE23F04 /* RPInteraction.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = RPInteraction.podspec; path = ../RPInteraction.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 35 | 472BFC7D1EDD4102E8B8DFE3 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 36 | 6003F58A195388D20070C39A /* RPInteraction_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RPInteraction_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 38 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 39 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 40 | 6003F595195388D20070C39A /* RPInteraction-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RPInteraction-Info.plist"; sourceTree = ""; }; 41 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 42 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 43 | 6003F59B195388D20070C39A /* RPInteraction-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RPInteraction-Prefix.pch"; sourceTree = ""; }; 44 | 6003F59C195388D20070C39A /* RPAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RPAppDelegate.h; sourceTree = ""; }; 45 | 6003F59D195388D20070C39A /* RPAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RPAppDelegate.m; sourceTree = ""; }; 46 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 47 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 48 | 6D3434C21D3C2F476AA3B090 /* Pods_RPInteraction_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RPInteraction_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 50 | 7428E809482BECD8DA0AD282 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 51 | 9335543D2110539E00433A76 /* RPExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RPExampleViewController.h; sourceTree = ""; }; 52 | 9335543E2110539E00433A76 /* RPExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RPExampleViewController.m; sourceTree = ""; }; 53 | 935A298F2112F36800B92F39 /* RPInteraction_ExampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RPInteraction_ExampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 935A29912112F36800B92F39 /* RPInteraction_ExampleUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RPInteraction_ExampleUITests.m; sourceTree = ""; }; 55 | 935A29932112F36800B92F39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 9C788D74A1441892A2CA0BFE /* Pods-RPInteraction_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RPInteraction_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.debug.xcconfig"; sourceTree = ""; }; 57 | A7BD56A664EAAB48976FFB37 /* Pods-RPInteraction_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RPInteraction_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.release.xcconfig"; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 6003F587195388D20070C39A /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 66 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 67 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 68 | B19AC4F23FB552D461E3B6E3 /* Pods_RPInteraction_Example.framework in Frameworks */, 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | 935A298C2112F36800B92F39 /* Frameworks */ = { 73 | isa = PBXFrameworksBuildPhase; 74 | buildActionMask = 2147483647; 75 | files = ( 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | /* End PBXFrameworksBuildPhase section */ 80 | 81 | /* Begin PBXGroup section */ 82 | 37A759C15B6590F1C703DD7E /* Pods */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 9C788D74A1441892A2CA0BFE /* Pods-RPInteraction_Example.debug.xcconfig */, 86 | A7BD56A664EAAB48976FFB37 /* Pods-RPInteraction_Example.release.xcconfig */, 87 | ); 88 | name = Pods; 89 | sourceTree = ""; 90 | }; 91 | 6003F581195388D10070C39A = { 92 | isa = PBXGroup; 93 | children = ( 94 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 95 | 6003F593195388D20070C39A /* Example for RPInteraction */, 96 | 935A29902112F36800B92F39 /* RPInteraction_ExampleUITests */, 97 | 6003F58C195388D20070C39A /* Frameworks */, 98 | 6003F58B195388D20070C39A /* Products */, 99 | 37A759C15B6590F1C703DD7E /* Pods */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | 6003F58B195388D20070C39A /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 6003F58A195388D20070C39A /* RPInteraction_Example.app */, 107 | 935A298F2112F36800B92F39 /* RPInteraction_ExampleUITests.xctest */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 6003F58C195388D20070C39A /* Frameworks */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 6003F58D195388D20070C39A /* Foundation.framework */, 116 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 117 | 6003F591195388D20070C39A /* UIKit.framework */, 118 | 6003F5AF195388D20070C39A /* XCTest.framework */, 119 | 6D3434C21D3C2F476AA3B090 /* Pods_RPInteraction_Example.framework */, 120 | ); 121 | name = Frameworks; 122 | sourceTree = ""; 123 | }; 124 | 6003F593195388D20070C39A /* Example for RPInteraction */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 6003F59C195388D20070C39A /* RPAppDelegate.h */, 128 | 6003F59D195388D20070C39A /* RPAppDelegate.m */, 129 | 9335543D2110539E00433A76 /* RPExampleViewController.h */, 130 | 9335543E2110539E00433A76 /* RPExampleViewController.m */, 131 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 132 | 6003F5A8195388D20070C39A /* Images.xcassets */, 133 | 6003F594195388D20070C39A /* Supporting Files */, 134 | ); 135 | name = "Example for RPInteraction"; 136 | path = RPInteraction; 137 | sourceTree = ""; 138 | }; 139 | 6003F594195388D20070C39A /* Supporting Files */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 6003F595195388D20070C39A /* RPInteraction-Info.plist */, 143 | 6003F596195388D20070C39A /* InfoPlist.strings */, 144 | 6003F599195388D20070C39A /* main.m */, 145 | 6003F59B195388D20070C39A /* RPInteraction-Prefix.pch */, 146 | ); 147 | name = "Supporting Files"; 148 | sourceTree = ""; 149 | }; 150 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | 1012A3D600B0D9C5EAE23F04 /* RPInteraction.podspec */, 154 | 7428E809482BECD8DA0AD282 /* README.md */, 155 | 472BFC7D1EDD4102E8B8DFE3 /* LICENSE */, 156 | ); 157 | name = "Podspec Metadata"; 158 | sourceTree = ""; 159 | }; 160 | 935A29902112F36800B92F39 /* RPInteraction_ExampleUITests */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | 935A29912112F36800B92F39 /* RPInteraction_ExampleUITests.m */, 164 | 935A29932112F36800B92F39 /* Info.plist */, 165 | ); 166 | path = RPInteraction_ExampleUITests; 167 | sourceTree = ""; 168 | }; 169 | /* End PBXGroup section */ 170 | 171 | /* Begin PBXNativeTarget section */ 172 | 6003F589195388D20070C39A /* RPInteraction_Example */ = { 173 | isa = PBXNativeTarget; 174 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "RPInteraction_Example" */; 175 | buildPhases = ( 176 | 4F1171769E13EFE6C2679DE7 /* [CP] Check Pods Manifest.lock */, 177 | 6003F586195388D20070C39A /* Sources */, 178 | 6003F587195388D20070C39A /* Frameworks */, 179 | 6003F588195388D20070C39A /* Resources */, 180 | F3B81E9D9384F69601A9686F /* [CP] Embed Pods Frameworks */, 181 | ); 182 | buildRules = ( 183 | ); 184 | dependencies = ( 185 | ); 186 | name = RPInteraction_Example; 187 | productName = RPInteraction; 188 | productReference = 6003F58A195388D20070C39A /* RPInteraction_Example.app */; 189 | productType = "com.apple.product-type.application"; 190 | }; 191 | 935A298E2112F36800B92F39 /* RPInteraction_ExampleUITests */ = { 192 | isa = PBXNativeTarget; 193 | buildConfigurationList = 935A29962112F36800B92F39 /* Build configuration list for PBXNativeTarget "RPInteraction_ExampleUITests" */; 194 | buildPhases = ( 195 | 935A298B2112F36800B92F39 /* Sources */, 196 | 935A298C2112F36800B92F39 /* Frameworks */, 197 | 935A298D2112F36800B92F39 /* Resources */, 198 | ); 199 | buildRules = ( 200 | ); 201 | dependencies = ( 202 | 935A29952112F36800B92F39 /* PBXTargetDependency */, 203 | ); 204 | name = RPInteraction_ExampleUITests; 205 | productName = RPInteraction_ExampleUITests; 206 | productReference = 935A298F2112F36800B92F39 /* RPInteraction_ExampleUITests.xctest */; 207 | productType = "com.apple.product-type.bundle.ui-testing"; 208 | }; 209 | /* End PBXNativeTarget section */ 210 | 211 | /* Begin PBXProject section */ 212 | 6003F582195388D10070C39A /* Project object */ = { 213 | isa = PBXProject; 214 | attributes = { 215 | CLASSPREFIX = RP; 216 | LastUpgradeCheck = 0920; 217 | ORGANIZATIONNAME = nbolatov; 218 | TargetAttributes = { 219 | 935A298E2112F36800B92F39 = { 220 | CreatedOnToolsVersion = 9.2; 221 | ProvisioningStyle = Automatic; 222 | TestTargetID = 6003F589195388D20070C39A; 223 | }; 224 | }; 225 | }; 226 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "RPInteraction" */; 227 | compatibilityVersion = "Xcode 3.2"; 228 | developmentRegion = English; 229 | hasScannedForEncodings = 0; 230 | knownRegions = ( 231 | en, 232 | Base, 233 | ); 234 | mainGroup = 6003F581195388D10070C39A; 235 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 236 | projectDirPath = ""; 237 | projectRoot = ""; 238 | targets = ( 239 | 6003F589195388D20070C39A /* RPInteraction_Example */, 240 | 935A298E2112F36800B92F39 /* RPInteraction_ExampleUITests */, 241 | ); 242 | }; 243 | /* End PBXProject section */ 244 | 245 | /* Begin PBXResourcesBuildPhase section */ 246 | 6003F588195388D20070C39A /* Resources */ = { 247 | isa = PBXResourcesBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, 251 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 252 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | 935A298D2112F36800B92F39 /* Resources */ = { 257 | isa = PBXResourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | /* End PBXResourcesBuildPhase section */ 264 | 265 | /* Begin PBXShellScriptBuildPhase section */ 266 | 4F1171769E13EFE6C2679DE7 /* [CP] Check Pods Manifest.lock */ = { 267 | isa = PBXShellScriptBuildPhase; 268 | buildActionMask = 2147483647; 269 | files = ( 270 | ); 271 | inputPaths = ( 272 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 273 | "${PODS_ROOT}/Manifest.lock", 274 | ); 275 | name = "[CP] Check Pods Manifest.lock"; 276 | outputPaths = ( 277 | "$(DERIVED_FILE_DIR)/Pods-RPInteraction_Example-checkManifestLockResult.txt", 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | shellPath = /bin/sh; 281 | 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"; 282 | showEnvVarsInLog = 0; 283 | }; 284 | F3B81E9D9384F69601A9686F /* [CP] Embed Pods Frameworks */ = { 285 | isa = PBXShellScriptBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | ); 289 | inputPaths = ( 290 | "${SRCROOT}/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-frameworks.sh", 291 | "${BUILT_PRODUCTS_DIR}/RPInteraction/RPInteraction.framework", 292 | ); 293 | name = "[CP] Embed Pods Frameworks"; 294 | outputPaths = ( 295 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RPInteraction.framework", 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example-frameworks.sh\"\n"; 300 | showEnvVarsInLog = 0; 301 | }; 302 | /* End PBXShellScriptBuildPhase section */ 303 | 304 | /* Begin PBXSourcesBuildPhase section */ 305 | 6003F586195388D20070C39A /* Sources */ = { 306 | isa = PBXSourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | 6003F59E195388D20070C39A /* RPAppDelegate.m in Sources */, 310 | 9335543F2110539E00433A76 /* RPExampleViewController.m in Sources */, 311 | 6003F59A195388D20070C39A /* main.m in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 935A298B2112F36800B92F39 /* Sources */ = { 316 | isa = PBXSourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 935A29922112F36800B92F39 /* RPInteraction_ExampleUITests.m in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | /* End PBXSourcesBuildPhase section */ 324 | 325 | /* Begin PBXTargetDependency section */ 326 | 935A29952112F36800B92F39 /* PBXTargetDependency */ = { 327 | isa = PBXTargetDependency; 328 | target = 6003F589195388D20070C39A /* RPInteraction_Example */; 329 | targetProxy = 935A29942112F36800B92F39 /* PBXContainerItemProxy */; 330 | }; 331 | /* End PBXTargetDependency section */ 332 | 333 | /* Begin PBXVariantGroup section */ 334 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 335 | isa = PBXVariantGroup; 336 | children = ( 337 | 6003F597195388D20070C39A /* en */, 338 | ); 339 | name = InfoPlist.strings; 340 | sourceTree = ""; 341 | }; 342 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { 343 | isa = PBXVariantGroup; 344 | children = ( 345 | 71719F9E1E33DC2100824A3D /* Base */, 346 | ); 347 | name = LaunchScreen.storyboard; 348 | sourceTree = ""; 349 | }; 350 | /* End PBXVariantGroup section */ 351 | 352 | /* Begin XCBuildConfiguration section */ 353 | 6003F5BD195388D20070C39A /* Debug */ = { 354 | isa = XCBuildConfiguration; 355 | buildSettings = { 356 | ALWAYS_SEARCH_USER_PATHS = NO; 357 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 358 | CLANG_CXX_LIBRARY = "libc++"; 359 | CLANG_ENABLE_MODULES = YES; 360 | CLANG_ENABLE_OBJC_ARC = YES; 361 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 362 | CLANG_WARN_BOOL_CONVERSION = YES; 363 | CLANG_WARN_COMMA = YES; 364 | CLANG_WARN_CONSTANT_CONVERSION = YES; 365 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 366 | CLANG_WARN_EMPTY_BODY = YES; 367 | CLANG_WARN_ENUM_CONVERSION = YES; 368 | CLANG_WARN_INFINITE_RECURSION = YES; 369 | CLANG_WARN_INT_CONVERSION = YES; 370 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 371 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 372 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 373 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 374 | CLANG_WARN_STRICT_PROTOTYPES = YES; 375 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 376 | CLANG_WARN_UNREACHABLE_CODE = YES; 377 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 378 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 379 | COPY_PHASE_STRIP = NO; 380 | ENABLE_STRICT_OBJC_MSGSEND = YES; 381 | ENABLE_TESTABILITY = YES; 382 | GCC_C_LANGUAGE_STANDARD = gnu99; 383 | GCC_DYNAMIC_NO_PIC = NO; 384 | GCC_NO_COMMON_BLOCKS = YES; 385 | GCC_OPTIMIZATION_LEVEL = 0; 386 | GCC_PREPROCESSOR_DEFINITIONS = ( 387 | "DEBUG=1", 388 | "$(inherited)", 389 | ); 390 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 391 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 392 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 393 | GCC_WARN_UNDECLARED_SELECTOR = YES; 394 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 395 | GCC_WARN_UNUSED_FUNCTION = YES; 396 | GCC_WARN_UNUSED_VARIABLE = YES; 397 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 398 | ONLY_ACTIVE_ARCH = YES; 399 | SDKROOT = iphoneos; 400 | TARGETED_DEVICE_FAMILY = "1,2"; 401 | }; 402 | name = Debug; 403 | }; 404 | 6003F5BE195388D20070C39A /* Release */ = { 405 | isa = XCBuildConfiguration; 406 | buildSettings = { 407 | ALWAYS_SEARCH_USER_PATHS = NO; 408 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 409 | CLANG_CXX_LIBRARY = "libc++"; 410 | CLANG_ENABLE_MODULES = YES; 411 | CLANG_ENABLE_OBJC_ARC = YES; 412 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 413 | CLANG_WARN_BOOL_CONVERSION = YES; 414 | CLANG_WARN_COMMA = YES; 415 | CLANG_WARN_CONSTANT_CONVERSION = YES; 416 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 417 | CLANG_WARN_EMPTY_BODY = YES; 418 | CLANG_WARN_ENUM_CONVERSION = YES; 419 | CLANG_WARN_INFINITE_RECURSION = YES; 420 | CLANG_WARN_INT_CONVERSION = YES; 421 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 422 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 423 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 424 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 425 | CLANG_WARN_STRICT_PROTOTYPES = YES; 426 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 427 | CLANG_WARN_UNREACHABLE_CODE = YES; 428 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 429 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 430 | COPY_PHASE_STRIP = YES; 431 | ENABLE_NS_ASSERTIONS = NO; 432 | ENABLE_STRICT_OBJC_MSGSEND = YES; 433 | GCC_C_LANGUAGE_STANDARD = gnu99; 434 | GCC_NO_COMMON_BLOCKS = YES; 435 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 436 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 437 | GCC_WARN_UNDECLARED_SELECTOR = YES; 438 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 439 | GCC_WARN_UNUSED_FUNCTION = YES; 440 | GCC_WARN_UNUSED_VARIABLE = YES; 441 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 442 | SDKROOT = iphoneos; 443 | TARGETED_DEVICE_FAMILY = "1,2"; 444 | VALIDATE_PRODUCT = YES; 445 | }; 446 | name = Release; 447 | }; 448 | 6003F5C0195388D20070C39A /* Debug */ = { 449 | isa = XCBuildConfiguration; 450 | baseConfigurationReference = 9C788D74A1441892A2CA0BFE /* Pods-RPInteraction_Example.debug.xcconfig */; 451 | buildSettings = { 452 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 453 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 454 | GCC_PREFIX_HEADER = "RPInteraction/RPInteraction-Prefix.pch"; 455 | INFOPLIST_FILE = "RPInteraction/RPInteraction-Info.plist"; 456 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 457 | MODULE_NAME = ExampleApp; 458 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 459 | PRODUCT_NAME = "$(TARGET_NAME)"; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | WRAPPER_EXTENSION = app; 462 | }; 463 | name = Debug; 464 | }; 465 | 6003F5C1195388D20070C39A /* Release */ = { 466 | isa = XCBuildConfiguration; 467 | baseConfigurationReference = A7BD56A664EAAB48976FFB37 /* Pods-RPInteraction_Example.release.xcconfig */; 468 | buildSettings = { 469 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 470 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 471 | GCC_PREFIX_HEADER = "RPInteraction/RPInteraction-Prefix.pch"; 472 | INFOPLIST_FILE = "RPInteraction/RPInteraction-Info.plist"; 473 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 474 | MODULE_NAME = ExampleApp; 475 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 476 | PRODUCT_NAME = "$(TARGET_NAME)"; 477 | TARGETED_DEVICE_FAMILY = "1,2"; 478 | WRAPPER_EXTENSION = app; 479 | }; 480 | name = Release; 481 | }; 482 | 935A29972112F36800B92F39 /* Debug */ = { 483 | isa = XCBuildConfiguration; 484 | buildSettings = { 485 | CLANG_ANALYZER_NONNULL = YES; 486 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 487 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 488 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 489 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 490 | CODE_SIGN_IDENTITY = "iPhone Developer"; 491 | CODE_SIGN_STYLE = Automatic; 492 | DEBUG_INFORMATION_FORMAT = dwarf; 493 | GCC_C_LANGUAGE_STANDARD = gnu11; 494 | INFOPLIST_FILE = RPInteraction_ExampleUITests/Info.plist; 495 | IPHONEOS_DEPLOYMENT_TARGET = 11.2; 496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 497 | MTL_ENABLE_DEBUG_INFO = YES; 498 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RPInteraction-ExampleUITests"; 499 | PRODUCT_NAME = "$(TARGET_NAME)"; 500 | TARGETED_DEVICE_FAMILY = "1,2"; 501 | TEST_TARGET_NAME = RPInteraction_Example; 502 | }; 503 | name = Debug; 504 | }; 505 | 935A29982112F36800B92F39 /* Release */ = { 506 | isa = XCBuildConfiguration; 507 | buildSettings = { 508 | CLANG_ANALYZER_NONNULL = YES; 509 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 510 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 511 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 512 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 513 | CODE_SIGN_IDENTITY = "iPhone Developer"; 514 | CODE_SIGN_STYLE = Automatic; 515 | COPY_PHASE_STRIP = NO; 516 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 517 | GCC_C_LANGUAGE_STANDARD = gnu11; 518 | INFOPLIST_FILE = RPInteraction_ExampleUITests/Info.plist; 519 | IPHONEOS_DEPLOYMENT_TARGET = 11.2; 520 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 521 | MTL_ENABLE_DEBUG_INFO = NO; 522 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.RPInteraction-ExampleUITests"; 523 | PRODUCT_NAME = "$(TARGET_NAME)"; 524 | TARGETED_DEVICE_FAMILY = "1,2"; 525 | TEST_TARGET_NAME = RPInteraction_Example; 526 | }; 527 | name = Release; 528 | }; 529 | /* End XCBuildConfiguration section */ 530 | 531 | /* Begin XCConfigurationList section */ 532 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "RPInteraction" */ = { 533 | isa = XCConfigurationList; 534 | buildConfigurations = ( 535 | 6003F5BD195388D20070C39A /* Debug */, 536 | 6003F5BE195388D20070C39A /* Release */, 537 | ); 538 | defaultConfigurationIsVisible = 0; 539 | defaultConfigurationName = Release; 540 | }; 541 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "RPInteraction_Example" */ = { 542 | isa = XCConfigurationList; 543 | buildConfigurations = ( 544 | 6003F5C0195388D20070C39A /* Debug */, 545 | 6003F5C1195388D20070C39A /* Release */, 546 | ); 547 | defaultConfigurationIsVisible = 0; 548 | defaultConfigurationName = Release; 549 | }; 550 | 935A29962112F36800B92F39 /* Build configuration list for PBXNativeTarget "RPInteraction_ExampleUITests" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 935A29972112F36800B92F39 /* Debug */, 554 | 935A29982112F36800B92F39 /* Release */, 555 | ); 556 | defaultConfigurationIsVisible = 0; 557 | defaultConfigurationName = Release; 558 | }; 559 | /* End XCConfigurationList section */ 560 | }; 561 | rootObject = 6003F582195388D10070C39A /* Project object */; 562 | } 563 | -------------------------------------------------------------------------------- /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 | 0B3CB7C8E1889C709D8039C3231AAC14 /* ReelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 46C88A3622BD9440C59139AB4EFD90EB /* ReelView.m */; }; 11 | 14465A4476228EBCF76E52C53D22B8CA /* RPInteraction.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7A95F97F1629D85C42001A12B9C4AB33 /* RPInteraction.bundle */; }; 12 | 2019BA3A90B6FC794AD4F96E6E2E3942 /* Pie.m in Sources */ = {isa = PBXBuildFile; fileRef = F95834D91A28F9B880E43730D1881DB2 /* Pie.m */; }; 13 | 2AE461AE103F502A4ED3CF4046EC3E15 /* close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C9313A859DFB916BF4883C68823A7EC7 /* close@2x.png */; }; 14 | 3D929025598432FCED451E199FD0F0AF /* AnimationFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F53F8F47547C2A4836F1673B60167B /* AnimationFactory.m */; }; 15 | 5406B8D8CAF474703CFF152F72C6B9C8 /* UIColor+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 45F8940C4AA0952C44D7042B5942B827 /* UIColor+Utils.m */; }; 16 | 56031E96DE2018A7101F60278D37E266 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */; }; 17 | 59506F0C5CDCB6E5A83FB79E36A1C11C /* Pods-RPInteraction_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 28F093929EA93EB5A394D2DADCDCD26E /* Pods-RPInteraction_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 66B97505638D7BD4F9B71486D5548164 /* LayerFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 770960D37BAB5576B4D1072913FF4671 /* LayerFactory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | 68A7EE2FFEFD20052DD530AEEF8EA2E2 /* DescriptionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 65059BF466BDFFDF2C2BA25588268817 /* DescriptionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 6B4C7BE2E8C5B02FC9BF17B72D4EB897 /* Pods-RPInteraction_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B1E43A4C919B99E2C0B1CB5BFAC4B7A0 /* Pods-RPInteraction_Example-dummy.m */; }; 21 | 6F2A27991ED46888071A87C0A0EABF2B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; 22 | 7956FDFDDA41F5F83D652E2095C5D30F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; 23 | 93E05773C7286F4723B4F830D6812F50 /* AnimationFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E5283801013A2CD6F1C39349FAA78D6 /* AnimationFactory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | 94915B16C7776C079B525B41ABB32D96 /* ScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 16B5908E89E0E4C109FAE8B5B85299A7 /* ScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | 950B866839C27AB5DC993A7C3DDA2125 /* Gradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 16574ABDA125BBCEADAA1EF5A78B8717 /* Gradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26 | 95361D8D6E18DE81CA70A1707ED719C8 /* RPRate.h in Headers */ = {isa = PBXBuildFile; fileRef = EB159D10EA8FF0A0DFC7EAE98C730527 /* RPRate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | 95D61BA590E448744E7CB68A041FD20E /* FaceView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BF1F464D4BAFAC23A8230F82EC3CF49 /* FaceView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | 9766F20102D158A60EFE6FA67BDD9424 /* ReelView.h in Headers */ = {isa = PBXBuildFile; fileRef = 98E137ADC26FC65E786E05C9D5934FF8 /* ReelView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29 | 98DEDFD04A4C156657B70B793037F761 /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 91CA64C10FEDF903D6BBDA266834230E /* Constants.m */; }; 30 | A1B8747A7AFA7F0C6139B8874406AA0B /* UIColor+Utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DEC836C4C9466613F8CCB9A63ACB29DA /* UIColor+Utils.h */; settings = {ATTRIBUTES = (Public, ); }; }; 31 | A9DB8CC57C3EC9021069A4A396DD758A /* FaceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D297A2D057948C59CAEBA668EE1A261 /* FaceView.m */; }; 32 | AC5ABF253948A862A92AC4432FB48122 /* UIFont+Utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 16AEFEC8D8146F51890249A2E493FEB5 /* UIFont+Utils.h */; settings = {ATTRIBUTES = (Public, ); }; }; 33 | AECF3739EAA78770B94F3028568911F5 /* RPInteraction-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA4582C0E64000AFD1928BD8AA4830E5 /* RPInteraction-dummy.m */; }; 34 | B441E42C28EE7F8FDC91E6EBEFBD8C8E /* Gradient.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC13DDDBDF3C155B3ADAFED563F343A /* Gradient.m */; }; 35 | B82E3FB137C0DE666914279DD0524CBA /* ScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 385174096C982CEAD54DB060393C2584 /* ScrollView.m */; }; 36 | C8A8D04A9BBD0FA2ECA2F5AB5D50ED65 /* DescriptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 315E7FBCBAD8ED893EFEE1D2B855E058 /* DescriptionView.m */; }; 37 | CC31225073DA6030A22068A2874C44D1 /* ConfirmView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B13E1E3CDC7D73C2021C52B07294493 /* ConfirmView.m */; }; 38 | D4BAD379625E4A13AEC0C72F3E556E97 /* Constants.h in Headers */ = {isa = PBXBuildFile; fileRef = AE63BA9F438F223487749945DA034914 /* Constants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39 | DA2C6221CFDE68B87A0D7A578B0D8F43 /* RPViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 089A52D3284F267FCA8B4F032551A2C3 /* RPViewController.m */; }; 40 | E0A8EE00A23DEB84E5E10D0C69C78BE0 /* close.png in Resources */ = {isa = PBXBuildFile; fileRef = 074930263B62DF6560AAFA5AB31A0AF1 /* close.png */; }; 41 | E182B845F42A3D2A9F43B4D284635758 /* ConfirmView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E56CC1CF42BAE680A45C3E68B243090 /* ConfirmView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42 | E37EF5D7AB8D846C4D58AF1FD13D61A2 /* UIFont+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 499CA81D40C3AD10D904D23DF3D0574E /* UIFont+Utils.m */; }; 43 | E674FF4426493F9EBC924812F5626EE4 /* LayerFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E639E2A727E5DF460BAAD4BD0E56E2 /* LayerFactory.m */; }; 44 | F653F1E3DE4AD8AE50A3ECF0987FDFF6 /* Pie.h in Headers */ = {isa = PBXBuildFile; fileRef = 543A8DDDF93AABD3AF9D4D2496E864FA /* Pie.h */; settings = {ATTRIBUTES = (Public, ); }; }; 45 | FBB40AAB9F0062E7505220F50CDF5A49 /* RPViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 364FBF81052FE3EBACCF3F3B417FA4D3 /* RPViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46 | FEBD86B3833A8B67F721FF3201614723 /* close@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 56FE7E21AB1B8883830CEABE08A7A1DB /* close@3x.png */; }; 47 | FF8C93B7F55E5C8E0B438C95AB34A878 /* RPInteraction-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D32CEB5ED66E63254AFED0108D464254 /* RPInteraction-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 48 | /* End PBXBuildFile section */ 49 | 50 | /* Begin PBXContainerItemProxy section */ 51 | 38D77B3772957BE68FDF8ED96E81878A /* PBXContainerItemProxy */ = { 52 | isa = PBXContainerItemProxy; 53 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 54 | proxyType = 1; 55 | remoteGlobalIDString = 5BC2026E3B6EDD4BB6A912535152EA77; 56 | remoteInfo = RPInteraction; 57 | }; 58 | 79518B55BF1D8C262C5199624ACB3710 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 61 | proxyType = 1; 62 | remoteGlobalIDString = 990B4698CD89C07F13A9650F2C88079C; 63 | remoteInfo = "RPInteraction-RPInteraction"; 64 | }; 65 | /* End PBXContainerItemProxy section */ 66 | 67 | /* Begin PBXFileReference section */ 68 | 066A51E57EAFC132BE65B2C31FE20EFC /* RPInteraction.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RPInteraction.modulemap; sourceTree = ""; }; 69 | 074930263B62DF6560AAFA5AB31A0AF1 /* close.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = close.png; path = RPInteraction/Assets/close.png; sourceTree = ""; }; 70 | 089A52D3284F267FCA8B4F032551A2C3 /* RPViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = RPViewController.m; sourceTree = ""; }; 71 | 0953D6570693ECDF1B39E5FB4F33725E /* Pods-RPInteraction_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RPInteraction_Example.release.xcconfig"; sourceTree = ""; }; 72 | 0BF1F464D4BAFAC23A8230F82EC3CF49 /* FaceView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FaceView.h; sourceTree = ""; }; 73 | 0E56CC1CF42BAE680A45C3E68B243090 /* ConfirmView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ConfirmView.h; sourceTree = ""; }; 74 | 16574ABDA125BBCEADAA1EF5A78B8717 /* Gradient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Gradient.h; sourceTree = ""; }; 75 | 16AEFEC8D8146F51890249A2E493FEB5 /* UIFont+Utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIFont+Utils.h"; sourceTree = ""; }; 76 | 16B5908E89E0E4C109FAE8B5B85299A7 /* ScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ScrollView.h; sourceTree = ""; }; 77 | 19E2978AD049EDB4AFBC37150359B198 /* Pods_RPInteraction_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_RPInteraction_Example.framework; path = "Pods-RPInteraction_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 78 | 203DB159CF634FE86B157DD8E19FBACB /* Pods-RPInteraction_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RPInteraction_Example-acknowledgements.plist"; sourceTree = ""; }; 79 | 21C8F4AAFEA2D774AA135248C887F811 /* Pods-RPInteraction_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RPInteraction_Example-frameworks.sh"; sourceTree = ""; }; 80 | 28F093929EA93EB5A394D2DADCDCD26E /* Pods-RPInteraction_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-RPInteraction_Example-umbrella.h"; sourceTree = ""; }; 81 | 2A43711C5D5EF2AD2862D3E974623331 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 82 | 2A87C4061E263489BC39778D4E1488C8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 83 | 315E7FBCBAD8ED893EFEE1D2B855E058 /* DescriptionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = DescriptionView.m; sourceTree = ""; }; 84 | 364FBF81052FE3EBACCF3F3B417FA4D3 /* RPViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = RPViewController.h; sourceTree = ""; }; 85 | 385174096C982CEAD54DB060393C2584 /* ScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ScrollView.m; sourceTree = ""; }; 86 | 3D057C4A36FED6584EB31B9A9969569F /* RPInteraction.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = RPInteraction.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 87 | 45F8940C4AA0952C44D7042B5942B827 /* UIColor+Utils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Utils.m"; sourceTree = ""; }; 88 | 46C88A3622BD9440C59139AB4EFD90EB /* ReelView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ReelView.m; sourceTree = ""; }; 89 | 499CA81D40C3AD10D904D23DF3D0574E /* UIFont+Utils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIFont+Utils.m"; sourceTree = ""; }; 90 | 4C0D2472E364EC2DBCAE9A2E53C2ADFC /* Pods-RPInteraction_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RPInteraction_Example.debug.xcconfig"; sourceTree = ""; }; 91 | 4D297A2D057948C59CAEBA668EE1A261 /* FaceView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = FaceView.m; sourceTree = ""; }; 92 | 543A8DDDF93AABD3AF9D4D2496E864FA /* Pie.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Pie.h; sourceTree = ""; }; 93 | 56FE7E21AB1B8883830CEABE08A7A1DB /* close@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "close@3x.png"; path = "RPInteraction/Assets/close@3x.png"; sourceTree = ""; }; 94 | 62A0B6BD391CA503B21649F63AE61536 /* RPInteraction.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RPInteraction.framework; path = RPInteraction.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 95 | 65059BF466BDFFDF2C2BA25588268817 /* DescriptionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = DescriptionView.h; sourceTree = ""; }; 96 | 67A0E0B213448A5B4D5DA2ACD472B18E /* Pods-RPInteraction_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RPInteraction_Example-resources.sh"; sourceTree = ""; }; 97 | 770960D37BAB5576B4D1072913FF4671 /* LayerFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = LayerFactory.h; sourceTree = ""; }; 98 | 7A95F97F1629D85C42001A12B9C4AB33 /* RPInteraction.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = RPInteraction.bundle; path = "RPInteraction-RPInteraction.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 99 | 7E5283801013A2CD6F1C39349FAA78D6 /* AnimationFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AnimationFactory.h; sourceTree = ""; }; 100 | 8B13E1E3CDC7D73C2021C52B07294493 /* ConfirmView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ConfirmView.m; sourceTree = ""; }; 101 | 917B0FDDC1D3AFB45FBE730B77EF46E3 /* Pods-RPInteraction_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-RPInteraction_Example-acknowledgements.markdown"; sourceTree = ""; }; 102 | 91CA64C10FEDF903D6BBDA266834230E /* Constants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Constants.m; sourceTree = ""; }; 103 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 104 | 98E137ADC26FC65E786E05C9D5934FF8 /* ReelView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ReelView.h; sourceTree = ""; }; 105 | AE63BA9F438F223487749945DA034914 /* Constants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; 106 | B1E43A4C919B99E2C0B1CB5BFAC4B7A0 /* Pods-RPInteraction_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-RPInteraction_Example-dummy.m"; sourceTree = ""; }; 107 | B1F9D52AA8E3D8FB95DEF1EC32DF749C /* RPInteraction-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RPInteraction-prefix.pch"; sourceTree = ""; }; 108 | B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RPInteraction.xcconfig; sourceTree = ""; }; 109 | B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 110 | C9313A859DFB916BF4883C68823A7EC7 /* close@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "close@2x.png"; path = "RPInteraction/Assets/close@2x.png"; sourceTree = ""; }; 111 | CA4582C0E64000AFD1928BD8AA4830E5 /* RPInteraction-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RPInteraction-dummy.m"; sourceTree = ""; }; 112 | CB2342B09A3C0021F1DA2F7B8DFDE2DC /* Pods-RPInteraction_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-RPInteraction_Example.modulemap"; sourceTree = ""; }; 113 | D32CEB5ED66E63254AFED0108D464254 /* RPInteraction-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RPInteraction-umbrella.h"; sourceTree = ""; }; 114 | D4E639E2A727E5DF460BAAD4BD0E56E2 /* LayerFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = LayerFactory.m; sourceTree = ""; }; 115 | D50BD1646493CAA94BB5381996BB95EE /* ResourceBundle-RPInteraction-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RPInteraction-Info.plist"; sourceTree = ""; }; 116 | D5F53F8F47547C2A4836F1673B60167B /* AnimationFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = AnimationFactory.m; sourceTree = ""; }; 117 | D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 118 | DB3E0129B6492E0C7DF5AACBCC6519CC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 119 | DEC836C4C9466613F8CCB9A63ACB29DA /* UIColor+Utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIColor+Utils.h"; sourceTree = ""; }; 120 | E96A84C29D2007CF62783F5282DFF5FF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 121 | EB159D10EA8FF0A0DFC7EAE98C730527 /* RPRate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = RPRate.h; sourceTree = ""; }; 122 | EEC13DDDBDF3C155B3ADAFED563F343A /* Gradient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Gradient.m; sourceTree = ""; }; 123 | F95834D91A28F9B880E43730D1881DB2 /* Pie.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Pie.m; sourceTree = ""; }; 124 | /* End PBXFileReference section */ 125 | 126 | /* Begin PBXFrameworksBuildPhase section */ 127 | 926D51A44AAD35D0B7CFA0C405A2DA41 /* Frameworks */ = { 128 | isa = PBXFrameworksBuildPhase; 129 | buildActionMask = 2147483647; 130 | files = ( 131 | 7956FDFDDA41F5F83D652E2095C5D30F /* Foundation.framework in Frameworks */, 132 | ); 133 | runOnlyForDeploymentPostprocessing = 0; 134 | }; 135 | A00425701E7D03F374028E593165715A /* Frameworks */ = { 136 | isa = PBXFrameworksBuildPhase; 137 | buildActionMask = 2147483647; 138 | files = ( 139 | ); 140 | runOnlyForDeploymentPostprocessing = 0; 141 | }; 142 | F45BB2C1E15BC6DC3D8ED1B2F4956AAF /* Frameworks */ = { 143 | isa = PBXFrameworksBuildPhase; 144 | buildActionMask = 2147483647; 145 | files = ( 146 | 6F2A27991ED46888071A87C0A0EABF2B /* Foundation.framework in Frameworks */, 147 | 56031E96DE2018A7101F60278D37E266 /* UIKit.framework in Frameworks */, 148 | ); 149 | runOnlyForDeploymentPostprocessing = 0; 150 | }; 151 | /* End PBXFrameworksBuildPhase section */ 152 | 153 | /* Begin PBXGroup section */ 154 | 0A567BEA6D1FE7D5A88EAD024C0BAD0B /* Targets Support Files */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 97F50C2DB59E75DFD55261F2ABF69AEF /* Pods-RPInteraction_Example */, 158 | ); 159 | name = "Targets Support Files"; 160 | sourceTree = ""; 161 | }; 162 | 29C893A6AB7B3B5160707649EAA824C7 /* Factories */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 7E5283801013A2CD6F1C39349FAA78D6 /* AnimationFactory.h */, 166 | D5F53F8F47547C2A4836F1673B60167B /* AnimationFactory.m */, 167 | 770960D37BAB5576B4D1072913FF4671 /* LayerFactory.h */, 168 | D4E639E2A727E5DF460BAAD4BD0E56E2 /* LayerFactory.m */, 169 | ); 170 | name = Factories; 171 | path = RPInteraction/Classes/Factories; 172 | sourceTree = ""; 173 | }; 174 | 31C3ABBF2E129D4F5DEE4367711892B3 /* Resources */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 074930263B62DF6560AAFA5AB31A0AF1 /* close.png */, 178 | C9313A859DFB916BF4883C68823A7EC7 /* close@2x.png */, 179 | 56FE7E21AB1B8883830CEABE08A7A1DB /* close@3x.png */, 180 | ); 181 | name = Resources; 182 | sourceTree = ""; 183 | }; 184 | 37D6437999812914F1BF240406334838 /* Pod */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 2A43711C5D5EF2AD2862D3E974623331 /* LICENSE */, 188 | DB3E0129B6492E0C7DF5AACBCC6519CC /* README.md */, 189 | 3D057C4A36FED6584EB31B9A9969569F /* RPInteraction.podspec */, 190 | ); 191 | name = Pod; 192 | sourceTree = ""; 193 | }; 194 | 3AE6D4F4BA2FADF8B5806D0089504160 /* Utils */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | DEC836C4C9466613F8CCB9A63ACB29DA /* UIColor+Utils.h */, 198 | 45F8940C4AA0952C44D7042B5942B827 /* UIColor+Utils.m */, 199 | 16AEFEC8D8146F51890249A2E493FEB5 /* UIFont+Utils.h */, 200 | 499CA81D40C3AD10D904D23DF3D0574E /* UIFont+Utils.m */, 201 | ); 202 | name = Utils; 203 | path = RPInteraction/Classes/Utils; 204 | sourceTree = ""; 205 | }; 206 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { 207 | isa = PBXGroup; 208 | children = ( 209 | 438B396F6B4147076630CAEFE34282C1 /* iOS */, 210 | ); 211 | name = Frameworks; 212 | sourceTree = ""; 213 | }; 214 | 438B396F6B4147076630CAEFE34282C1 /* iOS */ = { 215 | isa = PBXGroup; 216 | children = ( 217 | D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */, 218 | B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */, 219 | ); 220 | name = iOS; 221 | sourceTree = ""; 222 | }; 223 | 52CAD5812DFB1A45CCD892F0D735FD66 /* Development Pods */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | 9C372CE4A741B1DFB9C033124739CE77 /* RPInteraction */, 227 | ); 228 | name = "Development Pods"; 229 | sourceTree = ""; 230 | }; 231 | 683F2BD2DD2D66624CB02B859A7B9D41 /* Constants */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | AE63BA9F438F223487749945DA034914 /* Constants.h */, 235 | 91CA64C10FEDF903D6BBDA266834230E /* Constants.m */, 236 | EB159D10EA8FF0A0DFC7EAE98C730527 /* RPRate.h */, 237 | ); 238 | name = Constants; 239 | path = RPInteraction/Classes/Constants; 240 | sourceTree = ""; 241 | }; 242 | 7DB346D0F39D3F0E887471402A8071AB = { 243 | isa = PBXGroup; 244 | children = ( 245 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 246 | 52CAD5812DFB1A45CCD892F0D735FD66 /* Development Pods */, 247 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, 248 | DF3EB9A0C7F8FA19036D1FCFD453E9CC /* Products */, 249 | 0A567BEA6D1FE7D5A88EAD024C0BAD0B /* Targets Support Files */, 250 | ); 251 | sourceTree = ""; 252 | }; 253 | 91B1015D25C7A84F912E23E2DF284A2D /* Views */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | 0E56CC1CF42BAE680A45C3E68B243090 /* ConfirmView.h */, 257 | 8B13E1E3CDC7D73C2021C52B07294493 /* ConfirmView.m */, 258 | 65059BF466BDFFDF2C2BA25588268817 /* DescriptionView.h */, 259 | 315E7FBCBAD8ED893EFEE1D2B855E058 /* DescriptionView.m */, 260 | 0BF1F464D4BAFAC23A8230F82EC3CF49 /* FaceView.h */, 261 | 4D297A2D057948C59CAEBA668EE1A261 /* FaceView.m */, 262 | 98E137ADC26FC65E786E05C9D5934FF8 /* ReelView.h */, 263 | 46C88A3622BD9440C59139AB4EFD90EB /* ReelView.m */, 264 | 16B5908E89E0E4C109FAE8B5B85299A7 /* ScrollView.h */, 265 | 385174096C982CEAD54DB060393C2584 /* ScrollView.m */, 266 | ); 267 | name = Views; 268 | path = RPInteraction/Classes/Views; 269 | sourceTree = ""; 270 | }; 271 | 97F50C2DB59E75DFD55261F2ABF69AEF /* Pods-RPInteraction_Example */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | E96A84C29D2007CF62783F5282DFF5FF /* Info.plist */, 275 | CB2342B09A3C0021F1DA2F7B8DFDE2DC /* Pods-RPInteraction_Example.modulemap */, 276 | 917B0FDDC1D3AFB45FBE730B77EF46E3 /* Pods-RPInteraction_Example-acknowledgements.markdown */, 277 | 203DB159CF634FE86B157DD8E19FBACB /* Pods-RPInteraction_Example-acknowledgements.plist */, 278 | B1E43A4C919B99E2C0B1CB5BFAC4B7A0 /* Pods-RPInteraction_Example-dummy.m */, 279 | 21C8F4AAFEA2D774AA135248C887F811 /* Pods-RPInteraction_Example-frameworks.sh */, 280 | 67A0E0B213448A5B4D5DA2ACD472B18E /* Pods-RPInteraction_Example-resources.sh */, 281 | 28F093929EA93EB5A394D2DADCDCD26E /* Pods-RPInteraction_Example-umbrella.h */, 282 | 4C0D2472E364EC2DBCAE9A2E53C2ADFC /* Pods-RPInteraction_Example.debug.xcconfig */, 283 | 0953D6570693ECDF1B39E5FB4F33725E /* Pods-RPInteraction_Example.release.xcconfig */, 284 | ); 285 | name = "Pods-RPInteraction_Example"; 286 | path = "Target Support Files/Pods-RPInteraction_Example"; 287 | sourceTree = ""; 288 | }; 289 | 9C372CE4A741B1DFB9C033124739CE77 /* RPInteraction */ = { 290 | isa = PBXGroup; 291 | children = ( 292 | 683F2BD2DD2D66624CB02B859A7B9D41 /* Constants */, 293 | BDE26A76AE89EA22394DD581AB51B3E6 /* Controllers */, 294 | 29C893A6AB7B3B5160707649EAA824C7 /* Factories */, 295 | EF06CB521ADBF87CEEA3A0C6111235B8 /* Models */, 296 | 37D6437999812914F1BF240406334838 /* Pod */, 297 | 31C3ABBF2E129D4F5DEE4367711892B3 /* Resources */, 298 | E0252F7479DFE4EB1CA787DD7EE2A603 /* Support Files */, 299 | 3AE6D4F4BA2FADF8B5806D0089504160 /* Utils */, 300 | 91B1015D25C7A84F912E23E2DF284A2D /* Views */, 301 | ); 302 | name = RPInteraction; 303 | path = ../..; 304 | sourceTree = ""; 305 | }; 306 | BDE26A76AE89EA22394DD581AB51B3E6 /* Controllers */ = { 307 | isa = PBXGroup; 308 | children = ( 309 | 364FBF81052FE3EBACCF3F3B417FA4D3 /* RPViewController.h */, 310 | 089A52D3284F267FCA8B4F032551A2C3 /* RPViewController.m */, 311 | ); 312 | name = Controllers; 313 | path = RPInteraction/Classes/Controllers; 314 | sourceTree = ""; 315 | }; 316 | DF3EB9A0C7F8FA19036D1FCFD453E9CC /* Products */ = { 317 | isa = PBXGroup; 318 | children = ( 319 | 19E2978AD049EDB4AFBC37150359B198 /* Pods_RPInteraction_Example.framework */, 320 | 7A95F97F1629D85C42001A12B9C4AB33 /* RPInteraction.bundle */, 321 | 62A0B6BD391CA503B21649F63AE61536 /* RPInteraction.framework */, 322 | ); 323 | name = Products; 324 | sourceTree = ""; 325 | }; 326 | E0252F7479DFE4EB1CA787DD7EE2A603 /* Support Files */ = { 327 | isa = PBXGroup; 328 | children = ( 329 | 2A87C4061E263489BC39778D4E1488C8 /* Info.plist */, 330 | D50BD1646493CAA94BB5381996BB95EE /* ResourceBundle-RPInteraction-Info.plist */, 331 | 066A51E57EAFC132BE65B2C31FE20EFC /* RPInteraction.modulemap */, 332 | B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */, 333 | CA4582C0E64000AFD1928BD8AA4830E5 /* RPInteraction-dummy.m */, 334 | B1F9D52AA8E3D8FB95DEF1EC32DF749C /* RPInteraction-prefix.pch */, 335 | D32CEB5ED66E63254AFED0108D464254 /* RPInteraction-umbrella.h */, 336 | ); 337 | name = "Support Files"; 338 | path = "Example/Pods/Target Support Files/RPInteraction"; 339 | sourceTree = ""; 340 | }; 341 | EF06CB521ADBF87CEEA3A0C6111235B8 /* Models */ = { 342 | isa = PBXGroup; 343 | children = ( 344 | 16574ABDA125BBCEADAA1EF5A78B8717 /* Gradient.h */, 345 | EEC13DDDBDF3C155B3ADAFED563F343A /* Gradient.m */, 346 | 543A8DDDF93AABD3AF9D4D2496E864FA /* Pie.h */, 347 | F95834D91A28F9B880E43730D1881DB2 /* Pie.m */, 348 | ); 349 | name = Models; 350 | path = RPInteraction/Classes/Models; 351 | sourceTree = ""; 352 | }; 353 | /* End PBXGroup section */ 354 | 355 | /* Begin PBXHeadersBuildPhase section */ 356 | 45793334A2A87AB5211E23F9976C8841 /* Headers */ = { 357 | isa = PBXHeadersBuildPhase; 358 | buildActionMask = 2147483647; 359 | files = ( 360 | 93E05773C7286F4723B4F830D6812F50 /* AnimationFactory.h in Headers */, 361 | E182B845F42A3D2A9F43B4D284635758 /* ConfirmView.h in Headers */, 362 | D4BAD379625E4A13AEC0C72F3E556E97 /* Constants.h in Headers */, 363 | 68A7EE2FFEFD20052DD530AEEF8EA2E2 /* DescriptionView.h in Headers */, 364 | 95D61BA590E448744E7CB68A041FD20E /* FaceView.h in Headers */, 365 | 950B866839C27AB5DC993A7C3DDA2125 /* Gradient.h in Headers */, 366 | 66B97505638D7BD4F9B71486D5548164 /* LayerFactory.h in Headers */, 367 | F653F1E3DE4AD8AE50A3ECF0987FDFF6 /* Pie.h in Headers */, 368 | 9766F20102D158A60EFE6FA67BDD9424 /* ReelView.h in Headers */, 369 | FF8C93B7F55E5C8E0B438C95AB34A878 /* RPInteraction-umbrella.h in Headers */, 370 | 95361D8D6E18DE81CA70A1707ED719C8 /* RPRate.h in Headers */, 371 | FBB40AAB9F0062E7505220F50CDF5A49 /* RPViewController.h in Headers */, 372 | 94915B16C7776C079B525B41ABB32D96 /* ScrollView.h in Headers */, 373 | A1B8747A7AFA7F0C6139B8874406AA0B /* UIColor+Utils.h in Headers */, 374 | AC5ABF253948A862A92AC4432FB48122 /* UIFont+Utils.h in Headers */, 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | CB9C2511D4CC8253B4E059E34D2407B8 /* Headers */ = { 379 | isa = PBXHeadersBuildPhase; 380 | buildActionMask = 2147483647; 381 | files = ( 382 | 59506F0C5CDCB6E5A83FB79E36A1C11C /* Pods-RPInteraction_Example-umbrella.h in Headers */, 383 | ); 384 | runOnlyForDeploymentPostprocessing = 0; 385 | }; 386 | /* End PBXHeadersBuildPhase section */ 387 | 388 | /* Begin PBXNativeTarget section */ 389 | 5BC2026E3B6EDD4BB6A912535152EA77 /* RPInteraction */ = { 390 | isa = PBXNativeTarget; 391 | buildConfigurationList = 4C98B5DBB25FB1E46E42A0C12813B4DA /* Build configuration list for PBXNativeTarget "RPInteraction" */; 392 | buildPhases = ( 393 | 19ACE81A55CB83BA21FB3EE3249E6BE2 /* Sources */, 394 | F45BB2C1E15BC6DC3D8ED1B2F4956AAF /* Frameworks */, 395 | 5DD1A94F13EFBF2B57C8880E2D8109E9 /* Resources */, 396 | 45793334A2A87AB5211E23F9976C8841 /* Headers */, 397 | ); 398 | buildRules = ( 399 | ); 400 | dependencies = ( 401 | 8FA892BFC2E5E91203F3824D74B7F1F2 /* PBXTargetDependency */, 402 | ); 403 | name = RPInteraction; 404 | productName = RPInteraction; 405 | productReference = 62A0B6BD391CA503B21649F63AE61536 /* RPInteraction.framework */; 406 | productType = "com.apple.product-type.framework"; 407 | }; 408 | 6F1DDF31C2711DB381A0F56036A73D5A /* Pods-RPInteraction_Example */ = { 409 | isa = PBXNativeTarget; 410 | buildConfigurationList = EB082BDF659900480D5B89DE642B1BD2 /* Build configuration list for PBXNativeTarget "Pods-RPInteraction_Example" */; 411 | buildPhases = ( 412 | 4730C8EF0ACF70244775B6B02E04105E /* Sources */, 413 | 926D51A44AAD35D0B7CFA0C405A2DA41 /* Frameworks */, 414 | CB9C2511D4CC8253B4E059E34D2407B8 /* Headers */, 415 | ); 416 | buildRules = ( 417 | ); 418 | dependencies = ( 419 | 336773E8562D1828CDF349CE1111F7B8 /* PBXTargetDependency */, 420 | ); 421 | name = "Pods-RPInteraction_Example"; 422 | productName = "Pods-RPInteraction_Example"; 423 | productReference = 19E2978AD049EDB4AFBC37150359B198 /* Pods_RPInteraction_Example.framework */; 424 | productType = "com.apple.product-type.framework"; 425 | }; 426 | 990B4698CD89C07F13A9650F2C88079C /* RPInteraction-RPInteraction */ = { 427 | isa = PBXNativeTarget; 428 | buildConfigurationList = 05A2A8A5A80DC872FF677AC4A76F9707 /* Build configuration list for PBXNativeTarget "RPInteraction-RPInteraction" */; 429 | buildPhases = ( 430 | 8FB1E59940335BEBFAC551F22B42552C /* Sources */, 431 | A00425701E7D03F374028E593165715A /* Frameworks */, 432 | 0C271AAD792C94C9396AD0E6AC40EADB /* Resources */, 433 | ); 434 | buildRules = ( 435 | ); 436 | dependencies = ( 437 | ); 438 | name = "RPInteraction-RPInteraction"; 439 | productName = "RPInteraction-RPInteraction"; 440 | productReference = 7A95F97F1629D85C42001A12B9C4AB33 /* RPInteraction.bundle */; 441 | productType = "com.apple.product-type.bundle"; 442 | }; 443 | /* End PBXNativeTarget section */ 444 | 445 | /* Begin PBXProject section */ 446 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 447 | isa = PBXProject; 448 | attributes = { 449 | LastSwiftUpdateCheck = 0930; 450 | LastUpgradeCheck = 0930; 451 | }; 452 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 453 | compatibilityVersion = "Xcode 3.2"; 454 | developmentRegion = English; 455 | hasScannedForEncodings = 0; 456 | knownRegions = ( 457 | en, 458 | ); 459 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 460 | productRefGroup = DF3EB9A0C7F8FA19036D1FCFD453E9CC /* Products */; 461 | projectDirPath = ""; 462 | projectRoot = ""; 463 | targets = ( 464 | 6F1DDF31C2711DB381A0F56036A73D5A /* Pods-RPInteraction_Example */, 465 | 5BC2026E3B6EDD4BB6A912535152EA77 /* RPInteraction */, 466 | 990B4698CD89C07F13A9650F2C88079C /* RPInteraction-RPInteraction */, 467 | ); 468 | }; 469 | /* End PBXProject section */ 470 | 471 | /* Begin PBXResourcesBuildPhase section */ 472 | 0C271AAD792C94C9396AD0E6AC40EADB /* Resources */ = { 473 | isa = PBXResourcesBuildPhase; 474 | buildActionMask = 2147483647; 475 | files = ( 476 | E0A8EE00A23DEB84E5E10D0C69C78BE0 /* close.png in Resources */, 477 | 2AE461AE103F502A4ED3CF4046EC3E15 /* close@2x.png in Resources */, 478 | FEBD86B3833A8B67F721FF3201614723 /* close@3x.png in Resources */, 479 | ); 480 | runOnlyForDeploymentPostprocessing = 0; 481 | }; 482 | 5DD1A94F13EFBF2B57C8880E2D8109E9 /* Resources */ = { 483 | isa = PBXResourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | 14465A4476228EBCF76E52C53D22B8CA /* RPInteraction.bundle in Resources */, 487 | ); 488 | runOnlyForDeploymentPostprocessing = 0; 489 | }; 490 | /* End PBXResourcesBuildPhase section */ 491 | 492 | /* Begin PBXSourcesBuildPhase section */ 493 | 19ACE81A55CB83BA21FB3EE3249E6BE2 /* Sources */ = { 494 | isa = PBXSourcesBuildPhase; 495 | buildActionMask = 2147483647; 496 | files = ( 497 | 3D929025598432FCED451E199FD0F0AF /* AnimationFactory.m in Sources */, 498 | CC31225073DA6030A22068A2874C44D1 /* ConfirmView.m in Sources */, 499 | 98DEDFD04A4C156657B70B793037F761 /* Constants.m in Sources */, 500 | C8A8D04A9BBD0FA2ECA2F5AB5D50ED65 /* DescriptionView.m in Sources */, 501 | A9DB8CC57C3EC9021069A4A396DD758A /* FaceView.m in Sources */, 502 | B441E42C28EE7F8FDC91E6EBEFBD8C8E /* Gradient.m in Sources */, 503 | E674FF4426493F9EBC924812F5626EE4 /* LayerFactory.m in Sources */, 504 | 2019BA3A90B6FC794AD4F96E6E2E3942 /* Pie.m in Sources */, 505 | 0B3CB7C8E1889C709D8039C3231AAC14 /* ReelView.m in Sources */, 506 | AECF3739EAA78770B94F3028568911F5 /* RPInteraction-dummy.m in Sources */, 507 | DA2C6221CFDE68B87A0D7A578B0D8F43 /* RPViewController.m in Sources */, 508 | B82E3FB137C0DE666914279DD0524CBA /* ScrollView.m in Sources */, 509 | 5406B8D8CAF474703CFF152F72C6B9C8 /* UIColor+Utils.m in Sources */, 510 | E37EF5D7AB8D846C4D58AF1FD13D61A2 /* UIFont+Utils.m in Sources */, 511 | ); 512 | runOnlyForDeploymentPostprocessing = 0; 513 | }; 514 | 4730C8EF0ACF70244775B6B02E04105E /* Sources */ = { 515 | isa = PBXSourcesBuildPhase; 516 | buildActionMask = 2147483647; 517 | files = ( 518 | 6B4C7BE2E8C5B02FC9BF17B72D4EB897 /* Pods-RPInteraction_Example-dummy.m in Sources */, 519 | ); 520 | runOnlyForDeploymentPostprocessing = 0; 521 | }; 522 | 8FB1E59940335BEBFAC551F22B42552C /* Sources */ = { 523 | isa = PBXSourcesBuildPhase; 524 | buildActionMask = 2147483647; 525 | files = ( 526 | ); 527 | runOnlyForDeploymentPostprocessing = 0; 528 | }; 529 | /* End PBXSourcesBuildPhase section */ 530 | 531 | /* Begin PBXTargetDependency section */ 532 | 336773E8562D1828CDF349CE1111F7B8 /* PBXTargetDependency */ = { 533 | isa = PBXTargetDependency; 534 | name = RPInteraction; 535 | target = 5BC2026E3B6EDD4BB6A912535152EA77 /* RPInteraction */; 536 | targetProxy = 38D77B3772957BE68FDF8ED96E81878A /* PBXContainerItemProxy */; 537 | }; 538 | 8FA892BFC2E5E91203F3824D74B7F1F2 /* PBXTargetDependency */ = { 539 | isa = PBXTargetDependency; 540 | name = "RPInteraction-RPInteraction"; 541 | target = 990B4698CD89C07F13A9650F2C88079C /* RPInteraction-RPInteraction */; 542 | targetProxy = 79518B55BF1D8C262C5199624ACB3710 /* PBXContainerItemProxy */; 543 | }; 544 | /* End PBXTargetDependency section */ 545 | 546 | /* Begin XCBuildConfiguration section */ 547 | 1C31A36DB2BC6A34D0DEE21F7897DBA2 /* Release */ = { 548 | isa = XCBuildConfiguration; 549 | baseConfigurationReference = B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */; 550 | buildSettings = { 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 | GCC_PREFIX_HEADER = "Target Support Files/RPInteraction/RPInteraction-prefix.pch"; 561 | INFOPLIST_FILE = "Target Support Files/RPInteraction/Info.plist"; 562 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 563 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 564 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 565 | MODULEMAP_FILE = "Target Support Files/RPInteraction/RPInteraction.modulemap"; 566 | PRODUCT_MODULE_NAME = RPInteraction; 567 | PRODUCT_NAME = RPInteraction; 568 | SDKROOT = iphoneos; 569 | SKIP_INSTALL = YES; 570 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 571 | TARGETED_DEVICE_FAMILY = "1,2"; 572 | VALIDATE_PRODUCT = YES; 573 | VERSIONING_SYSTEM = "apple-generic"; 574 | VERSION_INFO_PREFIX = ""; 575 | }; 576 | name = Release; 577 | }; 578 | 1EE19F5DD95931924296F637BF18BD8F /* Debug */ = { 579 | isa = XCBuildConfiguration; 580 | buildSettings = { 581 | ALWAYS_SEARCH_USER_PATHS = NO; 582 | CLANG_ANALYZER_NONNULL = YES; 583 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 584 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 585 | CLANG_CXX_LIBRARY = "libc++"; 586 | CLANG_ENABLE_MODULES = YES; 587 | CLANG_ENABLE_OBJC_ARC = YES; 588 | CLANG_ENABLE_OBJC_WEAK = YES; 589 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 590 | CLANG_WARN_BOOL_CONVERSION = YES; 591 | CLANG_WARN_COMMA = YES; 592 | CLANG_WARN_CONSTANT_CONVERSION = YES; 593 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 594 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 595 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 596 | CLANG_WARN_EMPTY_BODY = YES; 597 | CLANG_WARN_ENUM_CONVERSION = YES; 598 | CLANG_WARN_INFINITE_RECURSION = YES; 599 | CLANG_WARN_INT_CONVERSION = YES; 600 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 601 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 602 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 603 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 604 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 605 | CLANG_WARN_STRICT_PROTOTYPES = YES; 606 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 607 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 608 | CLANG_WARN_UNREACHABLE_CODE = YES; 609 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 610 | CODE_SIGNING_ALLOWED = NO; 611 | CODE_SIGNING_REQUIRED = NO; 612 | COPY_PHASE_STRIP = NO; 613 | DEBUG_INFORMATION_FORMAT = dwarf; 614 | ENABLE_STRICT_OBJC_MSGSEND = YES; 615 | ENABLE_TESTABILITY = YES; 616 | GCC_C_LANGUAGE_STANDARD = gnu11; 617 | GCC_DYNAMIC_NO_PIC = NO; 618 | GCC_NO_COMMON_BLOCKS = YES; 619 | GCC_OPTIMIZATION_LEVEL = 0; 620 | GCC_PREPROCESSOR_DEFINITIONS = ( 621 | "POD_CONFIGURATION_DEBUG=1", 622 | "DEBUG=1", 623 | "$(inherited)", 624 | ); 625 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 626 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 627 | GCC_WARN_UNDECLARED_SELECTOR = YES; 628 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 629 | GCC_WARN_UNUSED_FUNCTION = YES; 630 | GCC_WARN_UNUSED_VARIABLE = YES; 631 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 632 | MTL_ENABLE_DEBUG_INFO = YES; 633 | ONLY_ACTIVE_ARCH = YES; 634 | PRODUCT_NAME = "$(TARGET_NAME)"; 635 | STRIP_INSTALLED_PRODUCT = NO; 636 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 637 | SYMROOT = "${SRCROOT}/../build"; 638 | }; 639 | name = Debug; 640 | }; 641 | 329B77E74170FDBAC93CDBAD460EDAB4 /* Debug */ = { 642 | isa = XCBuildConfiguration; 643 | baseConfigurationReference = B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */; 644 | buildSettings = { 645 | CODE_SIGN_IDENTITY = ""; 646 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 647 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 648 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 649 | CURRENT_PROJECT_VERSION = 1; 650 | DEFINES_MODULE = YES; 651 | DYLIB_COMPATIBILITY_VERSION = 1; 652 | DYLIB_CURRENT_VERSION = 1; 653 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 654 | GCC_PREFIX_HEADER = "Target Support Files/RPInteraction/RPInteraction-prefix.pch"; 655 | INFOPLIST_FILE = "Target Support Files/RPInteraction/Info.plist"; 656 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 657 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 658 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 659 | MODULEMAP_FILE = "Target Support Files/RPInteraction/RPInteraction.modulemap"; 660 | PRODUCT_MODULE_NAME = RPInteraction; 661 | PRODUCT_NAME = RPInteraction; 662 | SDKROOT = iphoneos; 663 | SKIP_INSTALL = YES; 664 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 665 | TARGETED_DEVICE_FAMILY = "1,2"; 666 | VERSIONING_SYSTEM = "apple-generic"; 667 | VERSION_INFO_PREFIX = ""; 668 | }; 669 | name = Debug; 670 | }; 671 | 4EBCF4BD6C4604A12AC005B75F37936B /* Debug */ = { 672 | isa = XCBuildConfiguration; 673 | baseConfigurationReference = B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */; 674 | buildSettings = { 675 | CODE_SIGN_IDENTITY = "iPhone Developer"; 676 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RPInteraction"; 677 | INFOPLIST_FILE = "Target Support Files/RPInteraction/ResourceBundle-RPInteraction-Info.plist"; 678 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 679 | PRODUCT_NAME = RPInteraction; 680 | SDKROOT = iphoneos; 681 | SKIP_INSTALL = YES; 682 | TARGETED_DEVICE_FAMILY = "1,2"; 683 | WRAPPER_EXTENSION = bundle; 684 | }; 685 | name = Debug; 686 | }; 687 | 7584FEE4681403CE24D522EA59230E8F /* Release */ = { 688 | isa = XCBuildConfiguration; 689 | baseConfigurationReference = B404E933BD65D1D59DB4A9DF8925C5EC /* RPInteraction.xcconfig */; 690 | buildSettings = { 691 | CODE_SIGN_IDENTITY = "iPhone Developer"; 692 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RPInteraction"; 693 | INFOPLIST_FILE = "Target Support Files/RPInteraction/ResourceBundle-RPInteraction-Info.plist"; 694 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 695 | PRODUCT_NAME = RPInteraction; 696 | SDKROOT = iphoneos; 697 | SKIP_INSTALL = YES; 698 | TARGETED_DEVICE_FAMILY = "1,2"; 699 | WRAPPER_EXTENSION = bundle; 700 | }; 701 | name = Release; 702 | }; 703 | 7AC285A3D3FEAD47A9C540CF4A9320B1 /* Debug */ = { 704 | isa = XCBuildConfiguration; 705 | baseConfigurationReference = 4C0D2472E364EC2DBCAE9A2E53C2ADFC /* Pods-RPInteraction_Example.debug.xcconfig */; 706 | buildSettings = { 707 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 708 | CODE_SIGN_IDENTITY = ""; 709 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 710 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 711 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 712 | CURRENT_PROJECT_VERSION = 1; 713 | DEFINES_MODULE = YES; 714 | DYLIB_COMPATIBILITY_VERSION = 1; 715 | DYLIB_CURRENT_VERSION = 1; 716 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 717 | INFOPLIST_FILE = "Target Support Files/Pods-RPInteraction_Example/Info.plist"; 718 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 719 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 720 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 721 | MACH_O_TYPE = staticlib; 722 | MODULEMAP_FILE = "Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.modulemap"; 723 | OTHER_LDFLAGS = ""; 724 | OTHER_LIBTOOLFLAGS = ""; 725 | PODS_ROOT = "$(SRCROOT)"; 726 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 727 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 728 | SDKROOT = iphoneos; 729 | SKIP_INSTALL = YES; 730 | TARGETED_DEVICE_FAMILY = "1,2"; 731 | VERSIONING_SYSTEM = "apple-generic"; 732 | VERSION_INFO_PREFIX = ""; 733 | }; 734 | name = Debug; 735 | }; 736 | 9F0A6CDB6DD0B648FF9AAEF47D60EA22 /* Release */ = { 737 | isa = XCBuildConfiguration; 738 | baseConfigurationReference = 0953D6570693ECDF1B39E5FB4F33725E /* Pods-RPInteraction_Example.release.xcconfig */; 739 | buildSettings = { 740 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 741 | CODE_SIGN_IDENTITY = ""; 742 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 743 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 744 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 745 | CURRENT_PROJECT_VERSION = 1; 746 | DEFINES_MODULE = YES; 747 | DYLIB_COMPATIBILITY_VERSION = 1; 748 | DYLIB_CURRENT_VERSION = 1; 749 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 750 | INFOPLIST_FILE = "Target Support Files/Pods-RPInteraction_Example/Info.plist"; 751 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 752 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 753 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 754 | MACH_O_TYPE = staticlib; 755 | MODULEMAP_FILE = "Target Support Files/Pods-RPInteraction_Example/Pods-RPInteraction_Example.modulemap"; 756 | OTHER_LDFLAGS = ""; 757 | OTHER_LIBTOOLFLAGS = ""; 758 | PODS_ROOT = "$(SRCROOT)"; 759 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 760 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 761 | SDKROOT = iphoneos; 762 | SKIP_INSTALL = YES; 763 | TARGETED_DEVICE_FAMILY = "1,2"; 764 | VALIDATE_PRODUCT = YES; 765 | VERSIONING_SYSTEM = "apple-generic"; 766 | VERSION_INFO_PREFIX = ""; 767 | }; 768 | name = Release; 769 | }; 770 | F4568DEE257655D290C2B9CEAB37C934 /* Release */ = { 771 | isa = XCBuildConfiguration; 772 | buildSettings = { 773 | ALWAYS_SEARCH_USER_PATHS = NO; 774 | CLANG_ANALYZER_NONNULL = YES; 775 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 776 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 777 | CLANG_CXX_LIBRARY = "libc++"; 778 | CLANG_ENABLE_MODULES = YES; 779 | CLANG_ENABLE_OBJC_ARC = YES; 780 | CLANG_ENABLE_OBJC_WEAK = YES; 781 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 782 | CLANG_WARN_BOOL_CONVERSION = YES; 783 | CLANG_WARN_COMMA = YES; 784 | CLANG_WARN_CONSTANT_CONVERSION = YES; 785 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 786 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 787 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 788 | CLANG_WARN_EMPTY_BODY = YES; 789 | CLANG_WARN_ENUM_CONVERSION = YES; 790 | CLANG_WARN_INFINITE_RECURSION = YES; 791 | CLANG_WARN_INT_CONVERSION = YES; 792 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 793 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 794 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 795 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 796 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 797 | CLANG_WARN_STRICT_PROTOTYPES = YES; 798 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 799 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 800 | CLANG_WARN_UNREACHABLE_CODE = YES; 801 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 802 | CODE_SIGNING_ALLOWED = NO; 803 | CODE_SIGNING_REQUIRED = NO; 804 | COPY_PHASE_STRIP = NO; 805 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 806 | ENABLE_NS_ASSERTIONS = NO; 807 | ENABLE_STRICT_OBJC_MSGSEND = YES; 808 | GCC_C_LANGUAGE_STANDARD = gnu11; 809 | GCC_NO_COMMON_BLOCKS = YES; 810 | GCC_PREPROCESSOR_DEFINITIONS = ( 811 | "POD_CONFIGURATION_RELEASE=1", 812 | "$(inherited)", 813 | ); 814 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 815 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 816 | GCC_WARN_UNDECLARED_SELECTOR = YES; 817 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 818 | GCC_WARN_UNUSED_FUNCTION = YES; 819 | GCC_WARN_UNUSED_VARIABLE = YES; 820 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 821 | MTL_ENABLE_DEBUG_INFO = NO; 822 | PRODUCT_NAME = "$(TARGET_NAME)"; 823 | STRIP_INSTALLED_PRODUCT = NO; 824 | SYMROOT = "${SRCROOT}/../build"; 825 | }; 826 | name = Release; 827 | }; 828 | /* End XCBuildConfiguration section */ 829 | 830 | /* Begin XCConfigurationList section */ 831 | 05A2A8A5A80DC872FF677AC4A76F9707 /* Build configuration list for PBXNativeTarget "RPInteraction-RPInteraction" */ = { 832 | isa = XCConfigurationList; 833 | buildConfigurations = ( 834 | 4EBCF4BD6C4604A12AC005B75F37936B /* Debug */, 835 | 7584FEE4681403CE24D522EA59230E8F /* Release */, 836 | ); 837 | defaultConfigurationIsVisible = 0; 838 | defaultConfigurationName = Release; 839 | }; 840 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 841 | isa = XCConfigurationList; 842 | buildConfigurations = ( 843 | 1EE19F5DD95931924296F637BF18BD8F /* Debug */, 844 | F4568DEE257655D290C2B9CEAB37C934 /* Release */, 845 | ); 846 | defaultConfigurationIsVisible = 0; 847 | defaultConfigurationName = Release; 848 | }; 849 | 4C98B5DBB25FB1E46E42A0C12813B4DA /* Build configuration list for PBXNativeTarget "RPInteraction" */ = { 850 | isa = XCConfigurationList; 851 | buildConfigurations = ( 852 | 329B77E74170FDBAC93CDBAD460EDAB4 /* Debug */, 853 | 1C31A36DB2BC6A34D0DEE21F7897DBA2 /* Release */, 854 | ); 855 | defaultConfigurationIsVisible = 0; 856 | defaultConfigurationName = Release; 857 | }; 858 | EB082BDF659900480D5B89DE642B1BD2 /* Build configuration list for PBXNativeTarget "Pods-RPInteraction_Example" */ = { 859 | isa = XCConfigurationList; 860 | buildConfigurations = ( 861 | 7AC285A3D3FEAD47A9C540CF4A9320B1 /* Debug */, 862 | 9F0A6CDB6DD0B648FF9AAEF47D60EA22 /* Release */, 863 | ); 864 | defaultConfigurationIsVisible = 0; 865 | defaultConfigurationName = Release; 866 | }; 867 | /* End XCConfigurationList section */ 868 | }; 869 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 870 | } 871 | --------------------------------------------------------------------------------