diff --git a/.travis.yml b/.travis.yml index e2a125f..87449bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -osx_image: xcode611 +osx_image: xcode6.4 language: objective-c before_install: gem install cocoapods xcpretty obcd slather -N podfile: Example/Podfile diff --git a/Example/Docs/jazzhands-demo.gif b/Example/Docs/jazzhands-demo.gif new file mode 100644 index 0000000..89d12bc Binary files /dev/null and b/Example/Docs/jazzhands-demo.gif differ diff --git a/Example/Docs/jazzhands_banner.jpg b/Example/Docs/jazzhands_banner.jpg new file mode 100644 index 0000000..d0e5410 Binary files /dev/null and b/Example/Docs/jazzhands_banner.jpg differ diff --git a/Example/JazzHandsDemo.xcodeproj/project.pbxproj b/Example/JazzHandsDemo.xcodeproj/project.pbxproj index b4c9611..76313d4 100644 --- a/Example/JazzHandsDemo.xcodeproj/project.pbxproj +++ b/Example/JazzHandsDemo.xcodeproj/project.pbxproj @@ -21,8 +21,10 @@ 445B9E227A691EC342AEEDE2 /* libPods-JazzHandsDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BB1EAF4CD1F4A61D2DBBB695 /* libPods-JazzHandsDemo.a */; }; 8A7331363E195DEE4B479A7E /* libPods-JazzHandsTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C9147A8A9689CEBCB4A91E3C /* libPods-JazzHandsTests.a */; }; E973270D1A58922500AD6E55 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E97327091A58922500AD6E55 /* InfoPlist.strings */; }; + FA486DBA1B3C92EB003A14B5 /* IFTTTCircleView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA486DB91B3C92EB003A14B5 /* IFTTTCircleView.m */; }; + FA486DBC1B3CBA54003A14B5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FA486DBB1B3CBA54003A14B5 /* LaunchScreen.storyboard */; }; + FA486DBE1B3CBA7C003A14B5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FA486DBD1B3CBA7C003A14B5 /* Main.storyboard */; }; FA5899DE1B3370CC008663B0 /* IFTTTFilmstripSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5899DD1B3370CC008663B0 /* IFTTTFilmstripSpec.m */; }; - FA5899E11B3372C5008663B0 /* MyCustomAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5899E01B3372C5008663B0 /* MyCustomAnimation.m */; }; FA5899E31B338313008663B0 /* IFTTTEasingFunctionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5899E21B338313008663B0 /* IFTTTEasingFunctionSpec.m */; }; FA5899E51B338612008663B0 /* IFTTTAnimationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5899E41B338612008663B0 /* IFTTTAnimationSpec.m */; }; FA5899E71B3391C7008663B0 /* IFTTTInterpolatableSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5899E61B3391C7008663B0 /* IFTTTInterpolatableSpec.m */; }; @@ -64,9 +66,12 @@ E973270A1A58922500AD6E55 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; E973270B1A58922500AD6E55 /* JazzHandsTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "JazzHandsTests-Info.plist"; sourceTree = ""; }; F06E890A963B4A1A460670D4 /* Pods-JazzHandsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig"; sourceTree = ""; }; + FA486DB81B3C92EB003A14B5 /* IFTTTCircleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFTTTCircleView.h; sourceTree = ""; }; + FA486DB91B3C92EB003A14B5 /* IFTTTCircleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFTTTCircleView.m; sourceTree = ""; }; + FA486DBB1B3CBA54003A14B5 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + FA486DBD1B3CBA7C003A14B5 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + FA486DF11B3CE2DB003A14B5 /* JazzHandsDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = JazzHandsDemo.entitlements; sourceTree = ""; }; FA5899DD1B3370CC008663B0 /* IFTTTFilmstripSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFTTTFilmstripSpec.m; sourceTree = ""; }; - FA5899DF1B3372C5008663B0 /* MyCustomAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyCustomAnimation.h; sourceTree = ""; }; - FA5899E01B3372C5008663B0 /* MyCustomAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyCustomAnimation.m; sourceTree = ""; }; FA5899E21B338313008663B0 /* IFTTTEasingFunctionSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFTTTEasingFunctionSpec.m; sourceTree = ""; }; FA5899E41B338612008663B0 /* IFTTTAnimationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimationSpec.m; sourceTree = ""; }; FA5899E61B3391C7008663B0 /* IFTTTInterpolatableSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFTTTInterpolatableSpec.m; sourceTree = ""; }; @@ -134,12 +139,13 @@ 03063ED417F5FAAD007D7A97 /* JazzHandsDemo */ = { isa = PBXGroup; children = ( + FA486DF11B3CE2DB003A14B5 /* JazzHandsDemo.entitlements */, 03063F1B17F5FC61007D7A97 /* IFTTTJazzHandsViewController.h */, 03063F1D17F5FC61007D7A97 /* IFTTTJazzHandsViewController.m */, 03063EDD17F5FAAD007D7A97 /* IFTTTJazzHandsAppDelegate.h */, 03063EDE17F5FAAD007D7A97 /* IFTTTJazzHandsAppDelegate.m */, - FA5899DF1B3372C5008663B0 /* MyCustomAnimation.h */, - FA5899E01B3372C5008663B0 /* MyCustomAnimation.m */, + FA486DB81B3C92EB003A14B5 /* IFTTTCircleView.h */, + FA486DB91B3C92EB003A14B5 /* IFTTTCircleView.m */, 03063EE017F5FAAD007D7A97 /* Images.xcassets */, 03063ED517F5FAAD007D7A97 /* Supporting Files */, ); @@ -153,6 +159,8 @@ 03063ED717F5FAAD007D7A97 /* InfoPlist.strings */, 03063EDA17F5FAAD007D7A97 /* main.m */, 03063EDC17F5FAAD007D7A97 /* JazzHandsDemo-Prefix.pch */, + FA486DBB1B3CBA54003A14B5 /* LaunchScreen.storyboard */, + FA486DBD1B3CBA7C003A14B5 /* Main.storyboard */, ); name = "Supporting Files"; sourceTree = ""; @@ -235,6 +243,14 @@ LastUpgradeCheck = 0510; ORGANIZATIONNAME = "IFTTT Inc"; TargetAttributes = { + 03063ECA17F5FAAD007D7A97 = { + DevelopmentTeam = C7G23YU5BK; + SystemCapabilities = { + com.apple.iCloud = { + enabled = 0; + }; + }; + }; 03063EE517F5FAAD007D7A97 = { TestTargetID = 03063ECA17F5FAAD007D7A97; }; @@ -263,8 +279,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + FA486DBC1B3CBA54003A14B5 /* LaunchScreen.storyboard in Resources */, 03063ED917F5FAAD007D7A97 /* InfoPlist.strings in Resources */, 03063EE117F5FAAD007D7A97 /* Images.xcassets in Resources */, + FA486DBE1B3CBA7C003A14B5 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -346,10 +364,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + FA486DBA1B3C92EB003A14B5 /* IFTTTCircleView.m in Sources */, 03063EDF17F5FAAD007D7A97 /* IFTTTJazzHandsAppDelegate.m in Sources */, 03063F1F17F5FC61007D7A97 /* IFTTTJazzHandsViewController.m in Sources */, 03063EDB17F5FAAD007D7A97 /* main.m in Sources */, - FA5899E11B3372C5008663B0 /* MyCustomAnimation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -471,7 +489,6 @@ baseConfigurationReference = 45B9FCE6E3104AA817948180 /* Pods-JazzHandsDemo.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; @@ -485,6 +502,8 @@ CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JazzHandsDemo/JazzHandsDemo-Prefix.pch"; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; @@ -505,6 +524,7 @@ INFOPLIST_FILE = "JazzHandsDemo/JazzHandsDemo-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; RUN_CLANG_STATIC_ANALYZER = YES; TARGETED_DEVICE_FAMILY = "1,2"; WARNING_CFLAGS = ( @@ -522,7 +542,6 @@ baseConfigurationReference = 7CFD5D71B92DB9D0FBF83A2E /* Pods-JazzHandsDemo.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; @@ -536,6 +555,8 @@ CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JazzHandsDemo/JazzHandsDemo-Prefix.pch"; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; @@ -556,6 +577,7 @@ INFOPLIST_FILE = "JazzHandsDemo/JazzHandsDemo-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; RUN_CLANG_STATIC_ANALYZER = YES; TARGETED_DEVICE_FAMILY = "1,2"; WARNING_CFLAGS = ( diff --git a/Example/JazzHandsDemo.xcworkspace/xcshareddata/JazzHandsDemo.xccheckout b/Example/JazzHandsDemo.xcworkspace/xcshareddata/JazzHandsDemo.xccheckout index 9ab83ab..8026bad 100644 --- a/Example/JazzHandsDemo.xcworkspace/xcshareddata/JazzHandsDemo.xccheckout +++ b/Example/JazzHandsDemo.xcworkspace/xcshareddata/JazzHandsDemo.xccheckout @@ -5,7 +5,7 @@ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier - 821C5AA7-4AB8-487B-96EA-F11FB77B9C97 + 100E20E1-EC30-43F7-8887-A6D2A8FF2E1E IDESourceControlProjectName JazzHandsDemo IDESourceControlProjectOriginsDictionary diff --git a/Example/JazzHandsDemo/IFTTTCircleView.h b/Example/JazzHandsDemo/IFTTTCircleView.h new file mode 100644 index 0000000..d4c8a3d --- /dev/null +++ b/Example/JazzHandsDemo/IFTTTCircleView.h @@ -0,0 +1,13 @@ +// +// IFTTTCircleView.h +// JazzHandsDemo +// +// Created by Laura Skelton on 6/25/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import + +@interface IFTTTCircleView : UIView + +@end diff --git a/Example/JazzHandsDemo/IFTTTCircleView.m b/Example/JazzHandsDemo/IFTTTCircleView.m new file mode 100644 index 0000000..8f1128e --- /dev/null +++ b/Example/JazzHandsDemo/IFTTTCircleView.m @@ -0,0 +1,35 @@ +// +// IFTTTCircleView.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/25/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTCircleView.h" + +@interface IFTTTCircleView () + +@property (nonatomic, strong) CAShapeLayer *maskLayer; + +@end + +@implementation IFTTTCircleView + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + if (!self.maskLayer) { + self.maskLayer = [CAShapeLayer layer]; + self.layer.mask = self.maskLayer; + } + + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:CGRectGetWidth(self.bounds) / 2.f]; + self.maskLayer.path = path.CGPath; + + self.layer.cornerRadius = CGRectGetWidth(self.layer.bounds) / 2.f; +} + + +@end diff --git a/Example/JazzHandsDemo/IFTTTJazzHandsAppDelegate.m b/Example/JazzHandsDemo/IFTTTJazzHandsAppDelegate.m index 9c447cc..1d2774a 100644 --- a/Example/JazzHandsDemo/IFTTTJazzHandsAppDelegate.m +++ b/Example/JazzHandsDemo/IFTTTJazzHandsAppDelegate.m @@ -14,12 +14,6 @@ @implementation IFTTTJazzHandsAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - self.window.rootViewController = [IFTTTJazzHandsViewController new]; - self.window.backgroundColor = [UIColor whiteColor]; - - [self.window makeKeyAndVisible]; - return YES; } diff --git a/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m b/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m index 5657041..30e16c2 100644 --- a/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m +++ b/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m @@ -7,244 +7,522 @@ // #import "IFTTTJazzHandsViewController.h" -#import "MyCustomAnimation.h" +#import +#import "IFTTTCircleView.h" @interface IFTTTJazzHandsViewController () -@property (nonatomic, strong) UIImageView *wordmark; -@property (nonatomic, strong) UIImageView *unicorn; -@property (nonatomic, strong) UILabel *firstLabel; -@property (nonatomic, strong) UILabel *secondLabel; -@property (nonatomic, strong) UILabel *thirdLabel; -@property (nonatomic, strong) UILabel *fourthLabel; +@property (nonatomic, strong) IFTTTCircleView *circle; +@property (nonatomic, strong) UIImageView *iftttPresents; +@property (nonatomic, strong) UIImageView *jazz; +@property (nonatomic, strong) UIImageView *hands; +@property (nonatomic, strong) UIImageView *blueStick; +@property (nonatomic, strong) UIImageView *orangeStick; + +@property (nonatomic, strong) UIImageView *musicStand; +@property (nonatomic, strong) UIImageView *musicNotes; +@property (nonatomic, strong) UIImageView *plane; +@property (nonatomic, strong) CAShapeLayer *planePathLayer; +@property (nonatomic, strong) UIView *planePathView; + +@property (nonatomic, strong) UIImageView *bigCloud; +@property (nonatomic, strong) UIImageView *littleCloud; +@property (nonatomic, strong) UIImageView *sun; +@property (nonatomic, strong) UIImageView *iftttCloud; + +@property (nonatomic, strong) UIImageView *page2Text; +@property (nonatomic, strong) UIImageView *page3Text; + +@property (nonatomic, strong) IFTTTPathPositionAnimation *airplaneFlyingAnimation; @end @implementation IFTTTJazzHandsViewController -- (instancetype)init +- (NSUInteger)numberOfPages { - if ((self = [super init])) { - self.numberOfPages = 4; - } - - return self; + // Tell the scroll view how many pages it should have + return 4; } -- (instancetype)initWithCoder:(NSCoder *)aDecoder +- (void)viewDidLoad { - if ((self = [super initWithCoder:aDecoder])) { - self.numberOfPages = 4; - } + [super viewDidLoad]; + [[UIApplication sharedApplication] setStatusBarHidden:YES]; + self.view.backgroundColor = [UIColor whiteColor]; - return self; + [self configureViews]; + [self configureAnimations]; } -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +- (void)viewWillAppear:(BOOL)animated { - if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { - self.numberOfPages = 4; - } - - return self; + [super viewWillAppear:animated]; + [self scaleAirplanePathToSize:self.scrollView.frame.size]; } -- (void)viewDidLoad +#pragma mark - iOS8+ Resizing + +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { - [super viewDidLoad]; - self.scrollView.accessibilityLabel = @"JazzHands"; - self.scrollView.accessibilityIdentifier = @"JazzHands"; + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - self.view.backgroundColor = [UIColor whiteColor]; + [coordinator animateAlongsideTransition:^(id context) { + [self scaleAirplanePathToSize:size]; + } completion:nil]; +} + +#pragma mark - iOS7 Orientation Change Resizing + +- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration +{ + CGSize newPageSize; - [self configureViews]; - [self configureAnimations]; + if ((UIInterfaceOrientationIsLandscape(self.interfaceOrientation) + && UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) + || (UIInterfaceOrientationIsPortrait(self.interfaceOrientation) + && UIInterfaceOrientationIsLandscape(toInterfaceOrientation))) { + + newPageSize = CGSizeMake(CGRectGetHeight(self.scrollView.frame), CGRectGetWidth(self.scrollView.frame)); + } else { + newPageSize = CGSizeMake(CGRectGetWidth(self.scrollView.frame), CGRectGetHeight(self.scrollView.frame)); + } + + [UIView animateWithDuration:duration animations:^{ + [self scaleAirplanePathToSize:newPageSize]; + } completion:nil]; } +#pragma mark - Configure Views and Animations + - (void)configureViews { - self.unicorn = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Unicorn"]]; - [self.contentView addSubview:self.unicorn]; - - self.wordmark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IFTTT"]]; - [self.contentView addSubview:self.wordmark]; + self.circle = [IFTTTCircleView new]; + [self.contentView addSubview:self.circle]; + + self.iftttPresents = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IFTTTPresents"]]; + [self.contentView addSubview:self.iftttPresents]; + + self.blueStick = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"BlueStick"]]; + [self.contentView addSubview:self.blueStick]; + + self.orangeStick = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"OrangeStick"]]; + [self.contentView addSubview:self.orangeStick]; + + self.jazz = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jazz"]]; + [self.contentView addSubview:self.jazz]; + + self.hands = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Hands"]]; + [self.contentView addSubview:self.hands]; + + self.planePathView = [UIView new]; + [self.contentView addSubview:self.planePathView]; - self.firstLabel = [UILabel new]; - self.firstLabel.text = @"Introducing Jazz Hands"; - [self.firstLabel sizeToFit]; - [self.contentView addSubview:self.firstLabel]; + self.plane = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Plane"]]; - self.secondLabel = [UILabel new]; - self.secondLabel.text = @"Brought to you by IFTTT"; - [self.secondLabel sizeToFit]; - [self.contentView addSubview:self.secondLabel]; + self.musicStand = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MusicStand"]]; + [self.contentView addSubview:self.musicStand]; - self.thirdLabel = [UILabel new]; - self.thirdLabel.text = @"Simple keyframe animations"; - [self.thirdLabel sizeToFit]; - [self.contentView addSubview:self.thirdLabel]; + self.musicNotes = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MusicNotes"]]; + [self.contentView addSubview:self.musicNotes]; - self.fourthLabel = [UILabel new]; - self.fourthLabel.text = @"Optimized for scrolling intros"; - [self.fourthLabel sizeToFit]; - [self.contentView addSubview:self.fourthLabel]; + self.sun = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Sun"]]; + [self.contentView addSubview:self.sun]; + + self.bigCloud = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"BigCloud"]]; + [self.contentView addSubview:self.bigCloud]; + + self.littleCloud = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LittleCloud"]]; + [self.contentView addSubview:self.littleCloud]; + + self.iftttCloud = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IFTTTCloud"]]; + [self.contentView addSubview:self.iftttCloud]; + + self.page2Text = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Page2Text"]]; + [self.contentView addSubview:self.page2Text]; + + self.page3Text = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Page3Text"]]; + [self.contentView addSubview:self.page3Text]; } - (void)configureAnimations { [self configureScrollViewAnimations]; - [self configureUnicornAnimations]; - [self configureWordmarkAnimations]; - [self configureLabelAnimations]; + [self configureIFTTTPresentsAnimations]; + [self configureCircleAnimations]; + [self configureJazzHandsLabelAnimations]; + [self configureStickAnimations]; + [self configureMusicStandAnimations]; + [self configureAirplaneAnimations]; + [self configureCloudAnimations]; + [self configureSunAnimations]; + [self configurePageTextAnimations]; [self animateCurrentFrame]; } - (void)configureScrollViewAnimations { - // change the scrollView's background color for each page - IFTTTColorAnimation *backgroundColorAnimation = [IFTTTColorAnimation animationWithView:self.scrollView]; - [backgroundColorAnimation addKeyframeForTime:0 color:[[UIColor blueColor] colorWithAlphaComponent:0.4f]]; - [backgroundColorAnimation addKeyframeForTime:1 color:[[UIColor cyanColor] colorWithAlphaComponent:0.4f]]; - [backgroundColorAnimation addKeyframeForTime:2 color:[[UIColor greenColor] colorWithAlphaComponent:0.4f]]; - [backgroundColorAnimation addKeyframeForTime:3 color:[[UIColor yellowColor] colorWithAlphaComponent:0.4f]]; + // change the scrollView's background color from dark gray to blue just after page 1 + IFTTTBackgroundColorAnimation *backgroundColorAnimation = [IFTTTBackgroundColorAnimation animationWithView:self.scrollView]; + [backgroundColorAnimation addKeyframeForTime:1 color:[UIColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.f]]; + [backgroundColorAnimation addKeyframeForTime:1.1 color:[UIColor colorWithRed:0.14f green:0.8f blue:1.f alpha:1.f]]; [self.animator addAnimation:backgroundColorAnimation]; } -- (void)configureUnicornAnimations -{ - // now, we animate the unicorn - // keep the unicorn centered when we're on pages 1 and 2. - // It will slide from the right between pages 0 and 1, and slide out to the left between pages 2 and 3. - [self keepView:self.unicorn onPages:@[ @(1), @(2) ]]; - - NSLayoutConstraint *unicornCenterYConstraint = [NSLayoutConstraint constraintWithItem:self.unicorn - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.contentView - attribute:NSLayoutAttributeCenterY - multiplier:1.f constant:0.f]; - [self.contentView addConstraint:unicornCenterYConstraint]; - - // Move the unicorn from a bit higher than center on page 1 to a bit lower on page 2, by an amount relative to the height of the view. - IFTTTConstraintMultiplierAnimation *unicornCenterYAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView - constraint:unicornCenterYConstraint - attribute:IFTTTLayoutAttributeHeight - referenceView:self.contentView]; - [unicornCenterYAnimation addKeyframeForTime:1 multiplier:-0.1f withEasingFunction:IFTTTEasingFunctionEaseOutQuad]; - [unicornCenterYAnimation addKeyframeForTime:2 multiplier:0.2f]; - [self.animator addAnimation:unicornCenterYAnimation]; - - // Scale down the unicorn by 75% between pages 1 and 2 - IFTTTScaleAnimation *unicornScaleAnimation = [IFTTTScaleAnimation animationWithView:self.unicorn]; - [unicornScaleAnimation addKeyframeForTime:1 scale:1.f]; - [unicornScaleAnimation addKeyframeForTime:2 scale:0.75f]; - [self.animator addAnimation:unicornScaleAnimation]; - - // fade the unicorn in on page 1 and out on page 3 - IFTTTAlphaAnimation *unicornAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.unicorn]; - [unicornAlphaAnimation addKeyframeForTime:0 alpha:0.f]; - [unicornAlphaAnimation addKeyframeForTime:1 alpha:1.f]; - [unicornAlphaAnimation addKeyframeForTime:2 alpha:1.f]; - [unicornAlphaAnimation addKeyframeForTime:3 alpha:0.f]; - [self.animator addAnimation:unicornAlphaAnimation]; -} - -- (void)configureWordmarkAnimations -{ - // let's animate the wordmark - // keep the wordmark centered on pages 1 and 2, slide it in fast from the right between page 0 and 1, and slide it out fast to the left between pages 2 and 3. - [self keepView:self.wordmark - onPages:@[ @(2), @(1), @(2), @(1) ] - atTimes:@[ @(0), @(1), @(2), @(3) ]]; - - // keep the wordmark vertically centered on top of the unicorn - [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.wordmark - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.unicorn - attribute:NSLayoutAttributeCenterY - multiplier:1.f constant:0.f]]; - - // Rotate the wordmark a full circle from page 1 to 2 - IFTTTRotationAnimation *wordmarkRotationAnimation = [IFTTTRotationAnimation animationWithView:self.wordmark]; - [wordmarkRotationAnimation addKeyframeForTime:1 rotation:0.f]; - [wordmarkRotationAnimation addKeyframeForTime:2 rotation:360.f]; - [self.animator addAnimation:wordmarkRotationAnimation]; - - // Scale down the wordmark by 75% between pages 1 and 2 - IFTTTScaleAnimation *wordmarkScaleAnimation = [IFTTTScaleAnimation animationWithView:self.wordmark]; - [wordmarkScaleAnimation addKeyframeForTime:1 scale:1.f]; - [wordmarkScaleAnimation addKeyframeForTime:2 scale:0.75f]; - [self.animator addAnimation:wordmarkScaleAnimation]; -} - -- (void)configureLabelAnimations -{ - // lay out labels' vertical positions - [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.firstLabel - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.contentView - attribute:NSLayoutAttributeCenterY - multiplier:1.f constant:0.f]]; - [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.secondLabel - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.contentView - attribute:NSLayoutAttributeCenterY - multiplier:1.5f constant:0.f]]; - [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.thirdLabel - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.contentView - attribute:NSLayoutAttributeCenterY - multiplier:0.5f constant:0.f]]; - [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.fourthLabel - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self.contentView - attribute:NSLayoutAttributeCenterY - multiplier:1.f constant:0.f]]; - - // lay out the labels' horizontal positions (centered on each page) - [self keepView:self.firstLabel onPage:0]; - [self keepView:self.secondLabel onPage:1]; - [self keepView:self.thirdLabel onPage:2]; - [self keepView:self.fourthLabel onPage:3]; - - // apply a 3D zoom animation to the first label - IFTTTTransform3DAnimation * labelTransform = [IFTTTTransform3DAnimation animationWithView:self.firstLabel]; - IFTTTTransform3D *tt1 = [IFTTTTransform3D transformWithM34:0.03f]; - IFTTTTransform3D *tt2 = [IFTTTTransform3D transformWithM34:0.3f]; - tt2.rotate = (IFTTTTransform3DRotate){ -(CGFloat)(M_PI), 1, 0, 0 }; - tt2.translate = (IFTTTTransform3DTranslate){ 0, 0, 50 }; - tt2.scale = (IFTTTTransform3DScale){ 1.f, 2.f, 1.f }; - [labelTransform addKeyframeForTime:0 transform:tt1]; - [labelTransform addKeyframeForTime:0.5f transform:tt2]; - [self.animator addAnimation:labelTransform]; - - // fade out the first label - IFTTTAlphaAnimation *firstLabelAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.firstLabel]; - [firstLabelAlphaAnimation addKeyframeForTime:0 alpha:1.f]; - [firstLabelAlphaAnimation addKeyframeForTime:0.35f alpha:0.f]; - [self.animator addAnimation:firstLabelAlphaAnimation]; - - // custom animate the third label - MyCustomAnimation *thirdLabelAnimation = [MyCustomAnimation animationWithView:self.thirdLabel]; - [thirdLabelAnimation addKeyframeForTime:1.5f shadowOpacity:0.f]; - [thirdLabelAnimation addKeyframeForTime:2 shadowOpacity:1.f]; - [thirdLabelAnimation addKeyframeForTime:2.5f shadowOpacity:0.f]; - [self.animator addAnimation:thirdLabelAnimation]; - - self.thirdLabel.layer.shadowColor = [UIColor darkGrayColor].CGColor; - self.thirdLabel.layer.shadowRadius = 1.f; - self.thirdLabel.layer.shadowOffset = CGSizeMake(1.f, 1.f); - - // Fade out the last label by dragging on the last page - IFTTTAlphaAnimation *lastLabelAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.fourthLabel]; - [lastLabelAlphaAnimation addKeyframeForTime:3 alpha:1.f]; - [lastLabelAlphaAnimation addKeyframeForTime:3.35f alpha:0.f]; - [self.animator addAnimation:lastLabelAlphaAnimation]; +- (void)configureIFTTTPresentsAnimations +{ + // Keep IFTTTPresents centered at the top of pages 0 and 1 + [self keepView:self.iftttPresents onPages:@[@(0), @(-1)] atTimes:@[@(0), @(1)]]; + [self.iftttPresents mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.contentView).offset(20); + }]; +} + +- (void)configureCircleAnimations +{ + // lay out the circle with autolayout (no x-position constraint since we are using the keepView:onPage: method) + [self.circle mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.lessThanOrEqualTo(self.scrollView); + make.width.equalTo(self.scrollView).multipliedBy(0.9).with.priorityHigh(); + make.top.greaterThanOrEqualTo(self.scrollView).offset(60); + make.height.equalTo(self.circle.mas_width); + make.centerY.equalTo(self.contentView).multipliedBy(0.8); + }]; + + // keep the circle centered on pages 0 and 1 + [self keepView:self.circle onPages:@[@(0), @(1)]]; + + // change the circle's color from gray to blue between pages 0 and 1 + IFTTTBackgroundColorAnimation *circleColorAnimation = [IFTTTBackgroundColorAnimation animationWithView:self.circle]; + [circleColorAnimation addKeyframeForTime:0 color:[UIColor colorWithRed:0.4f green:0.4f blue:0.4f alpha:1.f]]; + [circleColorAnimation addKeyframeForTime:1 color:[UIColor colorWithRed:0.14f green:0.8f blue:1.f alpha:1.f]]; + [self.animator addAnimation:circleColorAnimation]; + + // grow the circle into the background between pages 0 and 1 + IFTTTScaleAnimation *circleScaleAnimation = [IFTTTScaleAnimation animationWithView:self.circle]; + [circleScaleAnimation addKeyframeForTime:0 scale:1 withEasingFunction:IFTTTEasingFunctionEaseInQuad]; + [circleScaleAnimation addKeyframeForTime:1 scale:6]; + [self.animator addAnimation:circleScaleAnimation]; + + // hide the circle after page 1 (instead the background color will show) + IFTTTHideAnimation *circleHideAnimation = [IFTTTHideAnimation animationWithView:self.circle hideAt:1.15]; + [self.animator addAnimation:circleHideAnimation]; +} + +- (void)configureJazzHandsLabelAnimations +{ + // lay out jazz and hands with autolayout (no x-position or y-position constraint since we are animating those separately) + [self.jazz mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(self.circle).multipliedBy(0.89); + make.height.equalTo(self.jazz.mas_width).multipliedBy(186.f/607.f); + }]; + + [self.hands mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(self.jazz).multipliedBy(550.f / 607.f); + make.height.equalTo(self.hands.mas_width).multipliedBy(244.f/550.f); + }]; + + NSLayoutConstraint *jazzVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.jazz + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.circle + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]; + NSLayoutConstraint *handsVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.hands + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.circle + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]; + + [self.contentView addConstraint:jazzVerticalConstraint]; + [self.contentView addConstraint:handsVerticalConstraint]; + + // move JAZZ up between pages 0 and 1 + IFTTTConstraintMultiplierAnimation *jazzVerticalAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:jazzVerticalConstraint + attribute:IFTTTLayoutAttributeHeight + referenceView:self.circle]; + [jazzVerticalAnimation addKeyframeForTime:0 multiplier:-0.14f]; + [jazzVerticalAnimation addKeyframeForTime:1 multiplier:-0.64f]; + [self.animator addAnimation:jazzVerticalAnimation]; + + // move HANDS down between pages 0 and 1 + IFTTTConstraintMultiplierAnimation *handsVerticalAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:handsVerticalConstraint + attribute:IFTTTLayoutAttributeHeight + referenceView:self.circle]; + [handsVerticalAnimation addKeyframeForTime:0 multiplier:0.2f]; + [handsVerticalAnimation addKeyframeForTime:1 multiplier:0.72f]; + [self.animator addAnimation:handsVerticalAnimation]; + + // keep JAZZ on page 0, a little to the right + [self keepView:self.jazz onPages:@[@(0)] atTimes:@[@(0)]]; + + // keep HANDS centered on page 0 + [self keepView:self.hands onPages:@[@(0)] atTimes:@[@(0)]]; + + // Rotate Jazz 100 degrees counterclockwise between pages 0 and 1 + IFTTTRotationAnimation *jazzRotationAnimation = [IFTTTRotationAnimation animationWithView:self.jazz]; + [jazzRotationAnimation addKeyframeForTime:0 rotation:0]; + [jazzRotationAnimation addKeyframeForTime:1 rotation:100]; + [self.animator addAnimation:jazzRotationAnimation]; + + // Rotate Hands 100 degrees clockwise between pages 0 and 1 + IFTTTRotationAnimation *handsRotationAnimation = [IFTTTRotationAnimation animationWithView:self.hands]; + [handsRotationAnimation addKeyframeForTime:0 rotation:0]; + [handsRotationAnimation addKeyframeForTime:1 rotation:-100]; + [self.animator addAnimation:handsRotationAnimation]; +} + +- (void)configureStickAnimations +{ + // lay out sticks with autolayout (no x-position or y-position constraint since we are animating those separately) + [self.blueStick mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.equalTo(self.scrollView).multipliedBy(0.75); + make.width.equalTo(self.blueStick.mas_height).multipliedBy(466.f/1002.f); + }]; + + [self.orangeStick mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.equalTo(self.scrollView).multipliedBy(0.65); + make.width.equalTo(self.orangeStick.mas_height).multipliedBy(234.f/866.f); + make.centerY.equalTo(self.contentView).multipliedBy(1.1); + }]; + + // Keep the orange stick centered horizontally on page 0 + [self keepView:self.orangeStick onPage:0]; + + NSLayoutConstraint *blueStickVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.blueStick + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeTop + multiplier:1.f constant:0.f]; + + [self.contentView addConstraint:blueStickVerticalConstraint]; + + // Keep the blue stick centered horizontally on pages 0 and 1 + [self keepView:self.blueStick onPages:@[@(0), @(1)]]; + + // Animate the blue stick moving down off the screen between pages 0 and 1 + IFTTTConstraintMultiplierAnimation *blueStickVerticalAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:blueStickVerticalConstraint + attribute:IFTTTLayoutAttributeCenterY + referenceView:self.contentView]; + [blueStickVerticalAnimation addKeyframeForTime:0 multiplier:1.1f]; + [blueStickVerticalAnimation addKeyframeForTime:1 multiplier:3.1f]; + [self.animator addAnimation:blueStickVerticalAnimation]; +} + +- (void)configureMusicStandAnimations +{ + // Keep the music stand aligned with the right edge of pages 1 and 2 (this takes care of the x-position autolayout constraint) + [self keepView:self.musicStand onPages:@[@(1), @(2)] withAttribute:IFTTTHorizontalPositionAttributeRight]; + + // Lay out the music stand using Autolayout (no x-position or y-position constraint since we are animating those separately) + [self.musicStand mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.lessThanOrEqualTo(self.scrollView); + make.height.equalTo(self.musicStand.mas_width).multipliedBy(1184.f/750.f); + make.height.lessThanOrEqualTo(self.scrollView).offset(-40); + }]; + + // Animate the music stand moving down off the screen between pages 1 and 2 + NSLayoutConstraint *musicStandVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.musicStand + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeBottom + multiplier:1.f constant:0.f]; + + [self.contentView addConstraint:musicStandVerticalConstraint]; + + IFTTTConstraintMultiplierAnimation *musicStandVerticalAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:musicStandVerticalConstraint + attribute:IFTTTLayoutAttributeHeight + referenceView:self.contentView]; + [musicStandVerticalAnimation addKeyframeForTime:1 multiplier:0.f withEasingFunction:IFTTTEasingFunctionEaseOutCubic]; + [musicStandVerticalAnimation addKeyframeForTime:2 multiplier:1.f]; + [self.animator addAnimation:musicStandVerticalAnimation]; + + // Layout the music notes using Autolayout (no x-position constraint since we are using keepView:onPages: to set the horizontal position) + [self.musicNotes mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.and.height.and.width.equalTo(self.musicStand); + }]; + + // zoom the music notes over from the right between pages 0 and 1, then keep the music notes image aligned with the right edge of pages 1 and 2 + [self keepView:self.musicNotes onPages:@[@(2), @(1), @(2)] atTimes:@[@(0.5), @(1), @(2)] withAttribute:IFTTTHorizontalPositionAttributeRight]; +} + +- (void)configurePageTextAnimations +{ + // Use Autolayout to set the vertical position of the text (it has an inherent size) + [self.page2Text mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.contentView).multipliedBy(0.95); + }]; + + // Set the horizontal position to keep the text centered on page 2 + [self keepView:self.page2Text onPage:2]; + + // Use Autolayout to set the vertical position of the text (it has an inherent size) + [self.page3Text mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.contentView); + }]; + + // Set the horizontal position to keep the text centered on page 3 + [self keepView:self.page3Text onPage:3]; +} + +- (void)configureCloudAnimations +{ + // lay out big cloud with autolayout (no x-position or y-position constraint since we are animating those separately) + [self.bigCloud mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.lessThanOrEqualTo(self.scrollView).multipliedBy(0.78); + make.height.lessThanOrEqualTo(self.scrollView).multipliedBy(0.2); + make.height.equalTo(self.bigCloud.mas_width).multipliedBy(0.45); + }]; + + // keep the big cloud a bit to the righthand side of pages 1 and 2, then zoom it off to the left between pages 2 and 3 + [self keepView:self.bigCloud onPages:@[@(1.35), @(2.35), @(1.8)] atTimes:@[@(1), @(2), @(3)]]; + + // Move the big cloud down from above the screen on page 1 to near the top of the screen on page 2 + NSLayoutConstraint *bigCloudVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.bigCloud + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeTop + multiplier:1.f constant:0.f]; + + [self.contentView addConstraint:bigCloudVerticalConstraint]; + + IFTTTConstraintMultiplierAnimation *bigCloudVerticalAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:bigCloudVerticalConstraint + attribute:IFTTTLayoutAttributeHeight + referenceView:self.contentView]; + [bigCloudVerticalAnimation addKeyframeForTime:1 multiplier:-0.2f]; + [bigCloudVerticalAnimation addKeyframeForTime:2 multiplier:0.2f]; + [self.animator addAnimation:bigCloudVerticalAnimation]; + + // Layout the little cloud using Autolayout (the x-position is set by keepView:onPages:atTimes:) + [self.littleCloud mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.equalTo(self.bigCloud.mas_top).offset(20); + make.width.equalTo(self.bigCloud.mas_height); + make.height.equalTo(self.littleCloud.mas_width).multipliedBy(0.5); + }]; + + // Keep the little cloud a bit to the left of pages 1 and 2 + [self keepView:self.littleCloud onPages:@[@(0.75), @(1.75)] atTimes:@[@(1), @(2)]]; + + // Layout the vertical position of the IFTTT cloud using Autolayout (it has an inherent size) + [self.iftttCloud mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.contentView).multipliedBy(1.5); + }]; + + // Zoom in the IFTTT cloud from the right between pages 2 and 3 + [self keepView:self.iftttCloud onPages:@[@(3.5), @(3)] atTimes:@[@(2), @(3)]]; +} + +- (void)configureSunAnimations +{ + // Move the sun from the right side of page 2.5 to the left side of page 3 + [self keepView:self.sun onPages:@[@(2.8), @(2.6)] atTimes:@[@(2.5), @(3)]]; + + // Animate the sun moving down from above the screen to near the top of the screen bewteen pages 2.5 and 3 + NSLayoutConstraint *sunVerticalConstraint = [NSLayoutConstraint constraintWithItem:self.sun + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeTop + multiplier:1.f constant:0.f]; + + [self.contentView addConstraint:sunVerticalConstraint]; + + IFTTTConstraintConstantAnimation *sunVerticalAnimation = [IFTTTConstraintConstantAnimation animationWithSuperview:self.contentView + constraint:sunVerticalConstraint]; + [sunVerticalAnimation addKeyframeForTime:2 constant:-200.f]; + [sunVerticalAnimation addKeyframeForTime:3 constant:20.f]; + [self.animator addAnimation:sunVerticalAnimation]; +} + +- (void)configureAirplaneAnimations +{ + // Set up the view that contains the airplane view and its dashed line path view + self.planePathLayer = [self airplanePathLayer]; + [self.planePathView.layer addSublayer:self.planePathLayer]; + + [self.planePathView addSubview:self.plane]; + [self.plane mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.equalTo(self.planePathView.mas_centerY); + make.right.equalTo(self.planePathView.mas_centerX); + }]; + + [self.planePathView mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.equalTo(self.scrollView).offset(55); + make.width.and.height.equalTo(self.plane); + }]; + + // Keep the left edge of the planePathView at the center of pages 1 and 2 + [self keepView:self.planePathView onPages:@[@(1.5), @(2.5)] atTimes:@[@(1), @(2)] withAttribute:IFTTTHorizontalPositionAttributeLeft]; + + // Fly the plane along the path + self.airplaneFlyingAnimation = [IFTTTPathPositionAnimation animationWithView:self.plane path:self.planePathLayer.path]; + [self.airplaneFlyingAnimation addKeyframeForTime:1 animationProgress:0]; + [self.airplaneFlyingAnimation addKeyframeForTime:2 animationProgress:1]; + [self.animator addAnimation:self.airplaneFlyingAnimation]; + + // Change the stroke end of the dashed line airplane path to match the plane's current position + IFTTTLayerStrokeEndAnimation *planePathAnimation = [IFTTTLayerStrokeEndAnimation animationWithLayer:self.planePathLayer]; + [planePathAnimation addKeyframeForTime:1 strokeEnd:0]; + [planePathAnimation addKeyframeForTime:2 strokeEnd:1]; + [self.animator addAnimation:planePathAnimation]; + + // Fade the plane path view in after page 1 and fade it out again after page 2.5 + IFTTTAlphaAnimation *planeAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.planePathView]; + [planeAlphaAnimation addKeyframeForTime:1.06f alpha:0]; + [planeAlphaAnimation addKeyframeForTime:1.08f alpha:1]; + [planeAlphaAnimation addKeyframeForTime:2.5f alpha:1]; + [planeAlphaAnimation addKeyframeForTime:3.f alpha:0]; + [self.animator addAnimation:planeAlphaAnimation]; +} + +- (CGPathRef)airplanePath +{ + // Create a bezier path for the airplane to fly along + UIBezierPath *airplanePath = [UIBezierPath bezierPath]; + [airplanePath moveToPoint: CGPointMake(120, 20)]; + [airplanePath addCurveToPoint: CGPointMake(40, -130) controlPoint1: CGPointMake(120, 20) controlPoint2: CGPointMake(140, -50)]; + [airplanePath addCurveToPoint: CGPointMake(30, -430) controlPoint1: CGPointMake(-60, -210) controlPoint2: CGPointMake(-320, -430)]; + [airplanePath addCurveToPoint: CGPointMake(-210, -190) controlPoint1: CGPointMake(320, -430) controlPoint2: CGPointMake(130, -190)]; + + return airplanePath.CGPath; +} + +- (CAShapeLayer *)airplanePathLayer +{ + // Create a shape layer to draw the airplane's path + CAShapeLayer *shapeLayer = [CAShapeLayer layer]; + shapeLayer.path = [self airplanePath]; + shapeLayer.fillColor = nil; + shapeLayer.strokeColor = [UIColor whiteColor].CGColor; + shapeLayer.lineDashPattern = @[@(20), @(20)]; + shapeLayer.lineWidth = 4; + shapeLayer.miterLimit = 4; + shapeLayer.fillRule = kCAFillRuleEvenOdd; + + return shapeLayer; +} + +- (void)scaleAirplanePathToSize:(CGSize)pageSize +{ + // Scale the airplane path to the given page size + CGSize scaleSize = CGSizeMake(pageSize.width / 375.f, pageSize.height / 667.f); + + CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleSize.width, scaleSize.height); + + CGPathRef scaledPath = CGPathCreateCopyByTransformingPath(self.airplanePath, &scaleTransform); + + self.planePathLayer.path = scaledPath; + self.airplaneFlyingAnimation.path = scaledPath; + CGPathRelease(scaledPath); } @end diff --git a/Example/JazzHandsDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/AppIcon.appiconset/Contents.json index a396706..33ec0bc 100644 --- a/Example/JazzHandsDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/JazzHandsDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -14,6 +14,11 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" } ], "info" : { diff --git a/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/BigCloud.png b/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/BigCloud.png new file mode 100644 index 0000000..6fd9936 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/BigCloud.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/Contents.json new file mode 100644 index 0000000..d0213bd --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/BigCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "BigCloud.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/BlueStick.png b/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/BlueStick.png new file mode 100644 index 0000000..66c531f Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/BlueStick.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/Contents.json new file mode 100644 index 0000000..3d9ced4 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/BlueStick.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "BlueStick.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/Contents.json new file mode 100644 index 0000000..3bc6648 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "hands.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/hands.png b/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/hands.png new file mode 100644 index 0000000..ff89696 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Hands.imageset/hands.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT.png b/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT.png deleted file mode 100644 index 1d71b14..0000000 Binary files a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT.png and /dev/null differ diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT@2x.png b/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT@2x.png deleted file mode 100644 index 39f3ebc..0000000 Binary files a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/IFTTT@2x.png and /dev/null differ diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/Contents.json new file mode 100644 index 0000000..3eb1a56 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "IFTTTCloud.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/IFTTTCloud.png b/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/IFTTTCloud.png new file mode 100644 index 0000000..b9ea2f5 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/IFTTTCloud.imageset/IFTTTCloud.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/Contents.json new file mode 100644 index 0000000..0e9cc68 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "iftttpresents.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/iftttpresents.png b/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/iftttpresents.png new file mode 100644 index 0000000..c71a11b Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/IFTTTPresents.imageset/iftttpresents.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/Contents.json similarity index 54% rename from Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/Contents.json rename to Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/Contents.json index b5e8e30..72fe9cc 100644 --- a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/Contents.json +++ b/Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/Contents.json @@ -2,13 +2,16 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "404_unicorn.png" + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "404_unicorn@2x.png" + "filename" : "jazz.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/jazz.png b/Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/jazz.png new file mode 100644 index 0000000..516eb91 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Jazz.imageset/jazz.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json b/Example/JazzHandsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index c79ebd3..0000000 --- a/Example/JazzHandsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/Contents.json new file mode 100644 index 0000000..1619f2a --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "littleCloud.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/littleCloud.png b/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/littleCloud.png new file mode 100644 index 0000000..51de802 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/LittleCloud.imageset/littleCloud.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/Contents.json new file mode 100644 index 0000000..9283920 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "MusicNotes.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/MusicNotes.png b/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/MusicNotes.png new file mode 100644 index 0000000..13a8fcd Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/MusicNotes.imageset/MusicNotes.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/Contents.json new file mode 100644 index 0000000..9d776a4 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "MusicStand.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/MusicStand.png b/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/MusicStand.png new file mode 100644 index 0000000..0161e10 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/MusicStand.imageset/MusicStand.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/Contents.json new file mode 100644 index 0000000..a6e20ad --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "OrangeStick.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/OrangeStick.png b/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/OrangeStick.png new file mode 100644 index 0000000..a039dc2 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/OrangeStick.imageset/OrangeStick.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/Contents.json new file mode 100644 index 0000000..2e76b91 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "text2.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/text2.png b/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/text2.png new file mode 100644 index 0000000..2522984 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Page2Text.imageset/text2.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/Contents.json new file mode 100644 index 0000000..0861120 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "text3.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/text3.png b/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/text3.png new file mode 100644 index 0000000..0531a27 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Page3Text.imageset/text3.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Airplane.png b/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Airplane.png new file mode 100644 index 0000000..c581f27 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Airplane.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Contents.json new file mode 100644 index 0000000..b72def8 --- /dev/null +++ b/Example/JazzHandsDemo/Images.xcassets/Plane.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Airplane.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/Contents.json b/Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Contents.json similarity index 54% rename from Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/Contents.json rename to Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Contents.json index 2620cf8..55128b0 100644 --- a/Example/JazzHandsDemo/Images.xcassets/IFTTT.imageset/Contents.json +++ b/Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Contents.json @@ -2,13 +2,16 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "IFTTT.png" + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "IFTTT@2x.png" + "filename" : "Sun.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Sun.png b/Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Sun.png new file mode 100644 index 0000000..6b56d48 Binary files /dev/null and b/Example/JazzHandsDemo/Images.xcassets/Sun.imageset/Sun.png differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn.png b/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn.png deleted file mode 100644 index e688730..0000000 Binary files a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn.png and /dev/null differ diff --git a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn@2x.png b/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn@2x.png deleted file mode 100644 index d44ece1..0000000 Binary files a/Example/JazzHandsDemo/Images.xcassets/Unicorn.imageset/404_unicorn@2x.png and /dev/null differ diff --git a/Example/JazzHandsDemo/JazzHandsDemo-Info.plist b/Example/JazzHandsDemo/JazzHandsDemo-Info.plist index e13d017..c82f131 100644 --- a/Example/JazzHandsDemo/JazzHandsDemo-Info.plist +++ b/Example/JazzHandsDemo/JazzHandsDemo-Info.plist @@ -24,6 +24,10 @@ 1.0 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main UIRequiredDeviceCapabilities armv7 @@ -34,5 +38,7 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIViewControllerBasedStatusBarAppearance + diff --git a/Example/JazzHandsDemo/JazzHandsDemo.entitlements b/Example/JazzHandsDemo/JazzHandsDemo.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Example/JazzHandsDemo/JazzHandsDemo.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Example/JazzHandsDemo/LaunchScreen.storyboard b/Example/JazzHandsDemo/LaunchScreen.storyboard new file mode 100644 index 0000000..673e0f7 --- /dev/null +++ b/Example/JazzHandsDemo/LaunchScreen.storyboard @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Example/JazzHandsDemo/Main.storyboard b/Example/JazzHandsDemo/Main.storyboard new file mode 100644 index 0000000..29e0328 --- /dev/null +++ b/Example/JazzHandsDemo/Main.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/JazzHandsDemo/MyCustomAnimation.h b/Example/JazzHandsDemo/MyCustomAnimation.h deleted file mode 100644 index e2de532..0000000 --- a/Example/JazzHandsDemo/MyCustomAnimation.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// MyCustomAnimation.h -// JazzHandsDemo -// -// Created by Laura Skelton on 6/18/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTViewAnimation.h" - -@interface MyCustomAnimation : IFTTTViewAnimation - -- (void)addKeyframeForTime:(CGFloat)time shadowOpacity:(CGFloat)shadowOpacity; - -@end diff --git a/Example/JazzHandsDemo/MyCustomAnimation.m b/Example/JazzHandsDemo/MyCustomAnimation.m deleted file mode 100644 index f72415c..0000000 --- a/Example/JazzHandsDemo/MyCustomAnimation.m +++ /dev/null @@ -1,24 +0,0 @@ -// -// MyCustomAnimation.m -// JazzHandsDemo -// -// Created by Laura Skelton on 6/18/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "MyCustomAnimation.h" - -@implementation MyCustomAnimation - -- (void)addKeyframeForTime:(CGFloat)time shadowOpacity:(CGFloat)shadowOpacity -{ - [self addKeyframeForTime:time value:@(shadowOpacity)]; -} - -- (void)animate:(CGFloat)time -{ - if (!self.hasKeyframes) return; - self.view.layer.shadowOpacity = (float)[(NSNumber *)[self valueAtTime:time] floatValue]; -} - -@end diff --git a/Example/JazzHandsTests/IFTTTAnimationSpec.m b/Example/JazzHandsTests/IFTTTAnimationSpec.m index 2010bab..a1fdea2 100644 --- a/Example/JazzHandsTests/IFTTTAnimationSpec.m +++ b/Example/JazzHandsTests/IFTTTAnimationSpec.m @@ -29,20 +29,19 @@ IFTTTAnimator *animator = [IFTTTAnimator new]; IFTTTAlphaAnimation *alphaAnimation = [IFTTTAlphaAnimation animationWithView:label]; - IFTTTColorAnimation *colorAnimation = [IFTTTColorAnimation animationWithView:label]; + IFTTTBackgroundColorAnimation *colorAnimation = [IFTTTBackgroundColorAnimation animationWithView:label]; IFTTTCornerRadiusAnimation *cornerRadiusAnimation = [IFTTTCornerRadiusAnimation animationWithView:label]; - IFTTTFillColorAnimation *fillColorAnimation = [IFTTTFillColorAnimation animationWithLayer:layer]; + IFTTTLayerFillColorAnimation *fillColorAnimation = [IFTTTLayerFillColorAnimation animationWithLayer:layer]; IFTTTHideAnimation *hideAnimation = [IFTTTHideAnimation animationWithView:label hideAt:2]; IFTTTRotationAnimation *rotationAnimation = [IFTTTRotationAnimation animationWithView:label]; IFTTTScaleAnimation *scaleAnimation = [IFTTTScaleAnimation animationWithView:label]; - IFTTTStrokeEndAnimation *strokeEndAnimation = [IFTTTStrokeEndAnimation animationWithLayer:layer]; - IFTTTStrokeStartAnimation *strokeStartAnimation = [IFTTTStrokeStartAnimation animationWithLayer:layer]; + IFTTTLayerStrokeEndAnimation *strokeEndAnimation = [IFTTTLayerStrokeEndAnimation animationWithLayer:layer]; IFTTTTextColorAnimation *textColorAnimation = [IFTTTTextColorAnimation animationWithLabel:label]; IFTTTTransform3DAnimation *transformAnimation = [IFTTTTransform3DAnimation animationWithView:label]; IFTTTTranslationAnimation *translationAnimation = [IFTTTTranslationAnimation animationWithView:label]; // Note: None of the three constraint animations can be used with each other or with the frame animation. - // They affect the same view properties. + // They affect the same view properties. Also, IFTTTStrokeStartAnimation cannot be used with IFTTTStrokeEndAnimation. [alphaAnimation addKeyframeForTime:2 alpha:0.5f]; [colorAnimation addKeyframeForTime:2 color:[UIColor redColor]]; @@ -51,7 +50,6 @@ [rotationAnimation addKeyframeForTime:2 rotation:45.f]; [scaleAnimation addKeyframeForTime:2 scale:0.4f]; [strokeEndAnimation addKeyframeForTime:2 strokeEnd:0.8f]; - [strokeStartAnimation addKeyframeForTime:2 strokeStart:0.1f]; [textColorAnimation addKeyframeForTime:2 color:[UIColor greenColor]]; [translationAnimation addKeyframeForTime:2 translation:CGPointMake(20.f, 30.f)]; @@ -69,7 +67,6 @@ [animator addAnimation:rotationAnimation]; [animator addAnimation:scaleAnimation]; [animator addAnimation:strokeEndAnimation]; - [animator addAnimation:strokeStartAnimation]; [animator addAnimation:textColorAnimation]; [animator addAnimation:translationAnimation]; [animator addAnimation:transformAnimation]; @@ -95,11 +92,7 @@ }); it(@"should have the correct stroke end", ^{ - expect(layer.strokeEnd).to.beCloseTo(0.8f); - }); - - it(@"should have the correct stroke start", ^{ - expect(layer.strokeStart).to.beCloseTo(0.1f); + expect(layer.timeOffset).to.beCloseTo(0.8f); }); it(@"should have the correct text color", ^{ diff --git a/Example/ObjectiveC.gcno b/Example/ObjectiveC.gcno new file mode 100644 index 0000000..83b1f0c Binary files /dev/null and b/Example/ObjectiveC.gcno differ diff --git a/Example/Podfile b/Example/Podfile index 93f10fc..9adf318 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -6,6 +6,7 @@ xcodeproj 'JazzHandsDemo' def install_pods pod 'JazzHands', :path => '../JazzHands.podspec' + pod 'Masonry' end target :JazzHandsDemo do diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 815cfea..d075437 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,11 +1,13 @@ PODS: - Expecta (1.0.0) - - JazzHands (2.0.2) + - JazzHands (2.0.3) + - Masonry (0.6.1) - Specta (1.0.2) DEPENDENCIES: - Expecta - JazzHands (from `../JazzHands.podspec`) + - Masonry - Specta EXTERNAL SOURCES: @@ -14,7 +16,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Expecta: 32604574add2c46a36f8d2f716b6c5736eb75024 - JazzHands: 088a3949e539480b07ba6ae4877da935efcc061b + JazzHands: 0f3c8578f33f45b2fe73975deed6a5f02f9c22d3 + Masonry: 4972309f2f134de9dd312f4dc4a21359b50e6caa Specta: 9cec98310dca411f7c7ffd6943552b501622abfe -COCOAPODS: 0.37.2 +COCOAPODS: 0.38.0 diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTBackgroundColorAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTBackgroundColorAnimation.h new file mode 120000 index 0000000..d493a02 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTBackgroundColorAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTBackgroundColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTColorAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTColorAnimation.h deleted file mode 120000 index eceb7c8..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTColorAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTFillColorAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTFillColorAnimation.h deleted file mode 120000 index e0d8e59..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTFillColorAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTFillColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h deleted file mode 120000 index 81ee329..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTLabelAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTLayerFillColorAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerFillColorAnimation.h new file mode 120000 index 0000000..b6c858d --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerFillColorAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerFillColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeEndAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeEndAnimation.h new file mode 120000 index 0000000..f2c7d89 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeEndAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerStrokeEndAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeStartAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeStartAnimation.h new file mode 120000 index 0000000..55b31ea --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTLayerStrokeStartAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerStrokeStartAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTPathPositionAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTPathPositionAnimation.h new file mode 120000 index 0000000..350bbea --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTPathPositionAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTPathPositionAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeEndAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeEndAnimation.h deleted file mode 120000 index ab82c81..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeEndAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTStrokeEndAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeStartAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeStartAnimation.h deleted file mode 120000 index f34e314..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTStrokeStartAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTStrokeStartAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASCompositeConstraint.h b/Example/Pods/Headers/Private/Masonry/MASCompositeConstraint.h new file mode 120000 index 0000000..b1b3410 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASCompositeConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASCompositeConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASConstraint+Private.h b/Example/Pods/Headers/Private/Masonry/MASConstraint+Private.h new file mode 120000 index 0000000..ed9aa9f --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASConstraint+Private.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraint+Private.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASConstraint.h b/Example/Pods/Headers/Private/Masonry/MASConstraint.h new file mode 120000 index 0000000..76e9e73 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASConstraintMaker.h b/Example/Pods/Headers/Private/Masonry/MASConstraintMaker.h new file mode 120000 index 0000000..b6d6027 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASConstraintMaker.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraintMaker.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASLayoutConstraint.h b/Example/Pods/Headers/Private/Masonry/MASLayoutConstraint.h new file mode 120000 index 0000000..73e8796 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASLayoutConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASLayoutConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASUtilities.h b/Example/Pods/Headers/Private/Masonry/MASUtilities.h new file mode 120000 index 0000000..aae5e32 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASUtilities.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASUtilities.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASViewAttribute.h b/Example/Pods/Headers/Private/Masonry/MASViewAttribute.h new file mode 120000 index 0000000..5399f64 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASViewAttribute.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASViewAttribute.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/MASViewConstraint.h b/Example/Pods/Headers/Private/Masonry/MASViewConstraint.h new file mode 120000 index 0000000..382c419 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/MASViewConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASViewConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/Masonry.h b/Example/Pods/Headers/Private/Masonry/Masonry.h new file mode 120000 index 0000000..f509303 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/Masonry.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/Masonry.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/NSArray+MASAdditions.h b/Example/Pods/Headers/Private/Masonry/NSArray+MASAdditions.h new file mode 120000 index 0000000..db1d0ea --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/NSArray+MASAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSArray+MASAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/NSArray+MASShorthandAdditions.h b/Example/Pods/Headers/Private/Masonry/NSArray+MASShorthandAdditions.h new file mode 120000 index 0000000..2169edc --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/NSArray+MASShorthandAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSArray+MASShorthandAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/NSLayoutConstraint+MASDebugAdditions.h b/Example/Pods/Headers/Private/Masonry/NSLayoutConstraint+MASDebugAdditions.h new file mode 120000 index 0000000..72f5943 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/NSLayoutConstraint+MASDebugAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/View+MASAdditions.h b/Example/Pods/Headers/Private/Masonry/View+MASAdditions.h new file mode 120000 index 0000000..9060451 --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/View+MASAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/View+MASAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Masonry/View+MASShorthandAdditions.h b/Example/Pods/Headers/Private/Masonry/View+MASShorthandAdditions.h new file mode 120000 index 0000000..91ef93f --- /dev/null +++ b/Example/Pods/Headers/Private/Masonry/View+MASShorthandAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/View+MASShorthandAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTBackgroundColorAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTBackgroundColorAnimation.h new file mode 120000 index 0000000..d493a02 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTBackgroundColorAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTBackgroundColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTColorAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTColorAnimation.h deleted file mode 120000 index eceb7c8..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTColorAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTFillColorAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTFillColorAnimation.h deleted file mode 120000 index e0d8e59..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTFillColorAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTFillColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h deleted file mode 120000 index 81ee329..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTLabelAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTLayerFillColorAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerFillColorAnimation.h new file mode 120000 index 0000000..b6c858d --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerFillColorAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerFillColorAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeEndAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeEndAnimation.h new file mode 120000 index 0000000..f2c7d89 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeEndAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerStrokeEndAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeStartAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeStartAnimation.h new file mode 120000 index 0000000..55b31ea --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTLayerStrokeStartAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLayerStrokeStartAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTPathPositionAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTPathPositionAnimation.h new file mode 120000 index 0000000..350bbea --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTPathPositionAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTPathPositionAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeEndAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeEndAnimation.h deleted file mode 120000 index ab82c81..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeEndAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTStrokeEndAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeStartAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeStartAnimation.h deleted file mode 120000 index f34e314..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTStrokeStartAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTStrokeStartAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASCompositeConstraint.h b/Example/Pods/Headers/Public/Masonry/MASCompositeConstraint.h new file mode 120000 index 0000000..b1b3410 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASCompositeConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASCompositeConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASConstraint+Private.h b/Example/Pods/Headers/Public/Masonry/MASConstraint+Private.h new file mode 120000 index 0000000..ed9aa9f --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASConstraint+Private.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraint+Private.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASConstraint.h b/Example/Pods/Headers/Public/Masonry/MASConstraint.h new file mode 120000 index 0000000..76e9e73 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASConstraintMaker.h b/Example/Pods/Headers/Public/Masonry/MASConstraintMaker.h new file mode 120000 index 0000000..b6d6027 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASConstraintMaker.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASConstraintMaker.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASLayoutConstraint.h b/Example/Pods/Headers/Public/Masonry/MASLayoutConstraint.h new file mode 120000 index 0000000..73e8796 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASLayoutConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASLayoutConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASUtilities.h b/Example/Pods/Headers/Public/Masonry/MASUtilities.h new file mode 120000 index 0000000..aae5e32 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASUtilities.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASUtilities.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASViewAttribute.h b/Example/Pods/Headers/Public/Masonry/MASViewAttribute.h new file mode 120000 index 0000000..5399f64 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASViewAttribute.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASViewAttribute.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/MASViewConstraint.h b/Example/Pods/Headers/Public/Masonry/MASViewConstraint.h new file mode 120000 index 0000000..382c419 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/MASViewConstraint.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/MASViewConstraint.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/Masonry.h b/Example/Pods/Headers/Public/Masonry/Masonry.h new file mode 120000 index 0000000..f509303 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/Masonry.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/Masonry.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/NSArray+MASAdditions.h b/Example/Pods/Headers/Public/Masonry/NSArray+MASAdditions.h new file mode 120000 index 0000000..db1d0ea --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/NSArray+MASAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSArray+MASAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/NSArray+MASShorthandAdditions.h b/Example/Pods/Headers/Public/Masonry/NSArray+MASShorthandAdditions.h new file mode 120000 index 0000000..2169edc --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/NSArray+MASShorthandAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSArray+MASShorthandAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/NSLayoutConstraint+MASDebugAdditions.h b/Example/Pods/Headers/Public/Masonry/NSLayoutConstraint+MASDebugAdditions.h new file mode 120000 index 0000000..72f5943 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/NSLayoutConstraint+MASDebugAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/View+MASAdditions.h b/Example/Pods/Headers/Public/Masonry/View+MASAdditions.h new file mode 120000 index 0000000..9060451 --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/View+MASAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/View+MASAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Masonry/View+MASShorthandAdditions.h b/Example/Pods/Headers/Public/Masonry/View+MASShorthandAdditions.h new file mode 120000 index 0000000..91ef93f --- /dev/null +++ b/Example/Pods/Headers/Public/Masonry/View+MASShorthandAdditions.h @@ -0,0 +1 @@ +../../../Masonry/Masonry/View+MASShorthandAdditions.h \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/JazzHands.podspec.json b/Example/Pods/Local Podspecs/JazzHands.podspec.json index 5fa9192..a81bc4b 100644 --- a/Example/Pods/Local Podspecs/JazzHands.podspec.json +++ b/Example/Pods/Local Podspecs/JazzHands.podspec.json @@ -1,6 +1,6 @@ { "name": "JazzHands", - "version": "2.0.2", + "version": "2.0.3", "summary": "Simple keyframe animations for scrolling intros.", "homepage": "https://github.com/IFTTT/JazzHands", "authors": { @@ -11,7 +11,7 @@ }, "source": { "git": "https://github.com/IFTTT/JazzHands.git", - "tag": "2.0.2" + "tag": "2.0.3" }, "platforms": { "ios": "7.0" diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 815cfea..d075437 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,11 +1,13 @@ PODS: - Expecta (1.0.0) - - JazzHands (2.0.2) + - JazzHands (2.0.3) + - Masonry (0.6.1) - Specta (1.0.2) DEPENDENCIES: - Expecta - JazzHands (from `../JazzHands.podspec`) + - Masonry - Specta EXTERNAL SOURCES: @@ -14,7 +16,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Expecta: 32604574add2c46a36f8d2f716b6c5736eb75024 - JazzHands: 088a3949e539480b07ba6ae4877da935efcc061b + JazzHands: 0f3c8578f33f45b2fe73975deed6a5f02f9c22d3 + Masonry: 4972309f2f134de9dd312f4dc4a21359b50e6caa Specta: 9cec98310dca411f7c7ffd6943552b501622abfe -COCOAPODS: 0.37.2 +COCOAPODS: 0.38.0 diff --git a/Example/Pods/Masonry/LICENSE b/Example/Pods/Masonry/LICENSE new file mode 100644 index 0000000..a843c00 --- /dev/null +++ b/Example/Pods/Masonry/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Example/Pods/Masonry/Masonry/MASCompositeConstraint.h b/Example/Pods/Masonry/Masonry/MASCompositeConstraint.h new file mode 100644 index 0000000..934c6f1 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASCompositeConstraint.h @@ -0,0 +1,26 @@ +// +// MASCompositeConstraint.h +// Masonry +// +// Created by Jonas Budelmann on 21/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASConstraint.h" +#import "MASUtilities.h" + +/** + * A group of MASConstraint objects + */ +@interface MASCompositeConstraint : MASConstraint + +/** + * Creates a composite with a predefined array of children + * + * @param children child MASConstraints + * + * @return a composite constraint + */ +- (id)initWithChildren:(NSArray *)children; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASCompositeConstraint.m b/Example/Pods/Masonry/Masonry/MASCompositeConstraint.m new file mode 100644 index 0000000..fd1e8c8 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASCompositeConstraint.m @@ -0,0 +1,177 @@ +// +// MASCompositeConstraint.m +// Masonry +// +// Created by Jonas Budelmann on 21/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASCompositeConstraint.h" +#import "MASConstraint+Private.h" + +@interface MASCompositeConstraint () + +@property (nonatomic, strong) id mas_key; +@property (nonatomic, strong) NSMutableArray *childConstraints; + +@end + +@implementation MASCompositeConstraint + +- (id)initWithChildren:(NSArray *)children { + self = [super init]; + if (!self) return nil; + + _childConstraints = [children mutableCopy]; + for (MASConstraint *constraint in _childConstraints) { + constraint.delegate = self; + } + + return self; +} + +#pragma mark - MASConstraintDelegate + +- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint { + NSUInteger index = [self.childConstraints indexOfObject:constraint]; + NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint); + [self.childConstraints replaceObjectAtIndex:index withObject:replacementConstraint]; +} + +- (MASConstraint *)constraint:(MASConstraint __unused *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { + id strongDelegate = self.delegate; + MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; + newConstraint.delegate = self; + [self.childConstraints addObject:newConstraint]; + return newConstraint; +} + +#pragma mark - NSLayoutConstraint multiplier proxies + +- (MASConstraint * (^)(CGFloat))multipliedBy { + return ^id(CGFloat multiplier) { + for (MASConstraint *constraint in self.childConstraints) { + constraint.multipliedBy(multiplier); + } + return self; + }; +} + +- (MASConstraint * (^)(CGFloat))dividedBy { + return ^id(CGFloat divider) { + for (MASConstraint *constraint in self.childConstraints) { + constraint.dividedBy(divider); + } + return self; + }; +} + +#pragma mark - MASLayoutPriority proxy + +- (MASConstraint * (^)(MASLayoutPriority))priority { + return ^id(MASLayoutPriority priority) { + for (MASConstraint *constraint in self.childConstraints) { + constraint.priority(priority); + } + return self; + }; +} + +#pragma mark - NSLayoutRelation proxy + +- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { + return ^id(id attr, NSLayoutRelation relation) { + for (MASConstraint *constraint in self.childConstraints.copy) { + constraint.equalToWithRelation(attr, relation); + } + return self; + }; +} + +#pragma mark - attribute chaining + +- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { + [self constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; + return self; +} + +#pragma mark - Animator proxy + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + +- (MASConstraint *)animator { + for (MASConstraint *constraint in self.childConstraints) { + [constraint animator]; + } + return self; +} + +#endif + +#pragma mark - debug helpers + +- (MASConstraint * (^)(id))key { + return ^id(id key) { + self.mas_key = key; + int i = 0; + for (MASConstraint *constraint in self.childConstraints) { + constraint.key([NSString stringWithFormat:@"%@[%d]", key, i++]); + } + return self; + }; +} + +#pragma mark - NSLayoutConstraint constant setters + +- (void)setInsets:(MASEdgeInsets)insets { + for (MASConstraint *constraint in self.childConstraints) { + constraint.insets = insets; + } +} + +- (void)setOffset:(CGFloat)offset { + for (MASConstraint *constraint in self.childConstraints) { + constraint.offset = offset; + } +} + +- (void)setSizeOffset:(CGSize)sizeOffset { + for (MASConstraint *constraint in self.childConstraints) { + constraint.sizeOffset = sizeOffset; + } +} + +- (void)setCenterOffset:(CGPoint)centerOffset { + for (MASConstraint *constraint in self.childConstraints) { + constraint.centerOffset = centerOffset; + } +} + +#pragma mark - MASConstraint + +- (void)activate { + for (MASConstraint *constraint in self.childConstraints) { + [constraint activate]; + } +} + +- (void)deactivate { + for (MASConstraint *constraint in self.childConstraints) { + [constraint deactivate]; + } +} + +- (void)install { + for (MASConstraint *constraint in self.childConstraints) { + constraint.updateExisting = self.updateExisting; + [constraint install]; + } +} + +- (void)uninstall { + for (MASConstraint *constraint in self.childConstraints) { + [constraint uninstall]; + } +} + +@end diff --git a/Example/Pods/Masonry/Masonry/MASConstraint+Private.h b/Example/Pods/Masonry/Masonry/MASConstraint+Private.h new file mode 100644 index 0000000..ee0fd96 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASConstraint+Private.h @@ -0,0 +1,66 @@ +// +// MASConstraint+Private.h +// Masonry +// +// Created by Nick Tymchenko on 29/04/14. +// Copyright (c) 2014 cloudling. All rights reserved. +// + +#import "MASConstraint.h" + +@protocol MASConstraintDelegate; + + +@interface MASConstraint () + +/** + * Whether or not to check for an existing constraint instead of adding constraint + */ +@property (nonatomic, assign) BOOL updateExisting; + +/** + * Usually MASConstraintMaker but could be a parent MASConstraint + */ +@property (nonatomic, weak) id delegate; + +/** + * Based on a provided value type, is equal to calling: + * NSNumber - setOffset: + * NSValue with CGPoint - setPointOffset: + * NSValue with CGSize - setSizeOffset: + * NSValue with MASEdgeInsets - setInsets: + */ +- (void)setLayoutConstantWithValue:(NSValue *)value; + +@end + + +@interface MASConstraint (Abstract) + +/** + * Sets the constraint relation to given NSLayoutRelation + * returns a block which accepts one of the following: + * MASViewAttribute, UIView, NSValue, NSArray + * see readme for more details. + */ +- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation; + +/** + * Override to set a custom chaining behaviour + */ +- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute; + +@end + + +@protocol MASConstraintDelegate + +/** + * Notifies the delegate when the constraint needs to be replaced with another constraint. For example + * A MASViewConstraint may turn into a MASCompositeConstraint when an array is passed to one of the equality blocks + */ +- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint; + +- (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASConstraint.h b/Example/Pods/Masonry/Masonry/MASConstraint.h new file mode 100644 index 0000000..648b781 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASConstraint.h @@ -0,0 +1,237 @@ +// +// MASConstraint.h +// Masonry +// +// Created by Jonas Budelmann on 22/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASUtilities.h" + +/** + * Enables Constraints to be created with chainable syntax + * Constraint can represent single NSLayoutConstraint (MASViewConstraint) + * or a group of NSLayoutConstraints (MASComposisteConstraint) + */ +@interface MASConstraint : NSObject + +// Chaining Support + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight + */ +- (MASConstraint * (^)(MASEdgeInsets insets))insets; + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeWidth, NSLayoutAttributeHeight + */ +- (MASConstraint * (^)(CGSize offset))sizeOffset; + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeCenterX, NSLayoutAttributeCenterY + */ +- (MASConstraint * (^)(CGPoint offset))centerOffset; + +/** + * Modifies the NSLayoutConstraint constant + */ +- (MASConstraint * (^)(CGFloat offset))offset; + +/** + * Modifies the NSLayoutConstraint constant based on a value type + */ +- (MASConstraint * (^)(NSValue *value))valueOffset; + +/** + * Sets the NSLayoutConstraint multiplier property + */ +- (MASConstraint * (^)(CGFloat multiplier))multipliedBy; + +/** + * Sets the NSLayoutConstraint multiplier to 1.0/dividedBy + */ +- (MASConstraint * (^)(CGFloat divider))dividedBy; + +/** + * Sets the NSLayoutConstraint priority to a float or MASLayoutPriority + */ +- (MASConstraint * (^)(MASLayoutPriority priority))priority; + +/** + * Sets the NSLayoutConstraint priority to MASLayoutPriorityLow + */ +- (MASConstraint * (^)())priorityLow; + +/** + * Sets the NSLayoutConstraint priority to MASLayoutPriorityMedium + */ +- (MASConstraint * (^)())priorityMedium; + +/** + * Sets the NSLayoutConstraint priority to MASLayoutPriorityHigh + */ +- (MASConstraint * (^)())priorityHigh; + +/** + * Sets the constraint relation to NSLayoutRelationEqual + * returns a block which accepts one of the following: + * MASViewAttribute, UIView, NSValue, NSArray + * see readme for more details. + */ +- (MASConstraint * (^)(id attr))equalTo; + +/** + * Sets the constraint relation to NSLayoutRelationGreaterThanOrEqual + * returns a block which accepts one of the following: + * MASViewAttribute, UIView, NSValue, NSArray + * see readme for more details. + */ +- (MASConstraint * (^)(id attr))greaterThanOrEqualTo; + +/** + * Sets the constraint relation to NSLayoutRelationLessThanOrEqual + * returns a block which accepts one of the following: + * MASViewAttribute, UIView, NSValue, NSArray + * see readme for more details. + */ +- (MASConstraint * (^)(id attr))lessThanOrEqualTo; + +/** + * Optional semantic property which has no effect but improves the readability of constraint + */ +- (MASConstraint *)with; + +/** + * Optional semantic property which has no effect but improves the readability of constraint + */ +- (MASConstraint *)and; + +/** + * Creates a new MASCompositeConstraint with the called attribute and reciever + */ +- (MASConstraint *)left; +- (MASConstraint *)top; +- (MASConstraint *)right; +- (MASConstraint *)bottom; +- (MASConstraint *)leading; +- (MASConstraint *)trailing; +- (MASConstraint *)width; +- (MASConstraint *)height; +- (MASConstraint *)centerX; +- (MASConstraint *)centerY; +- (MASConstraint *)baseline; + +/** + * Sets the constraint debug name + */ +- (MASConstraint * (^)(id key))key; + +// NSLayoutConstraint constant Setters +// for use outside of mas_updateConstraints/mas_makeConstraints blocks + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight + */ +- (void)setInsets:(MASEdgeInsets)insets; + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeWidth, NSLayoutAttributeHeight + */ +- (void)setSizeOffset:(CGSize)sizeOffset; + +/** + * Modifies the NSLayoutConstraint constant, + * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following + * NSLayoutAttributeCenterX, NSLayoutAttributeCenterY + */ +- (void)setCenterOffset:(CGPoint)centerOffset; + +/** + * Modifies the NSLayoutConstraint constant + */ +- (void)setOffset:(CGFloat)offset; + + +// NSLayoutConstraint Installation support + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE +/** + * Whether or not to go through the animator proxy when modifying the constraint + */ +@property (nonatomic, copy, readonly) MASConstraint *animator; +#endif + +/** + * Activates an NSLayoutConstraint if it's supported by an OS. + * Invokes install otherwise. + */ +- (void)activate; + +/** + * Deactivates previously installed/activated NSLayoutConstraint. + */ +- (void)deactivate; + +/** + * Creates a NSLayoutConstraint and adds it to the appropriate view. + */ +- (void)install; + +/** + * Removes previously installed NSLayoutConstraint + */ +- (void)uninstall; + +@end + + +/** + * Convenience auto-boxing macros for MASConstraint methods. + * + * Defining MAS_SHORTHAND_GLOBALS will turn on auto-boxing for default syntax. + * A potential drawback of this is that the unprefixed macros will appear in global scope. + */ +#define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__))) +#define mas_greaterThanOrEqualTo(...) greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__))) +#define mas_lessThanOrEqualTo(...) lessThanOrEqualTo(MASBoxValue((__VA_ARGS__))) + +#define mas_offset(...) valueOffset(MASBoxValue((__VA_ARGS__))) + + +#ifdef MAS_SHORTHAND_GLOBALS + +#define equalTo(...) mas_equalTo(__VA_ARGS__) +#define greaterThanOrEqualTo(...) mas_greaterThanOrEqualTo(__VA_ARGS__) +#define lessThanOrEqualTo(...) mas_lessThanOrEqualTo(__VA_ARGS__) + +#define offset(...) mas_offset(__VA_ARGS__) + +#endif + + +@interface MASConstraint (AutoboxingSupport) + +/** + * Aliases to corresponding relation methods (for shorthand macros) + * Also needed to aid autocompletion + */ +- (MASConstraint * (^)(id attr))mas_equalTo; +- (MASConstraint * (^)(id attr))mas_greaterThanOrEqualTo; +- (MASConstraint * (^)(id attr))mas_lessThanOrEqualTo; + +/** + * A dummy method to aid autocompletion + */ +- (MASConstraint * (^)(id offset))mas_offset; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASConstraint.m b/Example/Pods/Masonry/Masonry/MASConstraint.m new file mode 100644 index 0000000..78ce96a --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASConstraint.m @@ -0,0 +1,245 @@ +// +// MASConstraint.m +// Masonry +// +// Created by Nick Tymchenko on 1/20/14. +// + +#import "MASConstraint.h" +#import "MASConstraint+Private.h" + +#define MASMethodNotImplemented() \ + @throw [NSException exceptionWithName:NSInternalInconsistencyException \ + reason:[NSString stringWithFormat:@"You must override %@ in a subclass.", NSStringFromSelector(_cmd)] \ + userInfo:nil] + +@implementation MASConstraint + +#pragma mark - Init + +- (id)init { + NSAssert(![self isMemberOfClass:[MASConstraint class]], @"MASConstraint is an abstract class, you should not instantiate it directly."); + return [super init]; +} + +#pragma mark - NSLayoutRelation proxies + +- (MASConstraint * (^)(id))equalTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationEqual); + }; +} + +- (MASConstraint * (^)(id))mas_equalTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationEqual); + }; +} + +- (MASConstraint * (^)(id))greaterThanOrEqualTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual); + }; +} + +- (MASConstraint * (^)(id))mas_greaterThanOrEqualTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual); + }; +} + +- (MASConstraint * (^)(id))lessThanOrEqualTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual); + }; +} + +- (MASConstraint * (^)(id))mas_lessThanOrEqualTo { + return ^id(id attribute) { + return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual); + }; +} + +#pragma mark - MASLayoutPriority proxies + +- (MASConstraint * (^)())priorityLow { + return ^id{ + self.priority(MASLayoutPriorityDefaultLow); + return self; + }; +} + +- (MASConstraint * (^)())priorityMedium { + return ^id{ + self.priority(MASLayoutPriorityDefaultMedium); + return self; + }; +} + +- (MASConstraint * (^)())priorityHigh { + return ^id{ + self.priority(MASLayoutPriorityDefaultHigh); + return self; + }; +} + +#pragma mark - NSLayoutConstraint constant proxies + +- (MASConstraint * (^)(MASEdgeInsets))insets { + return ^id(MASEdgeInsets insets){ + self.insets = insets; + return self; + }; +} + +- (MASConstraint * (^)(CGSize))sizeOffset { + return ^id(CGSize offset) { + self.sizeOffset = offset; + return self; + }; +} + +- (MASConstraint * (^)(CGPoint))centerOffset { + return ^id(CGPoint offset) { + self.centerOffset = offset; + return self; + }; +} + +- (MASConstraint * (^)(CGFloat))offset { + return ^id(CGFloat offset){ + self.offset = offset; + return self; + }; +} + +- (MASConstraint * (^)(NSValue *value))valueOffset { + return ^id(NSValue *offset) { + NSAssert([offset isKindOfClass:NSValue.class], @"expected an NSValue offset, got: %@", offset); + [self setLayoutConstantWithValue:offset]; + return self; + }; +} + +- (MASConstraint * (^)(id offset))mas_offset { + // Will never be called due to macro + return nil; +} + +#pragma mark - NSLayoutConstraint constant setter + +- (void)setLayoutConstantWithValue:(NSValue *)value { + if ([value isKindOfClass:NSNumber.class]) { + self.offset = [(NSNumber *)value doubleValue]; + } else if (strcmp(value.objCType, @encode(CGPoint)) == 0) { + CGPoint point; + [value getValue:&point]; + self.centerOffset = point; + } else if (strcmp(value.objCType, @encode(CGSize)) == 0) { + CGSize size; + [value getValue:&size]; + self.sizeOffset = size; + } else if (strcmp(value.objCType, @encode(MASEdgeInsets)) == 0) { + MASEdgeInsets insets; + [value getValue:&insets]; + self.insets = insets; + } else { + NSAssert(NO, @"attempting to set layout constant with unsupported value: %@", value); + } +} + +#pragma mark - Semantic properties + +- (MASConstraint *)with { + return self; +} + +- (MASConstraint *)and { + return self; +} + +#pragma mark - Chaining + +- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute __unused)layoutAttribute { + MASMethodNotImplemented(); +} + +- (MASConstraint *)left { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft]; +} + +- (MASConstraint *)top { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop]; +} + +- (MASConstraint *)right { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight]; +} + +- (MASConstraint *)bottom { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom]; +} + +- (MASConstraint *)leading { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading]; +} + +- (MASConstraint *)trailing { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing]; +} + +- (MASConstraint *)width { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth]; +} + +- (MASConstraint *)height { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight]; +} + +- (MASConstraint *)centerX { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX]; +} + +- (MASConstraint *)centerY { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY]; +} + +- (MASConstraint *)baseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline]; +} + +#pragma mark - Abstract + +- (MASConstraint * (^)(CGFloat multiplier))multipliedBy { MASMethodNotImplemented(); } + +- (MASConstraint * (^)(CGFloat divider))dividedBy { MASMethodNotImplemented(); } + +- (MASConstraint * (^)(MASLayoutPriority priority))priority { MASMethodNotImplemented(); } + +- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { MASMethodNotImplemented(); } + +- (MASConstraint * (^)(id key))key { MASMethodNotImplemented(); } + +- (void)setInsets:(MASEdgeInsets __unused)insets { MASMethodNotImplemented(); } + +- (void)setSizeOffset:(CGSize __unused)sizeOffset { MASMethodNotImplemented(); } + +- (void)setCenterOffset:(CGPoint __unused)centerOffset { MASMethodNotImplemented(); } + +- (void)setOffset:(CGFloat __unused)offset { MASMethodNotImplemented(); } + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + +- (MASConstraint *)animator { MASMethodNotImplemented(); } + +#endif + +- (void)activate { MASMethodNotImplemented(); } + +- (void)deactivate { MASMethodNotImplemented(); } + +- (void)install { MASMethodNotImplemented(); } + +- (void)uninstall { MASMethodNotImplemented(); } + +@end diff --git a/Example/Pods/Masonry/Masonry/MASConstraintMaker.h b/Example/Pods/Masonry/Masonry/MASConstraintMaker.h new file mode 100644 index 0000000..d8e7fc2 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASConstraintMaker.h @@ -0,0 +1,105 @@ +// +// MASConstraintBuilder.h +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASConstraint.h" +#import "MASUtilities.h" + +typedef NS_OPTIONS(NSInteger, MASAttribute) { + MASAttributeLeft = 1 << NSLayoutAttributeLeft, + MASAttributeRight = 1 << NSLayoutAttributeRight, + MASAttributeTop = 1 << NSLayoutAttributeTop, + MASAttributeBottom = 1 << NSLayoutAttributeBottom, + MASAttributeLeading = 1 << NSLayoutAttributeLeading, + MASAttributeTrailing = 1 << NSLayoutAttributeTrailing, + MASAttributeWidth = 1 << NSLayoutAttributeWidth, + MASAttributeHeight = 1 << NSLayoutAttributeHeight, + MASAttributeCenterX = 1 << NSLayoutAttributeCenterX, + MASAttributeCenterY = 1 << NSLayoutAttributeCenterY, + MASAttributeBaseline = 1 << NSLayoutAttributeBaseline, +}; + +/** + * Provides factory methods for creating MASConstraints. + * Constraints are collected until they are ready to be installed + * + */ +@interface MASConstraintMaker : NSObject + +/** + * The following properties return a new MASViewConstraint + * with the first item set to the makers associated view and the appropriate MASViewAttribute + */ +@property (nonatomic, strong, readonly) MASConstraint *left; +@property (nonatomic, strong, readonly) MASConstraint *top; +@property (nonatomic, strong, readonly) MASConstraint *right; +@property (nonatomic, strong, readonly) MASConstraint *bottom; +@property (nonatomic, strong, readonly) MASConstraint *leading; +@property (nonatomic, strong, readonly) MASConstraint *trailing; +@property (nonatomic, strong, readonly) MASConstraint *width; +@property (nonatomic, strong, readonly) MASConstraint *height; +@property (nonatomic, strong, readonly) MASConstraint *centerX; +@property (nonatomic, strong, readonly) MASConstraint *centerY; +@property (nonatomic, strong, readonly) MASConstraint *baseline; + +/** + * Returns a block which creates a new MASCompositeConstraint with the first item set + * to the makers associated view and children corresponding to the set bits in the + * MASAttribute parameter. Combine multiple attributes via binary-or. + */ +@property (nonatomic, strong, readonly) MASConstraint *(^attributes)(MASAttribute attrs); + +/** + * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeEdges + * which generates the appropriate MASViewConstraint children (top, left, bottom, right) + * with the first item set to the makers associated view + */ +@property (nonatomic, strong, readonly) MASConstraint *edges; + +/** + * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeSize + * which generates the appropriate MASViewConstraint children (width, height) + * with the first item set to the makers associated view + */ +@property (nonatomic, strong, readonly) MASConstraint *size; + +/** + * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeCenter + * which generates the appropriate MASViewConstraint children (centerX, centerY) + * with the first item set to the makers associated view + */ +@property (nonatomic, strong, readonly) MASConstraint *center; + +/** + * Whether or not to check for an existing constraint instead of adding constraint + */ +@property (nonatomic, assign) BOOL updateExisting; + +/** + * Whether or not to remove existing constraints prior to installing + */ +@property (nonatomic, assign) BOOL removeExisting; + +/** + * initialises the maker with a default view + * + * @param view any MASConstrait are created with this view as the first item + * + * @return a new MASConstraintMaker + */ +- (id)initWithView:(MAS_VIEW *)view; + +/** + * Calls install method on any MASConstraints which have been created by this maker + * + * @return an array of all the installed MASConstraints + */ +- (NSArray *)install; + +- (MASConstraint * (^)(dispatch_block_t))group; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASConstraintMaker.m b/Example/Pods/Masonry/Masonry/MASConstraintMaker.m new file mode 100644 index 0000000..b7206e0 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASConstraintMaker.m @@ -0,0 +1,193 @@ +// +// MASConstraintBuilder.m +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASConstraintMaker.h" +#import "MASViewConstraint.h" +#import "MASCompositeConstraint.h" +#import "MASConstraint+Private.h" +#import "MASViewAttribute.h" +#import "View+MASAdditions.h" + +@interface MASConstraintMaker () + +@property (nonatomic, weak) MAS_VIEW *view; +@property (nonatomic, strong) NSMutableArray *constraints; + +@end + +@implementation MASConstraintMaker + +- (id)initWithView:(MAS_VIEW *)view { + self = [super init]; + if (!self) return nil; + + self.view = view; + self.constraints = NSMutableArray.new; + + return self; +} + +- (NSArray *)install { + if (self.removeExisting) { + NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view]; + for (MASConstraint *constraint in installedConstraints) { + [constraint uninstall]; + } + } + NSArray *constraints = self.constraints.copy; + for (MASConstraint *constraint in constraints) { + constraint.updateExisting = self.updateExisting; + [constraint install]; + } + [self.constraints removeAllObjects]; + return constraints; +} + +#pragma mark - MASConstraintDelegate + +- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint { + NSUInteger index = [self.constraints indexOfObject:constraint]; + NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint); + [self.constraints replaceObjectAtIndex:index withObject:replacementConstraint]; +} + +- (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { + MASViewAttribute *viewAttribute = [[MASViewAttribute alloc] initWithView:self.view layoutAttribute:layoutAttribute]; + MASViewConstraint *newConstraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:viewAttribute]; + if ([constraint isKindOfClass:MASViewConstraint.class]) { + //replace with composite constraint + NSArray *children = @[constraint, newConstraint]; + MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children]; + compositeConstraint.delegate = self; + [self constraint:constraint shouldBeReplacedWithConstraint:compositeConstraint]; + return compositeConstraint; + } + if (!constraint) { + newConstraint.delegate = self; + [self.constraints addObject:newConstraint]; + } + return newConstraint; +} + +- (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs { + __unused MASAttribute anyAttribute = MASAttributeLeft | MASAttributeRight | MASAttributeTop | MASAttributeBottom | MASAttributeLeading | MASAttributeTrailing | MASAttributeWidth | MASAttributeHeight | MASAttributeCenterX | MASAttributeCenterY | MASAttributeBaseline; + + NSAssert((attrs & anyAttribute) != 0, @"You didn't pass any attribute to make.attributes(...)"); + + NSMutableArray *attributes = [NSMutableArray array]; + + if (attrs & MASAttributeLeft) [attributes addObject:self.view.mas_left]; + if (attrs & MASAttributeRight) [attributes addObject:self.view.mas_right]; + if (attrs & MASAttributeTop) [attributes addObject:self.view.mas_top]; + if (attrs & MASAttributeBottom) [attributes addObject:self.view.mas_bottom]; + if (attrs & MASAttributeLeading) [attributes addObject:self.view.mas_leading]; + if (attrs & MASAttributeTrailing) [attributes addObject:self.view.mas_trailing]; + if (attrs & MASAttributeWidth) [attributes addObject:self.view.mas_width]; + if (attrs & MASAttributeHeight) [attributes addObject:self.view.mas_height]; + if (attrs & MASAttributeCenterX) [attributes addObject:self.view.mas_centerX]; + if (attrs & MASAttributeCenterY) [attributes addObject:self.view.mas_centerY]; + if (attrs & MASAttributeBaseline) [attributes addObject:self.view.mas_baseline]; + + NSMutableArray *children = [NSMutableArray arrayWithCapacity:attributes.count]; + + for (MASViewAttribute *a in attributes) { + [children addObject:[[MASViewConstraint alloc] initWithFirstViewAttribute:a]]; + } + + MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children]; + constraint.delegate = self; + [self.constraints addObject:constraint]; + return constraint; +} + +#pragma mark - standard Attributes + +- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { + return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute]; +} + +- (MASConstraint *)left { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft]; +} + +- (MASConstraint *)top { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop]; +} + +- (MASConstraint *)right { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight]; +} + +- (MASConstraint *)bottom { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom]; +} + +- (MASConstraint *)leading { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading]; +} + +- (MASConstraint *)trailing { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing]; +} + +- (MASConstraint *)width { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth]; +} + +- (MASConstraint *)height { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight]; +} + +- (MASConstraint *)centerX { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX]; +} + +- (MASConstraint *)centerY { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY]; +} + +- (MASConstraint *)baseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline]; +} + +- (MASConstraint *(^)(MASAttribute))attributes { + return ^(MASAttribute attrs){ + return [self addConstraintWithAttributes:attrs]; + }; +} + + +#pragma mark - composite Attributes + +- (MASConstraint *)edges { + return [self addConstraintWithAttributes:MASAttributeTop | MASAttributeLeft | MASAttributeRight | MASAttributeBottom]; +} + +- (MASConstraint *)size { + return [self addConstraintWithAttributes:MASAttributeWidth | MASAttributeHeight]; +} + +- (MASConstraint *)center { + return [self addConstraintWithAttributes:MASAttributeCenterX | MASAttributeCenterY]; +} + +#pragma mark - grouping + +- (MASConstraint *(^)(dispatch_block_t group))group { + return ^id(dispatch_block_t group) { + NSInteger previousCount = self.constraints.count; + group(); + + NSArray *children = [self.constraints subarrayWithRange:NSMakeRange(previousCount, self.constraints.count - previousCount)]; + MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children]; + constraint.delegate = self; + return constraint; + }; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/MASLayoutConstraint.h b/Example/Pods/Masonry/Masonry/MASLayoutConstraint.h new file mode 100644 index 0000000..699041c --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASLayoutConstraint.h @@ -0,0 +1,22 @@ +// +// MASLayoutConstraint.h +// Masonry +// +// Created by Jonas Budelmann on 3/08/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "MASUtilities.h" + +/** + * When you are debugging or printing the constraints attached to a view this subclass + * makes it easier to identify which constraints have been created via Masonry + */ +@interface MASLayoutConstraint : NSLayoutConstraint + +/** + * a key to associate with this constraint + */ +@property (nonatomic, strong) id mas_key; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASLayoutConstraint.m b/Example/Pods/Masonry/Masonry/MASLayoutConstraint.m new file mode 100644 index 0000000..3483f02 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASLayoutConstraint.m @@ -0,0 +1,13 @@ +// +// MASLayoutConstraint.m +// Masonry +// +// Created by Jonas Budelmann on 3/08/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "MASLayoutConstraint.h" + +@implementation MASLayoutConstraint + +@end diff --git a/Example/Pods/Masonry/Masonry/MASUtilities.h b/Example/Pods/Masonry/Masonry/MASUtilities.h new file mode 100644 index 0000000..472d7a1 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASUtilities.h @@ -0,0 +1,131 @@ +// +// MASUtilities.h +// Masonry +// +// Created by Jonas Budelmann on 19/08/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import + +#if TARGET_OS_IPHONE + + #import + #define MAS_VIEW UIView + #define MASEdgeInsets UIEdgeInsets + + typedef UILayoutPriority MASLayoutPriority; + static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired; + static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh; + static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500; + static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow; + static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel; + +#elif TARGET_OS_MAC + + #import + #define MAS_VIEW NSView + #define MASEdgeInsets NSEdgeInsets + + typedef NSLayoutPriority MASLayoutPriority; + static const MASLayoutPriority MASLayoutPriorityRequired = NSLayoutPriorityRequired; + static const MASLayoutPriority MASLayoutPriorityDefaultHigh = NSLayoutPriorityDefaultHigh; + static const MASLayoutPriority MASLayoutPriorityDragThatCanResizeWindow = NSLayoutPriorityDragThatCanResizeWindow; + static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 501; + static const MASLayoutPriority MASLayoutPriorityWindowSizeStayPut = NSLayoutPriorityWindowSizeStayPut; + static const MASLayoutPriority MASLayoutPriorityDragThatCannotResizeWindow = NSLayoutPriorityDragThatCannotResizeWindow; + static const MASLayoutPriority MASLayoutPriorityDefaultLow = NSLayoutPriorityDefaultLow; + static const MASLayoutPriority MASLayoutPriorityFittingSizeCompression = NSLayoutPriorityFittingSizeCompression; + +#endif + +/** + * Allows you to attach keys to objects matching the variable names passed. + * + * view1.mas_key = @"view1", view2.mas_key = @"view2"; + * + * is equivalent to: + * + * MASAttachKeys(view1, view2); + */ +#define MASAttachKeys(...) \ + NSDictionary *keyPairs = NSDictionaryOfVariableBindings(__VA_ARGS__); \ + for (id key in keyPairs.allKeys) { \ + id obj = keyPairs[key]; \ + NSAssert([obj respondsToSelector:@selector(setMas_key:)], \ + @"Cannot attach mas_key to %@", obj); \ + [obj setMas_key:key]; \ + } + +/** + * Used to create object hashes + * Based on http://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html + */ +#define MAS_NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger)) +#define MAS_NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (MAS_NSUINT_BIT - howmuch))) + +/** + * Given a scalar or struct value, wraps it in NSValue + * Based on EXPObjectify: https://github.com/specta/expecta + */ +static inline id _MASBoxValue(const char *type, ...) { + va_list v; + va_start(v, type); + id obj = nil; + if (strcmp(type, @encode(id)) == 0) { + id actual = va_arg(v, id); + obj = actual; + } else if (strcmp(type, @encode(CGPoint)) == 0) { + CGPoint actual = (CGPoint)va_arg(v, CGPoint); + obj = [NSValue value:&actual withObjCType:type]; + } else if (strcmp(type, @encode(CGSize)) == 0) { + CGSize actual = (CGSize)va_arg(v, CGSize); + obj = [NSValue value:&actual withObjCType:type]; + } else if (strcmp(type, @encode(MASEdgeInsets)) == 0) { + MASEdgeInsets actual = (MASEdgeInsets)va_arg(v, MASEdgeInsets); + obj = [NSValue value:&actual withObjCType:type]; + } else if (strcmp(type, @encode(double)) == 0) { + double actual = (double)va_arg(v, double); + obj = [NSNumber numberWithDouble:actual]; + } else if (strcmp(type, @encode(float)) == 0) { + float actual = (float)va_arg(v, double); + obj = [NSNumber numberWithFloat:actual]; + } else if (strcmp(type, @encode(int)) == 0) { + int actual = (int)va_arg(v, int); + obj = [NSNumber numberWithInt:actual]; + } else if (strcmp(type, @encode(long)) == 0) { + long actual = (long)va_arg(v, long); + obj = [NSNumber numberWithLong:actual]; + } else if (strcmp(type, @encode(long long)) == 0) { + long long actual = (long long)va_arg(v, long long); + obj = [NSNumber numberWithLongLong:actual]; + } else if (strcmp(type, @encode(short)) == 0) { + short actual = (short)va_arg(v, int); + obj = [NSNumber numberWithShort:actual]; + } else if (strcmp(type, @encode(char)) == 0) { + char actual = (char)va_arg(v, int); + obj = [NSNumber numberWithChar:actual]; + } else if (strcmp(type, @encode(bool)) == 0) { + bool actual = (bool)va_arg(v, int); + obj = [NSNumber numberWithBool:actual]; + } else if (strcmp(type, @encode(unsigned char)) == 0) { + unsigned char actual = (unsigned char)va_arg(v, unsigned int); + obj = [NSNumber numberWithUnsignedChar:actual]; + } else if (strcmp(type, @encode(unsigned int)) == 0) { + unsigned int actual = (unsigned int)va_arg(v, unsigned int); + obj = [NSNumber numberWithUnsignedInt:actual]; + } else if (strcmp(type, @encode(unsigned long)) == 0) { + unsigned long actual = (unsigned long)va_arg(v, unsigned long); + obj = [NSNumber numberWithUnsignedLong:actual]; + } else if (strcmp(type, @encode(unsigned long long)) == 0) { + unsigned long long actual = (unsigned long long)va_arg(v, unsigned long long); + obj = [NSNumber numberWithUnsignedLongLong:actual]; + } else if (strcmp(type, @encode(unsigned short)) == 0) { + unsigned short actual = (unsigned short)va_arg(v, unsigned int); + obj = [NSNumber numberWithUnsignedShort:actual]; + } + va_end(v); + return obj; +} + +#define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value)) diff --git a/Example/Pods/Masonry/Masonry/MASViewAttribute.h b/Example/Pods/Masonry/Masonry/MASViewAttribute.h new file mode 100644 index 0000000..f594f48 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASViewAttribute.h @@ -0,0 +1,39 @@ +// +// MASAttribute.h +// Masonry +// +// Created by Jonas Budelmann on 21/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASUtilities.h" + +/** + * An immutable tuple which stores the view and the related NSLayoutAttribute. + * Describes part of either the left or right hand side of a constraint equation + */ +@interface MASViewAttribute : NSObject + +/** + * The view which the reciever relates to + */ +@property (nonatomic, weak, readonly) MAS_VIEW *view; + +/** + * The attribute which the reciever relates to + */ +@property (nonatomic, assign, readonly) NSLayoutAttribute layoutAttribute; + +/** + * The designated initializer. + */ +- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute; + +/** + * Determine whether the layoutAttribute is a size attribute + * + * @return YES if layoutAttribute is equal to NSLayoutAttributeWidth or NSLayoutAttributeHeight + */ +- (BOOL)isSizeAttribute; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASViewAttribute.m b/Example/Pods/Masonry/Masonry/MASViewAttribute.m new file mode 100644 index 0000000..1032826 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASViewAttribute.m @@ -0,0 +1,40 @@ +// +// MASAttribute.m +// Masonry +// +// Created by Jonas Budelmann on 21/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASViewAttribute.h" + +@implementation MASViewAttribute + +- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute { + self = [super init]; + if (!self) return nil; + + _view = view; + _layoutAttribute = layoutAttribute; + + return self; +} + +- (BOOL)isSizeAttribute { + return self.layoutAttribute == NSLayoutAttributeWidth + || self.layoutAttribute == NSLayoutAttributeHeight; +} + +- (BOOL)isEqual:(MASViewAttribute *)viewAttribute { + if ([viewAttribute isKindOfClass:self.class]) { + return self.view == viewAttribute.view + && self.layoutAttribute == viewAttribute.layoutAttribute; + } + return [super isEqual:viewAttribute]; +} + +- (NSUInteger)hash { + return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/MASViewConstraint.h b/Example/Pods/Masonry/Masonry/MASViewConstraint.h new file mode 100644 index 0000000..5c78f7a --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASViewConstraint.h @@ -0,0 +1,48 @@ +// +// MASConstraint.h +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASViewAttribute.h" +#import "MASConstraint.h" +#import "MASLayoutConstraint.h" +#import "MASUtilities.h" + +/** + * A single constraint. + * Contains the attributes neccessary for creating a NSLayoutConstraint and adding it to the appropriate view + */ +@interface MASViewConstraint : MASConstraint + +/** + * First item/view and first attribute of the NSLayoutConstraint + */ +@property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute; + +/** + * Second item/view and second attribute of the NSLayoutConstraint + */ +@property (nonatomic, strong, readonly) MASViewAttribute *secondViewAttribute; + +/** + * initialises the MASViewConstraint with the first part of the equation + * + * @param firstViewAttribute view.mas_left, view.mas_width etc. + * + * @return a new view constraint + */ +- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute; + +/** + * Returns all MASViewConstraints installed with this view as a first item. + * + * @param view A view to retrieve constraints for. + * + * @return An array of MASViewConstraints. + */ ++ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view; + +@end diff --git a/Example/Pods/Masonry/Masonry/MASViewConstraint.m b/Example/Pods/Masonry/Masonry/MASViewConstraint.m new file mode 100644 index 0000000..aa2434f --- /dev/null +++ b/Example/Pods/Masonry/Masonry/MASViewConstraint.m @@ -0,0 +1,395 @@ +// +// MASConstraint.m +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASViewConstraint.h" +#import "MASConstraint+Private.h" +#import "MASCompositeConstraint.h" +#import "MASLayoutConstraint.h" +#import "View+MASAdditions.h" +#import + +@interface MAS_VIEW (MASConstraints) + +@property (nonatomic, readonly) NSMutableSet *mas_installedConstraints; + +@end + +@implementation MAS_VIEW (MASConstraints) + +static char kInstalledConstraintsKey; + +- (NSMutableSet *)mas_installedConstraints { + NSMutableSet *constraints = objc_getAssociatedObject(self, &kInstalledConstraintsKey); + if (!constraints) { + constraints = [NSMutableSet set]; + objc_setAssociatedObject(self, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return constraints; +} + +@end + + +@interface MASViewConstraint () + +@property (nonatomic, strong, readwrite) MASViewAttribute *secondViewAttribute; +@property (nonatomic, weak) MAS_VIEW *installedView; +@property (nonatomic, weak) MASLayoutConstraint *layoutConstraint; +@property (nonatomic, assign) NSLayoutRelation layoutRelation; +@property (nonatomic, assign) MASLayoutPriority layoutPriority; +@property (nonatomic, assign) CGFloat layoutMultiplier; +@property (nonatomic, assign) CGFloat layoutConstant; +@property (nonatomic, assign) BOOL hasLayoutRelation; +@property (nonatomic, strong) id mas_key; +@property (nonatomic, assign) BOOL useAnimator; + +@end + +@implementation MASViewConstraint + +- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute { + self = [super init]; + if (!self) return nil; + + _firstViewAttribute = firstViewAttribute; + self.layoutPriority = MASLayoutPriorityRequired; + self.layoutMultiplier = 1; + + return self; +} + +#pragma mark - NSCoping + +- (id)copyWithZone:(NSZone __unused *)zone { + MASViewConstraint *constraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:self.firstViewAttribute]; + constraint.layoutConstant = self.layoutConstant; + constraint.layoutRelation = self.layoutRelation; + constraint.layoutPriority = self.layoutPriority; + constraint.layoutMultiplier = self.layoutMultiplier; + constraint.delegate = self.delegate; + return constraint; +} + +#pragma mark - Public + ++ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view { + return [view.mas_installedConstraints allObjects]; +} + +#pragma mark - Private + +- (void)setLayoutConstant:(CGFloat)layoutConstant { + _layoutConstant = layoutConstant; + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + if (self.useAnimator) { + [self.layoutConstraint.animator setConstant:layoutConstant]; + } else { + self.layoutConstraint.constant = layoutConstant; + } +#else + self.layoutConstraint.constant = layoutConstant; +#endif +} + +- (void)setLayoutRelation:(NSLayoutRelation)layoutRelation { + _layoutRelation = layoutRelation; + self.hasLayoutRelation = YES; +} + +- (BOOL)supportsActiveProperty { + return [self.layoutConstraint respondsToSelector:@selector(isActive)]; +} + +- (BOOL)isActive { + BOOL active = YES; + if ([self supportsActiveProperty]) { + active = [self.layoutConstraint isActive]; + } + + return active; +} + +- (BOOL)hasBeenInstalled { + return (self.layoutConstraint != nil) && [self isActive]; +} + +- (void)setSecondViewAttribute:(id)secondViewAttribute { + if ([secondViewAttribute isKindOfClass:NSValue.class]) { + [self setLayoutConstantWithValue:secondViewAttribute]; + } else if ([secondViewAttribute isKindOfClass:MAS_VIEW.class]) { + _secondViewAttribute = [[MASViewAttribute alloc] initWithView:secondViewAttribute layoutAttribute:self.firstViewAttribute.layoutAttribute]; + } else if ([secondViewAttribute isKindOfClass:MASViewAttribute.class]) { + _secondViewAttribute = secondViewAttribute; + } else { + NSAssert(NO, @"attempting to add unsupported attribute: %@", secondViewAttribute); + } +} + +#pragma mark - NSLayoutConstraint multiplier proxies + +- (MASConstraint * (^)(CGFloat))multipliedBy { + return ^id(CGFloat multiplier) { + NSAssert(!self.hasBeenInstalled, + @"Cannot modify constraint multiplier after it has been installed"); + + self.layoutMultiplier = multiplier; + return self; + }; +} + + +- (MASConstraint * (^)(CGFloat))dividedBy { + return ^id(CGFloat divider) { + NSAssert(!self.hasBeenInstalled, + @"Cannot modify constraint multiplier after it has been installed"); + + self.layoutMultiplier = 1.0/divider; + return self; + }; +} + +#pragma mark - MASLayoutPriority proxy + +- (MASConstraint * (^)(MASLayoutPriority))priority { + return ^id(MASLayoutPriority priority) { + NSAssert(!self.hasBeenInstalled, + @"Cannot modify constraint priority after it has been installed"); + + self.layoutPriority = priority; + return self; + }; +} + +#pragma mark - NSLayoutRelation proxy + +- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { + return ^id(id attribute, NSLayoutRelation relation) { + if ([attribute isKindOfClass:NSArray.class]) { + NSAssert(!self.hasLayoutRelation, @"Redefinition of constraint relation"); + NSMutableArray *children = NSMutableArray.new; + for (id attr in attribute) { + MASViewConstraint *viewConstraint = [self copy]; + viewConstraint.secondViewAttribute = attr; + [children addObject:viewConstraint]; + } + MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children]; + compositeConstraint.delegate = self.delegate; + [self.delegate constraint:self shouldBeReplacedWithConstraint:compositeConstraint]; + return compositeConstraint; + } else { + NSAssert(!self.hasLayoutRelation || self.layoutRelation == relation && [attribute isKindOfClass:NSValue.class], @"Redefinition of constraint relation"); + self.layoutRelation = relation; + self.secondViewAttribute = attribute; + return self; + } + }; +} + +#pragma mark - Semantic properties + +- (MASConstraint *)with { + return self; +} + +- (MASConstraint *)and { + return self; +} + +#pragma mark - attribute chaining + +- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute { + NSAssert(!self.hasLayoutRelation, @"Attributes should be chained before defining the constraint relation"); + + return [self.delegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute]; +} + +#pragma mark - Animator proxy + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + +- (MASConstraint *)animator { + self.useAnimator = YES; + return self; +} + +#endif + +#pragma mark - debug helpers + +- (MASConstraint * (^)(id))key { + return ^id(id key) { + self.mas_key = key; + return self; + }; +} + +#pragma mark - NSLayoutConstraint constant setters + +- (void)setInsets:(MASEdgeInsets)insets { + NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute; + switch (layoutAttribute) { + case NSLayoutAttributeLeft: + self.layoutConstant = insets.left; + break; + case NSLayoutAttributeTop: + self.layoutConstant = insets.top; + break; + case NSLayoutAttributeBottom: + self.layoutConstant = -insets.bottom; + break; + case NSLayoutAttributeRight: + self.layoutConstant = -insets.right; + break; + default: + break; + } +} + +- (void)setOffset:(CGFloat)offset { + self.layoutConstant = offset; +} + +- (void)setSizeOffset:(CGSize)sizeOffset { + NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute; + switch (layoutAttribute) { + case NSLayoutAttributeWidth: + self.layoutConstant = sizeOffset.width; + break; + case NSLayoutAttributeHeight: + self.layoutConstant = sizeOffset.height; + break; + default: + break; + } +} + +- (void)setCenterOffset:(CGPoint)centerOffset { + NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute; + switch (layoutAttribute) { + case NSLayoutAttributeCenterX: + self.layoutConstant = centerOffset.x; + break; + case NSLayoutAttributeCenterY: + self.layoutConstant = centerOffset.y; + break; + default: + break; + } +} + +#pragma mark - MASConstraint + +- (void)activate { + if ([self supportsActiveProperty] && self.layoutConstraint) { + if (self.hasBeenInstalled) { + return; + } + self.layoutConstraint.active = YES; + [self.firstViewAttribute.view.mas_installedConstraints addObject:self]; + } else { + [self install]; + } +} + +- (void)deactivate { + if ([self supportsActiveProperty]) { + self.layoutConstraint.active = NO; + [self.firstViewAttribute.view.mas_installedConstraints removeObject:self]; + } else { + [self uninstall]; + } +} + +- (void)install { + if (self.hasBeenInstalled) { + return; + } + + MAS_VIEW *firstLayoutItem = self.firstViewAttribute.view; + + NSLayoutAttribute firstLayoutAttribute = self.firstViewAttribute.layoutAttribute; + MAS_VIEW *secondLayoutItem = self.secondViewAttribute.view; + NSLayoutAttribute secondLayoutAttribute = self.secondViewAttribute.layoutAttribute; + + // alignment attributes must have a secondViewAttribute + // therefore we assume that is refering to superview + // eg make.left.equalTo(@10) + if (!self.firstViewAttribute.isSizeAttribute && !self.secondViewAttribute) { + secondLayoutItem = firstLayoutItem.superview; + secondLayoutAttribute = firstLayoutAttribute; + } + + MASLayoutConstraint *layoutConstraint + = [MASLayoutConstraint constraintWithItem:firstLayoutItem + attribute:firstLayoutAttribute + relatedBy:self.layoutRelation + toItem:secondLayoutItem + attribute:secondLayoutAttribute + multiplier:self.layoutMultiplier + constant:self.layoutConstant]; + + layoutConstraint.priority = self.layoutPriority; + layoutConstraint.mas_key = self.mas_key; + + if (secondLayoutItem) { + MAS_VIEW *closestCommonSuperview = [firstLayoutItem mas_closestCommonSuperview:secondLayoutItem]; + NSAssert(closestCommonSuperview, + @"couldn't find a common superview for %@ and %@", + firstLayoutItem, secondLayoutItem); + self.installedView = closestCommonSuperview; + } else { + self.installedView = firstLayoutItem; + } + + + MASLayoutConstraint *existingConstraint = nil; + if (self.updateExisting) { + existingConstraint = [self layoutConstraintSimilarTo:layoutConstraint]; + } + if (existingConstraint) { + // just update the constant + existingConstraint.constant = layoutConstraint.constant; + self.layoutConstraint = existingConstraint; + } else { + [self.installedView addConstraint:layoutConstraint]; + self.layoutConstraint = layoutConstraint; + } + + [firstLayoutItem.mas_installedConstraints addObject:self]; +} + +- (MASLayoutConstraint *)layoutConstraintSimilarTo:(MASLayoutConstraint *)layoutConstraint { + // check if any constraints are the same apart from the only mutable property constant + + // go through constraints in reverse as we do not want to match auto-resizing or interface builder constraints + // and they are likely to be added first. + for (NSLayoutConstraint *existingConstraint in self.installedView.constraints.reverseObjectEnumerator) { + if (![existingConstraint isKindOfClass:MASLayoutConstraint.class]) continue; + if (existingConstraint.firstItem != layoutConstraint.firstItem) continue; + if (existingConstraint.secondItem != layoutConstraint.secondItem) continue; + if (existingConstraint.firstAttribute != layoutConstraint.firstAttribute) continue; + if (existingConstraint.secondAttribute != layoutConstraint.secondAttribute) continue; + if (existingConstraint.relation != layoutConstraint.relation) continue; + if (existingConstraint.multiplier != layoutConstraint.multiplier) continue; + if (existingConstraint.priority != layoutConstraint.priority) continue; + + return (id)existingConstraint; + } + return nil; +} + +- (void)uninstall { + [self.installedView removeConstraint:self.layoutConstraint]; + self.layoutConstraint = nil; + self.installedView = nil; + + [self.firstViewAttribute.view.mas_installedConstraints removeObject:self]; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/Masonry.h b/Example/Pods/Masonry/Masonry/Masonry.h new file mode 100644 index 0000000..0a1c7ba --- /dev/null +++ b/Example/Pods/Masonry/Masonry/Masonry.h @@ -0,0 +1,20 @@ +// +// Masonry.h +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASUtilities.h" +#import "View+MASAdditions.h" +#import "View+MASShorthandAdditions.h" +#import "NSArray+MASAdditions.h" +#import "NSArray+MASShorthandAdditions.h" +#import "MASConstraint.h" +#import "MASCompositeConstraint.h" +#import "MASViewAttribute.h" +#import "MASViewConstraint.h" +#import "MASConstraintMaker.h" +#import "MASLayoutConstraint.h" +#import "NSLayoutConstraint+MASDebugAdditions.h" diff --git a/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.h b/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.h new file mode 100644 index 0000000..189d51f --- /dev/null +++ b/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.h @@ -0,0 +1,47 @@ +// +// NSArray+MASAdditions.h +// +// +// Created by Daniel Hammond on 11/26/13. +// +// + +#import "MASUtilities.h" +#import "MASConstraintMaker.h" +#import "MASViewAttribute.h" + +@interface NSArray (MASAdditions) + +/** + * Creates a MASConstraintMaker with each view in the callee. + * Any constraints defined are added to the view or the appropriate superview once the block has finished executing on each view + * + * @param block scope within which you can build up the constraints which you wish to apply to each view. + * + * @return Array of created MASConstraints + */ +- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block; + +/** + * Creates a MASConstraintMaker with each view in the callee. + * Any constraints defined are added to each view or the appropriate superview once the block has finished executing on each view. + * If an existing constraint exists then it will be updated instead. + * + * @param block scope within which you can build up the constraints which you wish to apply to each view. + * + * @return Array of created/updated MASConstraints + */ +- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block; + +/** + * Creates a MASConstraintMaker with each view in the callee. + * Any constraints defined are added to each view or the appropriate superview once the block has finished executing on each view. + * All constraints previously installed for the views will be removed. + * + * @param block scope within which you can build up the constraints which you wish to apply to each view. + * + * @return Array of created/updated MASConstraints + */ +- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block; + +@end diff --git a/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.m b/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.m new file mode 100644 index 0000000..dbbe671 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/NSArray+MASAdditions.m @@ -0,0 +1,41 @@ +// +// NSArray+MASAdditions.m +// +// +// Created by Daniel Hammond on 11/26/13. +// +// + +#import "NSArray+MASAdditions.h" +#import "View+MASAdditions.h" + +@implementation NSArray (MASAdditions) + +- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block { + NSMutableArray *constraints = [NSMutableArray array]; + for (MAS_VIEW *view in self) { + NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views"); + [constraints addObjectsFromArray:[view mas_makeConstraints:block]]; + } + return constraints; +} + +- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block { + NSMutableArray *constraints = [NSMutableArray array]; + for (MAS_VIEW *view in self) { + NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views"); + [constraints addObjectsFromArray:[view mas_updateConstraints:block]]; + } + return constraints; +} + +- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block { + NSMutableArray *constraints = [NSMutableArray array]; + for (MAS_VIEW *view in self) { + NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views"); + [constraints addObjectsFromArray:[view mas_remakeConstraints:block]]; + } + return constraints; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/NSArray+MASShorthandAdditions.h b/Example/Pods/Masonry/Masonry/NSArray+MASShorthandAdditions.h new file mode 100644 index 0000000..8b47369 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/NSArray+MASShorthandAdditions.h @@ -0,0 +1,41 @@ +// +// NSArray+MASShorthandAdditions.h +// Masonry +// +// Created by Jonas Budelmann on 22/07/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "NSArray+MASAdditions.h" + +#ifdef MAS_SHORTHAND + +/** + * Shorthand array additions without the 'mas_' prefixes, + * only enabled if MAS_SHORTHAND is defined + */ +@interface NSArray (MASShorthandAdditions) + +- (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block; +- (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block; +- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block; + +@end + +@implementation NSArray (MASShorthandAdditions) + +- (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_makeConstraints:block]; +} + +- (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_updateConstraints:block]; +} + +- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_remakeConstraints:block]; +} + +@end + +#endif diff --git a/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h b/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h new file mode 100644 index 0000000..1279b4f --- /dev/null +++ b/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h @@ -0,0 +1,16 @@ +// +// NSLayoutConstraint+MASDebugAdditions.h +// Masonry +// +// Created by Jonas Budelmann on 3/08/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "MASUtilities.h" + +/** + * makes debug and log output of NSLayoutConstraints more readable + */ +@interface NSLayoutConstraint (MASDebugAdditions) + +@end diff --git a/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m b/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m new file mode 100644 index 0000000..674943f --- /dev/null +++ b/Example/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m @@ -0,0 +1,129 @@ +// +// NSLayoutConstraint+MASDebugAdditions.m +// Masonry +// +// Created by Jonas Budelmann on 3/08/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "NSLayoutConstraint+MASDebugAdditions.h" +#import "MASConstraint.h" +#import "MASLayoutConstraint.h" + +@implementation NSLayoutConstraint (MASDebugAdditions) + +#pragma mark - description maps + ++ (NSDictionary *)layoutRelationDescriptionsByValue { + static dispatch_once_t once; + static NSDictionary *descriptionMap; + dispatch_once(&once, ^{ + descriptionMap = @{ + @(NSLayoutRelationEqual) : @"==", + @(NSLayoutRelationGreaterThanOrEqual) : @">=", + @(NSLayoutRelationLessThanOrEqual) : @"<=", + }; + }); + return descriptionMap; +} + ++ (NSDictionary *)layoutAttributeDescriptionsByValue { + static dispatch_once_t once; + static NSDictionary *descriptionMap; + dispatch_once(&once, ^{ + descriptionMap = @{ + @(NSLayoutAttributeTop) : @"top", + @(NSLayoutAttributeLeft) : @"left", + @(NSLayoutAttributeBottom) : @"bottom", + @(NSLayoutAttributeRight) : @"right", + @(NSLayoutAttributeLeading) : @"leading", + @(NSLayoutAttributeTrailing) : @"trailing", + @(NSLayoutAttributeWidth) : @"width", + @(NSLayoutAttributeHeight) : @"height", + @(NSLayoutAttributeCenterX) : @"centerX", + @(NSLayoutAttributeCenterY) : @"centerY", + @(NSLayoutAttributeBaseline) : @"baseline", + }; + + }); + return descriptionMap; +} + + ++ (NSDictionary *)layoutPriorityDescriptionsByValue { + static dispatch_once_t once; + static NSDictionary *descriptionMap; + dispatch_once(&once, ^{ +#if TARGET_OS_IPHONE + descriptionMap = @{ + @(MASLayoutPriorityDefaultHigh) : @"high", + @(MASLayoutPriorityDefaultLow) : @"low", + @(MASLayoutPriorityDefaultMedium) : @"medium", + @(MASLayoutPriorityRequired) : @"required", + @(MASLayoutPriorityFittingSizeLevel) : @"fitting size", + }; +#elif TARGET_OS_MAC + descriptionMap = @{ + @(MASLayoutPriorityDefaultHigh) : @"high", + @(MASLayoutPriorityDragThatCanResizeWindow) : @"drag can resize window", + @(MASLayoutPriorityDefaultMedium) : @"medium", + @(MASLayoutPriorityWindowSizeStayPut) : @"window size stay put", + @(MASLayoutPriorityDragThatCannotResizeWindow) : @"drag cannot resize window", + @(MASLayoutPriorityDefaultLow) : @"low", + @(MASLayoutPriorityFittingSizeCompression) : @"fitting size", + @(MASLayoutPriorityRequired) : @"required", + }; +#endif + }); + return descriptionMap; +} + +#pragma mark - description override + ++ (NSString *)descriptionForObject:(id)obj { + if ([obj respondsToSelector:@selector(mas_key)] && [obj mas_key]) { + return [NSString stringWithFormat:@"%@:%@", [obj class], [obj mas_key]]; + } + return [NSString stringWithFormat:@"%@:%p", [obj class], obj]; +} + +- (NSString *)description { + NSMutableString *description = [[NSMutableString alloc] initWithString:@"<"]; + + [description appendString:[self.class descriptionForObject:self]]; + + [description appendFormat:@" %@", [self.class descriptionForObject:self.firstItem]]; + if (self.firstAttribute != NSLayoutAttributeNotAnAttribute) { + [description appendFormat:@".%@", [self.class.layoutAttributeDescriptionsByValue objectForKey:@(self.firstAttribute)]]; + } + + [description appendFormat:@" %@", [self.class.layoutRelationDescriptionsByValue objectForKey:@(self.relation)]]; + + if (self.secondItem) { + [description appendFormat:@" %@", [self.class descriptionForObject:self.secondItem]]; + } + if (self.secondAttribute != NSLayoutAttributeNotAnAttribute) { + [description appendFormat:@".%@", [self.class.layoutAttributeDescriptionsByValue objectForKey:@(self.secondAttribute)]]; + } + + if (self.multiplier != 1) { + [description appendFormat:@" * %g", self.multiplier]; + } + + if (self.secondAttribute == NSLayoutAttributeNotAnAttribute) { + [description appendFormat:@" %g", self.constant]; + } else { + if (self.constant) { + [description appendFormat:@" %@ %g", (self.constant < 0 ? @"-" : @"+"), ABS(self.constant)]; + } + } + + if (self.priority != MASLayoutPriorityRequired) { + [description appendFormat:@" ^%@", [self.class.layoutPriorityDescriptionsByValue objectForKey:@(self.priority)] ?: [NSNumber numberWithDouble:self.priority]]; + } + + [description appendString:@">"]; + return description; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/View+MASAdditions.h b/Example/Pods/Masonry/Masonry/View+MASAdditions.h new file mode 100644 index 0000000..7c29a0f --- /dev/null +++ b/Example/Pods/Masonry/Masonry/View+MASAdditions.h @@ -0,0 +1,81 @@ +// +// UIView+MASAdditions.h +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "MASUtilities.h" +#import "MASConstraintMaker.h" +#import "MASViewAttribute.h" + +/** + * Provides constraint maker block + * and convience methods for creating MASViewAttribute which are view + NSLayoutAttribute pairs + */ +@interface MAS_VIEW (MASAdditions) + +/** + * following properties return a new MASViewAttribute with current view and appropriate NSLayoutAttribute + */ +@property (nonatomic, strong, readonly) MASViewAttribute *mas_left; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_top; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_right; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_bottom; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_leading; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_trailing; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_width; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_height; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerX; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerY; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline; +@property (nonatomic, strong, readonly) MASViewAttribute *(^mas_attribute)(NSLayoutAttribute attr); + +/** + * a key to associate with this view + */ +@property (nonatomic, strong) id mas_key; + +/** + * Finds the closest common superview between this view and another view + * + * @param view other view + * + * @return returns nil if common superview could not be found + */ +- (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view; + +/** + * Creates a MASConstraintMaker with the callee view. + * Any constraints defined are added to the view or the appropriate superview once the block has finished executing + * + * @param block scope within which you can build up the constraints which you wish to apply to the view. + * + * @return Array of created MASConstraints + */ +- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block; + +/** + * Creates a MASConstraintMaker with the callee view. + * Any constraints defined are added to the view or the appropriate superview once the block has finished executing. + * If an existing constraint exists then it will be updated instead. + * + * @param block scope within which you can build up the constraints which you wish to apply to the view. + * + * @return Array of created/updated MASConstraints + */ +- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block; + +/** + * Creates a MASConstraintMaker with the callee view. + * Any constraints defined are added to the view or the appropriate superview once the block has finished executing. + * All constraints previously installed for the view will be removed. + * + * @param block scope within which you can build up the constraints which you wish to apply to the view. + * + * @return Array of created/updated MASConstraints + */ +- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block; + +@end diff --git a/Example/Pods/Masonry/Masonry/View+MASAdditions.m b/Example/Pods/Masonry/Masonry/View+MASAdditions.m new file mode 100644 index 0000000..d91d9fd --- /dev/null +++ b/Example/Pods/Masonry/Masonry/View+MASAdditions.m @@ -0,0 +1,119 @@ +// +// UIView+MASAdditions.m +// Masonry +// +// Created by Jonas Budelmann on 20/07/13. +// Copyright (c) 2013 cloudling. All rights reserved. +// + +#import "View+MASAdditions.h" +#import + +@implementation MAS_VIEW (MASAdditions) + +- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block { + self.translatesAutoresizingMaskIntoConstraints = NO; + MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self]; + block(constraintMaker); + return [constraintMaker install]; +} + +- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block { + self.translatesAutoresizingMaskIntoConstraints = NO; + MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self]; + constraintMaker.updateExisting = YES; + block(constraintMaker); + return [constraintMaker install]; +} + +- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block { + self.translatesAutoresizingMaskIntoConstraints = NO; + MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self]; + constraintMaker.removeExisting = YES; + block(constraintMaker); + return [constraintMaker install]; +} + +#pragma mark - NSLayoutAttribute properties + +- (MASViewAttribute *)mas_left { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft]; +} + +- (MASViewAttribute *)mas_top { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop]; +} + +- (MASViewAttribute *)mas_right { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight]; +} + +- (MASViewAttribute *)mas_bottom { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom]; +} + +- (MASViewAttribute *)mas_leading { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading]; +} + +- (MASViewAttribute *)mas_trailing { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing]; +} + +- (MASViewAttribute *)mas_width { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth]; +} + +- (MASViewAttribute *)mas_height { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight]; +} + +- (MASViewAttribute *)mas_centerX { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX]; +} + +- (MASViewAttribute *)mas_centerY { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY]; +} + +- (MASViewAttribute *)mas_baseline { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline]; +} + +- (MASViewAttribute *(^)(NSLayoutAttribute))mas_attribute +{ + return ^(NSLayoutAttribute attr) { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:attr]; + }; +} + +#pragma mark - associated properties + +- (id)mas_key { + return objc_getAssociatedObject(self, @selector(mas_key)); +} + +- (void)setMas_key:(id)key { + objc_setAssociatedObject(self, @selector(mas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - heirachy + +- (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view { + MAS_VIEW *closestCommonSuperview = nil; + + MAS_VIEW *secondViewSuperview = view; + while (!closestCommonSuperview && secondViewSuperview) { + MAS_VIEW *firstViewSuperview = self; + while (!closestCommonSuperview && firstViewSuperview) { + if (secondViewSuperview == firstViewSuperview) { + closestCommonSuperview = secondViewSuperview; + } + firstViewSuperview = firstViewSuperview.superview; + } + secondViewSuperview = secondViewSuperview.superview; + } + return closestCommonSuperview; +} + +@end diff --git a/Example/Pods/Masonry/Masonry/View+MASShorthandAdditions.h b/Example/Pods/Masonry/Masonry/View+MASShorthandAdditions.h new file mode 100644 index 0000000..9003394 --- /dev/null +++ b/Example/Pods/Masonry/Masonry/View+MASShorthandAdditions.h @@ -0,0 +1,75 @@ +// +// UIView+MASShorthandAdditions.h +// Masonry +// +// Created by Jonas Budelmann on 22/07/13. +// Copyright (c) 2013 Jonas Budelmann. All rights reserved. +// + +#import "View+MASAdditions.h" + +#ifdef MAS_SHORTHAND + +/** + * Shorthand view additions without the 'mas_' prefixes, + * only enabled if MAS_SHORTHAND is defined + */ +@interface MAS_VIEW (MASShorthandAdditions) + +@property (nonatomic, strong, readonly) MASViewAttribute *left; +@property (nonatomic, strong, readonly) MASViewAttribute *top; +@property (nonatomic, strong, readonly) MASViewAttribute *right; +@property (nonatomic, strong, readonly) MASViewAttribute *bottom; +@property (nonatomic, strong, readonly) MASViewAttribute *leading; +@property (nonatomic, strong, readonly) MASViewAttribute *trailing; +@property (nonatomic, strong, readonly) MASViewAttribute *width; +@property (nonatomic, strong, readonly) MASViewAttribute *height; +@property (nonatomic, strong, readonly) MASViewAttribute *centerX; +@property (nonatomic, strong, readonly) MASViewAttribute *centerY; +@property (nonatomic, strong, readonly) MASViewAttribute *baseline; +@property (nonatomic, strong, readonly) MASViewAttribute *(^attribute)(NSLayoutAttribute attr); + +- (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block; +- (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block; +- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block; + +@end + +#define MAS_ATTR_FORWARD(attr) \ +- (MASViewAttribute *)attr { \ + return [self mas_##attr]; \ +} + +@implementation MAS_VIEW (MASShorthandAdditions) + +MAS_ATTR_FORWARD(top); +MAS_ATTR_FORWARD(left); +MAS_ATTR_FORWARD(bottom); +MAS_ATTR_FORWARD(right); +MAS_ATTR_FORWARD(leading); +MAS_ATTR_FORWARD(trailing); +MAS_ATTR_FORWARD(width); +MAS_ATTR_FORWARD(height); +MAS_ATTR_FORWARD(centerX); +MAS_ATTR_FORWARD(centerY); +MAS_ATTR_FORWARD(baseline); + +- (MASViewAttribute *(^)(NSLayoutAttribute))attribute { + return [self mas_attribute]; +} + +- (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_makeConstraints:block]; +} + +- (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_updateConstraints:block]; +} + +- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block { + return [self mas_remakeConstraints:block]; +} + +@end + +#endif diff --git a/Example/Pods/Masonry/README.md b/Example/Pods/Masonry/README.md new file mode 100644 index 0000000..ed758e2 --- /dev/null +++ b/Example/Pods/Masonry/README.md @@ -0,0 +1,363 @@ +#Masonry [![Build Status](https://travis-ci.org/Masonry/Masonry.svg?branch=master)](https://travis-ci.org/Masonry/Masonry) [![Coverage Status](https://img.shields.io/coveralls/Masonry/Masonry.svg?style=flat-square)](https://coveralls.io/r/Masonry/Masonry) + +Masonry is a light-weight layout framework which wraps AutoLayout with a nicer syntax. Masonry has its own layout DSL which provides a chainable way of describing your NSLayoutConstraints which results in layout code that is more concise and readable. +Masonry supports iOS and Mac OS X. + +For examples take a look at the **Masonry iOS Examples** project in the Masonry workspace. You will need to run `pod install` after downloading. + +## What's wrong with NSLayoutConstraints? + +Under the hood Auto Layout is a powerful and flexible way of organising and laying out your views. However creating constraints from code is verbose and not very descriptive. +Imagine a simple example in which you want to have a view fill its superview but inset by 10 pixels on every side +```obj-c +UIView *superview = self; + +UIView *view1 = [[UIView alloc] init]; +view1.translatesAutoresizingMaskIntoConstraints = NO; +view1.backgroundColor = [UIColor greenColor]; +[superview addSubview:view1]; + +UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10); + +[superview addConstraints:@[ + + //view1 constraints + [NSLayoutConstraint constraintWithItem:view1 + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:superview + attribute:NSLayoutAttributeTop + multiplier:1.0 + constant:padding.top], + + [NSLayoutConstraint constraintWithItem:view1 + attribute:NSLayoutAttributeLeft + relatedBy:NSLayoutRelationEqual + toItem:superview + attribute:NSLayoutAttributeLeft + multiplier:1.0 + constant:padding.left], + + [NSLayoutConstraint constraintWithItem:view1 + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:superview + attribute:NSLayoutAttributeBottom + multiplier:1.0 + constant:-padding.bottom], + + [NSLayoutConstraint constraintWithItem:view1 + attribute:NSLayoutAttributeRight + relatedBy:NSLayoutRelationEqual + toItem:superview + attribute:NSLayoutAttributeRight + multiplier:1 + constant:-padding.right], + + ]]; +``` +Even with such a simple example the code needed is quite verbose and quickly becomes unreadable when you have more than 2 or 3 views. +Another option is to use Visual Format Language (VFL), which is a bit less long winded. +However the ASCII type syntax has its own pitfalls and its also a bit harder to animate as `NSLayoutConstraint constraintsWithVisualFormat:` returns an array. + +## Prepare to meet your Maker! + +Heres the same constraints created using MASConstraintMaker + +```obj-c +UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10); + +[view1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler + make.left.equalTo(superview.mas_left).with.offset(padding.left); + make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom); + make.right.equalTo(superview.mas_right).with.offset(-padding.right); +}]; +``` +Or even shorter + +```obj-c +[view1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(superview).with.insets(padding); +}]; +``` + +Also note in the first example we had to add the constraints to the superview `[superview addConstraints:...`. +Masonry however will automagically add constraints to the appropriate view. + +Masonry will also call `view1.translatesAutoresizingMaskIntoConstraints = NO;` for you. + +## Not all things are created equal + +> `.equalTo` equivalent to **NSLayoutRelationEqual** + +> `.lessThanOrEqualTo` equivalent to **NSLayoutRelationLessThanOrEqual** + +> `.greaterThanOrEqualTo` equivalent to **NSLayoutRelationGreaterThanOrEqual** + +These three equality constraints accept one argument which can be any of the following: + +#### 1. MASViewAttribute + +```obj-c +make.centerX.lessThanOrEqualTo(view2.mas_left); +``` + +MASViewAttribute | NSLayoutAttribute +------------------------- | -------------------------- +view.mas_left | NSLayoutAttributeLeft +view.mas_right | NSLayoutAttributeRight +view.mas_top | NSLayoutAttributeTop +view.mas_bottom | NSLayoutAttributeBottom +view.mas_leading | NSLayoutAttributeLeading +view.mas_trailing | NSLayoutAttributeTrailing +view.mas_width | NSLayoutAttributeWidth +view.mas_height | NSLayoutAttributeHeight +view.mas_centerX | NSLayoutAttributeCenterX +view.mas_centerY | NSLayoutAttributeCenterY +view.mas_baseline | NSLayoutAttributeBaseline + +#### 2. UIView/NSView + +if you want view.left to be greater than or equal to label.left : +```obj-c +//these two constraints are exactly the same +make.left.greaterThanOrEqualTo(label); +make.left.greaterThanOrEqualTo(label.mas_left); +``` + +#### 3. NSNumber + +Auto Layout allows width and height to be set to constant values. +if you want to set view to have a minimum and maximum width you could pass a number to the equality blocks: +```obj-c +//width >= 200 && width <= 400 +make.width.greaterThanOrEqualTo(@200); +make.width.lessThanOrEqualTo(@400) +``` + +However Auto Layout does not allow alignment attributes such as left, right, centerY etc to be set to constant values. +So if you pass a NSNumber for these attributes Masonry will turn these into constraints relative to the view’s superview ie: +```obj-c +//creates view.left = view.superview.left + 10 +make.left.lessThanOrEqualTo(@10) +``` + +Instead of using NSNumber, you can use primitives and structs to build your constraints, like so: +```obj-c +make.top.mas_equalTo(42); +make.height.mas_equalTo(20); +make.size.mas_equalTo(CGSizeMake(50, 100)); +make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0)); +make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0)); +``` + +By default, macros which support [autoboxing](https://en.wikipedia.org/wiki/Autoboxing#Autoboxing) are prefixed with `mas_`. Unprefixed versions are available by defining `MAS_SHORTHAND_GLOBALS` before importing Masonry. + +#### 4. NSArray + +An array of a mixture of any of the previous types +```obj-c +make.height.equalTo(@[view1.mas_height, view2.mas_height]); +make.height.equalTo(@[view1, view2]); +make.left.equalTo(@[view1, @100, view3.right]); +```` + +## Learn to prioritize + +> `.prority` allows you to specify an exact priority + +> `.priorityHigh` equivalent to **UILayoutPriorityDefaultHigh** + +> `.priorityMedium` is half way between high and low + +> `.priorityLow` equivalent to **UILayoutPriorityDefaultLow** + +Priorities are can be tacked on to the end of a constraint chain like so: +```obj-c +make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow(); + +make.top.equalTo(label.mas_top).with.priority(600); +``` + +## Composition, composition, composition + +Masonry also gives you a few convenience methods which create multiple constraints at the same time. These are called MASCompositeConstraints + +#### edges + +```obj-c +// make top, left, bottom, right equal view2 +make.edges.equalTo(view2); + +// make top = superview.top + 5, left = superview.left + 10, +// bottom = superview.bottom - 15, right = superview.right - 20 +make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20)) +``` + +#### size + +```obj-c +// make width and height greater than or equal to titleLabel +make.size.greaterThanOrEqualTo(titleLabel) + +// make width = superview.width + 100, height = superview.height - 50 +make.size.equalTo(superview).sizeOffset(CGSizeMake(100, -50)) +``` + +#### center +```obj-c +// make centerX and centerY = button1 +make.center.equalTo(button1) + +// make centerX = superview.centerX - 5, centerY = superview.centerY + 10 +make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10)) +``` + +You can chain view attributes for increased readability: + +```obj-c +// All edges but the top should equal those of the superview +make.left.right.and.bottom.equalTo(superview); +make.top.equalTo(otherView); +``` + +## Hold on for dear life + +Sometimes you need modify existing constraints in order to animate or remove/replace constraints. +In Masonry there are a few different approaches to updating constraints. + +#### 1. References +You can hold on to a reference of a particular constraint by assigning the result of a constraint make expression to a local variable or a class property. +You could also reference multiple constraints by storing them away in an array. + +```obj-c +// in public/private interface +@property (nonatomic, strong) MASConstraint *topConstraint; + +... + +// when making constraints +[view1 mas_makeConstraints:^(MASConstraintMaker *make) { + self.topConstraint = make.top.equalTo(superview.mas_top).with.offset(padding.top); + make.left.equalTo(superview.mas_left).with.offset(padding.left); +}]; + +... +// then later you can call +[self.topConstraint uninstall]; +``` + +#### 2. mas_updateConstraints +Alternatively if you are only updating the constant value of the constraint you can use the convience method `mas_updateConstraints` instead of `mas_makeConstraints` + +```obj-c +// this is Apple's recommended place for adding/updating constraints +// this method can get called multiple times in response to setNeedsUpdateConstraints +// which can be called by UIKit internally or in your code if you need to trigger an update to your constraints +- (void)updateConstraints { + [self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) { + make.center.equalTo(self); + make.width.equalTo(@(self.buttonSize.width)).priorityLow(); + make.height.equalTo(@(self.buttonSize.height)).priorityLow(); + make.width.lessThanOrEqualTo(self); + make.height.lessThanOrEqualTo(self); + }]; + + //according to apple super should be called at end of method + [super updateConstraints]; +} +``` + +### 3. mas_remakeConstraints +`mas_updateConstraints` is useful for updating a set of constraints, but doing anything beyond updating constant values can get exhausting. That's where `mas_remakeConstraints` comes in. + +`mas_remakeConstraints` is similar to `mas_updateConstraints`, but instead of updating constant values, it will remove all of its contraints before installing them again. This lets you provide different constraints without having to keep around references to ones which you want to remove. + +```obj-c +- (void)changeButtonPosition { + [self.button mas_remakeConstraints:^(MASConstraintMaker *make) { + make.size.equalTo(self.buttonSize); + + if (topLeft) { + make.top.and.left.offset(10); + } else { + make.bottom.and.right.offset(-10); + } + }]; +} +``` + +You can find more detailed examples of all three approaches in the **Masonry iOS Examples** project. + +## When the ^&*!@ hits the fan! + +Laying out your views doesn't always goto plan. So when things literally go pear shaped, you don't want to be looking at console output like this: + +```obj-c +Unable to simultaneously satisfy constraints.....blah blah blah.... +( + "=5000)]>", + "", + "", + "" +) + +Will attempt to recover by breaking constraint +=5000)]> +``` + +Masonry adds a category to NSLayoutConstraint which overrides the default implementation of `- (NSString *)description`. +Now you can give meaningful names to views and constraints, and also easily pick out the constraints created by Masonry. + +which means your console output can now look like this: + +```obj-c +Unable to simultaneously satisfy constraints......blah blah blah.... +( + "", + "= 5000>", + "", + "" +) + +Will attempt to recover by breaking constraint += 5000> +``` + +For an example of how to set this up take a look at the **Masonry iOS Examples** project in the Masonry workspace. + +## Installation +Use the [orsome](http://www.youtube.com/watch?v=YaIZF8uUTtk) [CocoaPods](http://github.com/CocoaPods/CocoaPods). + +In your Podfile +>`pod 'Masonry'` + +If you want to use masonry without all those pesky 'mas_' prefixes. Add #define MAS_SHORTHAND to your prefix.pch before importing Masonry +>`#define MAS_SHORTHAND` + +Get busy Masoning +>`#import "Masonry.h"` + +## Code Snippets + +Copy the included code snippets to ``~/Library/Developer/Xcode/UserData/CodeSnippets`` to write your masonry blocks at lightning speed! + +`mas_make` -> `[ mas_makeConstraints:^(MASConstraintMaker *make){}];` + +`mas_update` -> `[ mas_updateConstraints:^(MASConstraintMaker *make){}];` + +`mas_remake` -> `[ mas_remakeConstraints:^(MASConstraintMaker *make){}];` + +## Features +* Not limited to subset of Auto Layout. Anything NSLayoutConstraint can do, Masonry can do too! +* Great debug support, give your views and constraints meaningful names. +* Constraints read like sentences. +* No crazy macro magic. Masonry won't pollute the global namespace with macros. +* Not string or dictionary based and hence you get compile time checking. + +## TODO +* Eye candy +* Mac example project +* More tests and examples + diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 17b358d..24a04ea 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,1352 +7,1370 @@ objects = { /* Begin PBXBuildFile section */ - 0292CDCF88E0AE040AE457AD /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B41BC4F59C9AFB0F2B2F9709 /* XCTest.framework */; }; - 02F89F0F32F9666ECF4FD784 /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E3DACEFD08C0645E69178D2 /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 03799167DD970F98A0AE533F /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 750FB2EF7FDC6010FCCA2506 /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 03DAAF757F23EDE7041E0704 /* IFTTTLabelAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F7993624656BB6FA551993BB /* IFTTTLabelAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 042E8F9038771BD52F7CA5D8 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 66827CB2F1A3D514BB314695 /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 045A5B5B3709D5C7715C300B /* EXPMatchers+contain.m in Sources */ = {isa = PBXBuildFile; fileRef = 7339B482CD14D83172838D4A /* EXPMatchers+contain.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 04D5A51BC5418EE88719B937 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C4A2ED28DFE02466E7B2DB6 /* IFTTTTransform3DAnimation.h */; }; - 05D6E1C242177E0C2E88C837 /* SPTTestSuite.m in Sources */ = {isa = PBXBuildFile; fileRef = FF049F59D8CA2671225B373D /* SPTTestSuite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 08154935B7EAD98A36767285 /* IFTTTFilmstrip.m in Sources */ = {isa = PBXBuildFile; fileRef = D1DECE85F99DB176A990CB84 /* IFTTTFilmstrip.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 0875F4680F789BF646473FB7 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E8C366F517DDCC943F01AD3 /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 0994C094BFA00464C0F2DE33 /* ExpectaObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 907DD1B245F66962FCC38175 /* ExpectaObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 099C8FAB2CA040449260F0BB /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F92F4C576AA5DF053E7FE99E /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 0B652046B8FE9A6D49A86F8C /* EXPMatchers+conformTo.m in Sources */ = {isa = PBXBuildFile; fileRef = D09A2DD9308A955710899C86 /* EXPMatchers+conformTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 0E0A17AF6C5CD43F23D78921 /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = E148F4C7E1F7B4AE6859D5F3 /* EXPMatchers+beGreaterThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 0F30A89BCF0F033C5B8F174A /* SPTExample.h in Headers */ = {isa = PBXBuildFile; fileRef = 411FE79644EFC92FD5999BC2 /* SPTExample.h */; }; - 10A0A7E270EE3C5D2A6BD15E /* IFTTTTranslationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33EBD14E380909DBEB60A523 /* IFTTTTranslationAnimation.h */; }; - 12D7C3815AE235C1097FA56F /* SPTExampleGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C022B31F1996A4E30BC964B /* SPTExampleGroup.h */; }; - 139D1C1CB14AA8BC86AA26F6 /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 85E852DF9A8D8B6C5BD9D174 /* IFTTTAnimator.h */; }; - 1438674FE8E05E421B774F4B /* IFTTTAnimatedPagingScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C030FDB2672516FEC00B8A /* IFTTTAnimatedPagingScrollViewController.h */; }; - 159B0775A1BF98C5D503946A /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 41665A98E7A2989C0540932B /* IFTTTScaleAnimation.h */; }; - 16B841CBC555D8C5B6DF8E16 /* EXPMatchers+beCloseTo.h in Headers */ = {isa = PBXBuildFile; fileRef = D9375A8FA1FB91E14D42BFB3 /* EXPMatchers+beCloseTo.h */; }; - 176F0B0CFABDE496FE2CB75C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - 17E0B42AF301ABE8A77038BF /* IFTTTConstraintMultiplierAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = DC97B97BE29E599A1E061DF4 /* IFTTTConstraintMultiplierAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 195BAA47E890209EEBB8BDE4 /* IFTTTViewAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E49EE81C8B6906E648059D /* IFTTTViewAnimation.h */; }; - 1CBED30EFD0EE9F3E9852211 /* EXPMatchers+conformTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B1B5419A0190E33FC50F04E /* EXPMatchers+conformTo.h */; }; - 211AB2C2210C9B0F3AFB6775 /* IFTTTStrokeStartAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = D45C64A3B920291E2CA08B3D /* IFTTTStrokeStartAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 21EBA63E9D88A8E6A754E6EB /* IFTTTFillColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 294E402DA2EEE4E96A109F72 /* IFTTTFillColorAnimation.h */; }; - 222FC3D192E6844C6A7DF36F /* Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = D5F0B5332F43EBB506D452FF /* Expecta.h */; }; - 23EABAFEFA75AB2DA796CE75 /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3446018392C5339D4A3631D3 /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 252568172A036560CA1689E0 /* EXPMatchers+beNil.m in Sources */ = {isa = PBXBuildFile; fileRef = 4491CD033F8C68F60DC98D2D /* EXPMatchers+beNil.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 27D31754A20F4CD00089387B /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = D1A7CA255EEE41815C415CEA /* IFTTTJazzHands.h */; }; - 2A028F81753787B6A419D5F3 /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE4984D09E42888921D0E413 /* IFTTTHideAnimation.h */; }; - 2A0FE7308221339BC8906D75 /* EXPMatchers+equal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F29880F4B7BB0C295040701 /* EXPMatchers+equal.h */; }; - 2A5D50B959D7BA13596DA6D6 /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = D1A7CA255EEE41815C415CEA /* IFTTTJazzHands.h */; }; - 2AB1689EAFBE5C90C88F1779 /* IFTTTShapeLayerAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7907D01D0D268B01F5E91357 /* IFTTTShapeLayerAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 2B0D16AECD7050C99BEEDFB9 /* SPTCallSite.h in Headers */ = {isa = PBXBuildFile; fileRef = A0662A21ACE7C1E14AF1FAA9 /* SPTCallSite.h */; }; - 2BC1C453BA3E696C7D1CC449 /* SPTSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B9A680AEBD78661666B26114 /* SPTSpec.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 2C99B0DDFBC1069FEDBC1007 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C7824ABCCD4DB01B5092F46D /* IFTTTScrollViewPageConstraintAnimation.h */; }; - 2DB6759B8496A3E92AF9171A /* NSObject+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = B1212A8114D53161D6FB685D /* NSObject+Expecta.h */; }; - 2DDAC087C0452B02FBB84520 /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5203E60770E20F1BF4F5F /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 2DF575221F1C748A71BEA15B /* EXPMatchers+beGreaterThan.m in Sources */ = {isa = PBXBuildFile; fileRef = B41E7A44F69A601BA2E42AC8 /* EXPMatchers+beGreaterThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 2E1A43FD33880DDD68824C0F /* IFTTTInterpolatable.m in Sources */ = {isa = PBXBuildFile; fileRef = 6022CE483547D3A6727C0AC8 /* IFTTTInterpolatable.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 306CFAB93A5A15EA82A26A57 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 66C5C5B6E2894A60757FF56C /* IFTTTEasingFunction.h */; }; - 315A780D1CB573F839388CA9 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C7824ABCCD4DB01B5092F46D /* IFTTTScrollViewPageConstraintAnimation.h */; }; - 31D9BD8037C4BD78BD906EEA /* SPTSharedExampleGroups.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F877527E404A15C4C0BF7F6 /* SPTSharedExampleGroups.h */; }; - 321FB4FC3104B87E191791F2 /* SpectaUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D3536E34D98AD361993E21C /* SpectaUtility.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 325FA289B5E6F3496BF3A758 /* IFTTTStrokeStartAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7436478379463FAEDCFC50C7 /* IFTTTStrokeStartAnimation.h */; }; - 32827D11EFAAE7685D4D1D43 /* IFTTTRotationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 475496CF1856DA976736F2C3 /* IFTTTRotationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 334243D85377389D1C65EC71 /* EXPFloatTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 1581475D443D0D795DB1AC20 /* EXPFloatTuple.h */; }; - 33DB088C0CEBF66F56D84925 /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0385E9231A11BDEC59E31FC3 /* IFTTTTextColorAnimation.h */; }; - 3549919920910D13D6467976 /* IFTTTConstraintMultiplierAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = DC97B97BE29E599A1E061DF4 /* IFTTTConstraintMultiplierAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 35ABF55FD5CDDF2208EE5CE7 /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = B02B9C1E6538ACC6BBC21CEA /* EXPMatchers+beGreaterThanOrEqualTo.h */; }; - 35DD98939CA7BA6B7469AD69 /* EXPMatchers+beginWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E599076A43298BB62D0BCAF /* EXPMatchers+beginWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 375037094CFC94BD0418B323 /* EXPMatcherHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 6186EC8D959CB54D484F6989 /* EXPMatcherHelpers.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 38F0699F2E01878CD5799170 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785DDBC1ECA68425191C8A4D /* CoreGraphics.framework */; }; - 392A54F40B3EC68311942B1A /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB88DD680277C61C98FC295 /* IFTTTAlphaAnimation.h */; }; - 3A4C0AF097B4F050268CD0B9 /* SpectaDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF20F56A9E619A9CD821D55 /* SpectaDSL.h */; }; - 3A59FEB38BA3D6DCC2CCB82B /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 45217821746137F806307B8B /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 3AADC39303BD29BD596DE002 /* IFTTTAnimatedPagingScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C748F8880E0A11BF2D91BFB3 /* IFTTTAnimatedPagingScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 3BFB22AD97DAD0D502244D8E /* SpectaUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 069882731E4D551CF7B80EC9 /* SpectaUtility.h */; }; - 3D1BAF646FC923D0B587F44C /* EXPMatchers+contain.h in Headers */ = {isa = PBXBuildFile; fileRef = 759ED3AE9DCE9A46B442A9A2 /* EXPMatchers+contain.h */; }; - 3DB800444D4EDBD1EA8830D3 /* SPTCompiledExample.h in Headers */ = {isa = PBXBuildFile; fileRef = A8FD15B85FF51D8CDCC2FD5A /* SPTCompiledExample.h */; }; - 3F9F8794A8EC55FE0B28C036 /* NSValue+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = AE752EA8051EDDBB5FBAC953 /* NSValue+Expecta.h */; }; - 41F55D96D3FF084C0AAF3B6A /* UIView+IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = DF26417E447AAA9B5BE0B962 /* UIView+IFTTTJazzHands.h */; }; - 438C8BB0B439BEEA34690A7B /* EXPFloatTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 838017DD02842D44F5EE765D /* EXPFloatTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 44E2A01AA83CD44F48068F9A /* EXPMatchers+raiseWithReason.m in Sources */ = {isa = PBXBuildFile; fileRef = 085BD59CA56065738DF42113 /* EXPMatchers+raiseWithReason.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 44F50BCBB5E732AE3E0B7BD1 /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE4984D09E42888921D0E413 /* IFTTTHideAnimation.h */; }; - 45A23022C60E4D2F32C5A124 /* SPTExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AEA0508E6B6580768E25A11 /* SPTExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 468F3ED8EF8A3584608650E9 /* EXPMatchers+beFalsy.m in Sources */ = {isa = PBXBuildFile; fileRef = AFBE40D3D0603C5727D292FE /* EXPMatchers+beFalsy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 47ADBAD6176CA9F36DCC028A /* EXPDoubleTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D85F65556ED22B74787D161 /* EXPDoubleTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 48537965DB768D84C23CB45A /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 30D4A17355F3E76FE956DD8F /* IFTTTAnimation.h */; }; - 499D8BFA4B7EC42D384C050F /* IFTTTConstraintConstantAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C44FA18D390D4A7C180C747 /* IFTTTConstraintConstantAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 4A380256D66880F4C68D6627 /* EXPMatchers+beIdenticalTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 60A898A457ECC717FF89B1F2 /* EXPMatchers+beIdenticalTo.h */; }; - 4A6A2D1AEBA6905E43B4D61D /* XCTestCase+Specta.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F1D3C86CB28C9691E3D9914 /* XCTestCase+Specta.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 4C2617AB94CB2DD4FEC72DF6 /* EXPUnsupportedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EDA2EB03F64F6C8B3AD147C /* EXPUnsupportedObject.h */; }; - 4D546BCF4C9787C034C4F0D4 /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B3B16635730AB19C470062 /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 4ED62314C18CDA44E2240370 /* Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = 75C654997F9E90270462B9C3 /* Specta.h */; }; - 4FE2E327E5A4EF2C0DB0D3A0 /* EXPBlockDefinedMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD2D093A5CA5ADC681AE8E /* EXPBlockDefinedMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 500F5B8E5FC47672818DA917 /* SPTSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DD9F07C9B3B9742C11384F /* SPTSpec.h */; }; - 5246C2ABD428044190235A69 /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = E28E5B7BEE4F0CB18DBF7624 /* IFTTTColorAnimation.h */; }; - 52F55117A9EE0609C89C3DD1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - 5434FAF7795BEA69BDF0EA20 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = 66827CB2F1A3D514BB314695 /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 570130BF0A444F0992C16548 /* EXPMatchers+beInstanceOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D3BC093FBD571E07F702DE6 /* EXPMatchers+beInstanceOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 5C2931306FE64CD2DDBFF0E8 /* EXPMatchers+postNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AA02D9FFB8AF6184582149C /* EXPMatchers+postNotification.h */; }; - 5D453002F89499062E764E27 /* SPTSharedExampleGroups.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB7DE6A6D8019C196B680D6 /* SPTSharedExampleGroups.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 5D4DCA227763B675FF64498E /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB5203E60770E20F1BF4F5F /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 5FEA35F336C5ED994DEF0154 /* IFTTTShapeLayerAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 78645949EDC177E1FBC00F5E /* IFTTTShapeLayerAnimation.h */; }; - 63C066B14D0ACD7F7FAEB625 /* IFTTTRotationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = AE00247518DCD77900CF76A3 /* IFTTTRotationAnimation.h */; }; - 64877141CC91721A160D01BD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785DDBC1ECA68425191C8A4D /* CoreGraphics.framework */; }; - 65C6225AC843B7D2F7C1FB03 /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0385E9231A11BDEC59E31FC3 /* IFTTTTextColorAnimation.h */; }; - 6701530040B139446AFE8AC5 /* IFTTTLabelAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6545EF0918678FA7FCC8F050 /* IFTTTLabelAnimation.h */; }; - 6853BEA14FE80D1723897AFD /* IFTTTFillColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FD3CF03FD3994B9039C63EF /* IFTTTFillColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 6B45BCFEB08A64B102A0CFAC /* Pods-JazzHandsTests-Expecta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F3550B6564714C53C72E7E07 /* Pods-JazzHandsTests-Expecta-dummy.m */; }; - 6D6CF4B0C2AF532B12EB8C4D /* EXPMatchers+beLessThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C5B94E1F22A2B62F684DCA /* EXPMatchers+beLessThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 6ED2BE0EDC023FF4A2B7FF79 /* IFTTTLabelAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6545EF0918678FA7FCC8F050 /* IFTTTLabelAnimation.h */; }; - 6EE6F6846EF04012DB87319A /* EXPMatchers+postNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 21035450E227DB901C3F33D7 /* EXPMatchers+postNotification.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 6EFF72CC40BEFE800F9BBD4D /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 39A24AC2A3192B4E396BDCCD /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 6FFB7115608386FE68393A22 /* UIView+IFTTTJazzHands.m in Sources */ = {isa = PBXBuildFile; fileRef = 272D9B2C4213EEED01F9460E /* UIView+IFTTTJazzHands.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 70EFA63A96B065F6FCDA154A /* EXPMatchers+beSupersetOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E5B6302116ECAF896A36A02 /* EXPMatchers+beSupersetOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7582CA2E13BF419313F585F8 /* IFTTTFillColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 294E402DA2EEE4E96A109F72 /* IFTTTFillColorAnimation.h */; }; - 76194E2B00CB012DE426FE5F /* UIView+IFTTTJazzHands.m in Sources */ = {isa = PBXBuildFile; fileRef = 272D9B2C4213EEED01F9460E /* UIView+IFTTTJazzHands.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 76EF2563C445E42217F796A1 /* SPTCallSite.m in Sources */ = {isa = PBXBuildFile; fileRef = 84E383F1CCF3088D055550A6 /* SPTCallSite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 77CC42D502BFBDCBEE305850 /* EXPMatchers+beIdenticalTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 77EAD45720FB5D5E2CA928C3 /* EXPMatchers+beIdenticalTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7A130EFBDB71E142E848724F /* EXPMatchers+haveCountOf.m in Sources */ = {isa = PBXBuildFile; fileRef = BBEA0F11C67AA49A843453E7 /* EXPMatchers+haveCountOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7AC716705A089C6E3C8B15A6 /* EXPMatchers+beCloseTo.m in Sources */ = {isa = PBXBuildFile; fileRef = D71CC96F4DD135744424EB3F /* EXPMatchers+beCloseTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7BE758224697E24A2AEC9954 /* EXPMatchers+beKindOf.h in Headers */ = {isa = PBXBuildFile; fileRef = B3D1DD8DFA8F080872960CA8 /* EXPMatchers+beKindOf.h */; }; - 7BF42DA08DD571A7DA07BD95 /* IFTTTConstraintMultiplierAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F7C0192850549356DAF19349 /* IFTTTConstraintMultiplierAnimation.h */; }; - 7C2B0643008CF97DBE803A19 /* IFTTTLabelAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F7993624656BB6FA551993BB /* IFTTTLabelAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 7C9A824B6C0052C1D3C070B5 /* SPTGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = A7ACD2D2EBCF6E377FD67E00 /* SPTGlobalBeforeAfterEach.h */; }; - 7D25C3357C030C687FE08EC8 /* IFTTTConstraintMultiplierAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F7C0192850549356DAF19349 /* IFTTTConstraintMultiplierAnimation.h */; }; - 7DC06BA9846C33EC42D206A8 /* SPTExcludeGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E57316DD118F52E45207152 /* SPTExcludeGlobalBeforeAfterEach.h */; }; - 7DDAC136F0A88F60D59819AB /* EXPExpect.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF7BE4C7CD334FDE7799B95 /* EXPExpect.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7F5A14EECEDD0328325DC732 /* EXPUnsupportedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = A1F47E4C663DEEFEBDE6474C /* EXPUnsupportedObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7FCB92A56ACB3713B1F50405 /* EXPMatchers+beTruthy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6633193AD4BA6AFAF71B370B /* EXPMatchers+beTruthy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 8002D933224DDEC6BB0C2C8B /* EXPMatchers+beLessThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D42A7CED746B6B91A99B360 /* EXPMatchers+beLessThan.h */; }; - 800F0FCDC016E97DC972072D /* IFTTTStrokeStartAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7436478379463FAEDCFC50C7 /* IFTTTStrokeStartAnimation.h */; }; - 80CD7BE60090B1A2B9A12D12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - 81FDC325FB9E1CEDD3823323 /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F92F4C576AA5DF053E7FE99E /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 8322BF370EF3225DF80E09C1 /* IFTTTTranslationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1537E4CE53FDCC85590BFC6C /* IFTTTTranslationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 850E0F9C334CF89D0156DEF6 /* IFTTTRotationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 475496CF1856DA976736F2C3 /* IFTTTRotationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 85A67B087289D31EE36081AE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D891D288817872D5AD9FC40 /* UIKit.framework */; }; - 85C92E43CD73CFA456D3200E /* IFTTTConstraintConstantAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3F7DE6E48FEC85D3FAF87C9 /* IFTTTConstraintConstantAnimation.h */; }; - 8752804DECC81C49D4EBD4E2 /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F15AEFA328224BC372E4EB56 /* IFTTTFrameAnimation.h */; }; - 886DCA8421D181A0BDC8F847 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - 88766996F27F2842A8A95F9E /* SPTExampleGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C835FE7F279FDDC568CAACD6 /* SPTExampleGroup.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 887C6C0EECAC5BD4C537B53E /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 01A063D479F7E7ED0ADA7C9F /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 88B71C71561A754744BD3CE4 /* EXPExpect.h in Headers */ = {isa = PBXBuildFile; fileRef = ACE17D3C0CDAE51D6E6672DC /* EXPExpect.h */; }; - 8A5AAD775DF0432ADF0F0D7A /* EXPMatchers+raiseWithReason.h in Headers */ = {isa = PBXBuildFile; fileRef = DDE0D1A0A631EF774B5B5EA3 /* EXPMatchers+raiseWithReason.h */; }; - 8BE9183CC214E3EBD3C519C6 /* EXPMatchers+beSupersetOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 05E2B8AD4E6A4FB10A3D60DD /* EXPMatchers+beSupersetOf.h */; }; - 8F51C9758C0D6D0A94F38ED9 /* IFTTTConstraintConstantAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C44FA18D390D4A7C180C747 /* IFTTTConstraintConstantAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 90FC36BD24509FA4703C6AAF /* EXPMatchers+equal.m in Sources */ = {isa = PBXBuildFile; fileRef = 641BC4FE9A9657D810384555 /* EXPMatchers+equal.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 91C998C488B50F6909FB3145 /* IFTTTStrokeEndAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6067F91822EB4F1D3752C0B0 /* IFTTTStrokeEndAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 93E823ADC7F3CDBBD7598D43 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F4A4D3AE9B257720CC1A3719 /* Pods-JazzHandsDemo-JazzHands-dummy.m */; }; - 95BECE5D4C3719B629DD7B1E /* EXPMatchers+beInTheRangeOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E6987844DA1781B5E8F5749 /* EXPMatchers+beInTheRangeOf.h */; }; - 96253032625559D718AA3975 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E8C366F517DDCC943F01AD3 /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 9653D35DA0072E0D848AF74B /* SPTCompiledExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C49CA465A2547739740C01D /* SPTCompiledExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9681993C6747C1DF4273B541 /* IFTTTStrokeEndAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 652870E176D149654FC4F114 /* IFTTTStrokeEndAnimation.h */; }; - 9903969F3BAD6AD3F7829D17 /* IFTTTTranslationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33EBD14E380909DBEB60A523 /* IFTTTTranslationAnimation.h */; }; - 9934961F07249278011FD22E /* IFTTTInterpolatable.h in Headers */ = {isa = PBXBuildFile; fileRef = E73A5EC36B307783A21CFDDB /* IFTTTInterpolatable.h */; }; - 995D6A6781ACC97511B06C6F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - 9A4F82CCA7E3A410AB9CEC04 /* EXPMatchers+beSubclassOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 934434C0BD2DB769110411CD /* EXPMatchers+beSubclassOf.h */; }; - 9B323AF1E31F90FCABF797A1 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6564E350AAA1B2647EF101AE /* IFTTTScrollViewPageConstraintAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - 9E56EB3754464BCC728D0591 /* EXPMatchers+beFalsy.h in Headers */ = {isa = PBXBuildFile; fileRef = 56CF580A1548C16138C1A174 /* EXPMatchers+beFalsy.h */; }; - A14D62D6FC10147822B42392 /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 55FF746A899C264E74823631 /* IFTTTCornerRadiusAnimation.h */; }; - A2C05EB72A265E9BDFF7778B /* IFTTTFilmstrip.m in Sources */ = {isa = PBXBuildFile; fileRef = D1DECE85F99DB176A990CB84 /* IFTTTFilmstrip.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - A3990BB12514F458170AF4EE /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B3B16635730AB19C470062 /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - A5F99C360088CA1A58D5D84A /* EXPMatchers+beInstanceOf.h in Headers */ = {isa = PBXBuildFile; fileRef = E201135640ABD991AB704B67 /* EXPMatchers+beInstanceOf.h */; }; - A68F084F61752B741CB2D167 /* IFTTTFilmstrip.h in Headers */ = {isa = PBXBuildFile; fileRef = BF2126960454E4508B4C8F47 /* IFTTTFilmstrip.h */; }; - AA88B3E196B989A04999889D /* IFTTTAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E64BC8420E597A057004433 /* IFTTTAnimatable.h */; }; - AB456E309AB09BF42B4F366B /* IFTTTViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = B383AE2E43A2CE2341AC6C7E /* IFTTTViewAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - AB905F401AFD285D932B25DE /* ExpectaSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110957F6855AE1BD2FB369F /* ExpectaSupport.h */; }; - AE089596AB771096ED52EE4B /* EXPMatchers+beTruthy.h in Headers */ = {isa = PBXBuildFile; fileRef = 439F8F70ABD2957C877335D2 /* EXPMatchers+beTruthy.h */; }; - B0C0FD88E306CD985B4D5197 /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11BB584B81272FC191A041A0 /* Pods-JazzHandsTests-JazzHands-dummy.m */; }; - B129A79A7F5995227A6030C3 /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = E28E5B7BEE4F0CB18DBF7624 /* IFTTTColorAnimation.h */; }; - B145AC676E8E4DCCE928A4C7 /* IFTTTAnimatedPagingScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C030FDB2672516FEC00B8A /* IFTTTAnimatedPagingScrollViewController.h */; }; - B22D1CFEB4042132C21B5F0F /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 30D4A17355F3E76FE956DD8F /* IFTTTAnimation.h */; }; - B2E78F7DBC43FFCD180AF457 /* IFTTTInterpolatable.m in Sources */ = {isa = PBXBuildFile; fileRef = 6022CE483547D3A6727C0AC8 /* IFTTTInterpolatable.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - B2F5135481E23EB9065CE3E2 /* EXPDoubleTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = B5B4B8A49B8B86B75C90676C /* EXPDoubleTuple.h */; }; - B32D3067815526DAEB5FB51C /* EXPMatchers+respondTo.h in Headers */ = {isa = PBXBuildFile; fileRef = FBE18933E13686194E220A52 /* EXPMatchers+respondTo.h */; }; - B386064B6191149915F43479 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCDBAEBFDD5F2EFE2BFF59D /* QuartzCore.framework */; }; - B43490ED4F203534E12B11C8 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4714C82809C283AD75123D20 /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - B725BA404E5AE55ACA31A002 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C9CC552477FB201D26A2C8B /* Foundation.framework */; }; - B739A048A7B7CC3870F8A6C6 /* EXPDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 056F3A6F464F3F77019C2057 /* EXPDefines.h */; }; - B761BC6A9276B24EC6ECE5E5 /* IFTTTStrokeEndAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6067F91822EB4F1D3752C0B0 /* IFTTTStrokeEndAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - B8BEC9051FC8BB3316C517FB /* IFTTTConstraintConstantAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3F7DE6E48FEC85D3FAF87C9 /* IFTTTConstraintConstantAnimation.h */; }; - B98167CCBB32AF8D3AD11653 /* XCTest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4974C86B8D66A56007169259 /* XCTest+Private.h */; }; - BA53B965C5F1E57B915B11F0 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 45217821746137F806307B8B /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - BA5FB6F3B1D25420598F80C6 /* EXPMatcherHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 710EC4E5C7FE49A60DACAEAB /* EXPMatcherHelpers.h */; }; - BBBB0EEA7707CE1242BA7AE5 /* IFTTTStrokeStartAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = D45C64A3B920291E2CA08B3D /* IFTTTStrokeStartAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - BC7CF6F1BCBB044A31B3AAC6 /* IFTTTRotationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = AE00247518DCD77900CF76A3 /* IFTTTRotationAnimation.h */; }; - BE665A569FC18E64E4EE9EA0 /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 55FF746A899C264E74823631 /* IFTTTCornerRadiusAnimation.h */; }; - C01BB1C0955E09579B198635 /* SPTTestSuite.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E1050E299910C9551A73727 /* SPTTestSuite.h */; }; - C18A439E943BC1CA86128BC9 /* EXPMatchers+beGreaterThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D5F2D6BA0BCFE437618171D /* EXPMatchers+beGreaterThan.h */; }; - C4E7481024CD88098560A310 /* EXPMatchers+beInTheRangeOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 55AAA9162E2BBEDDAAFC1524 /* EXPMatchers+beInTheRangeOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - C5C3E5A7B22A4359A1ACAAA5 /* IFTTTFilmstrip.h in Headers */ = {isa = PBXBuildFile; fileRef = BF2126960454E4508B4C8F47 /* IFTTTFilmstrip.h */; }; - C7DABBF3D686565A0E2D0337 /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3446018392C5339D4A3631D3 /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - C8397C4E0282C903A93C6D9C /* IFTTTScrollViewPageConstraintAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6564E350AAA1B2647EF101AE /* IFTTTScrollViewPageConstraintAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - C87707964F3C8CE1963DFDCE /* Pods-JazzHandsTests-Specta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AF6E47F5FB8196B619F2194 /* Pods-JazzHandsTests-Specta-dummy.m */; }; - CC3C9FE15DBC036ABA00AA11 /* UIView+IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = DF26417E447AAA9B5BE0B962 /* UIView+IFTTTJazzHands.h */; }; - D008F1E054C3E8448A2E2A30 /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 47830E8280C22A00348B3A3A /* IFTTTAnimatedScrollViewController.h */; }; - D0A5F8031C55764CDBD9A38B /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 01A063D479F7E7ED0ADA7C9F /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - D19A9C14E7DE124DCB6B9696 /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 39A24AC2A3192B4E396BDCCD /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - D212149881EB1D2A9DBC849B /* EXPMatchers+beSubclassOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD2668D41D1B3BC3C559DE1 /* EXPMatchers+beSubclassOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D29FAA17389476FF7953A5CB /* IFTTTAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E64BC8420E597A057004433 /* IFTTTAnimatable.h */; }; - D49C495BEEDA1BB1FD506180 /* EXPMatchers+respondTo.m in Sources */ = {isa = PBXBuildFile; fileRef = A26063CB8EC8E43B6A342C1E /* EXPMatchers+respondTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D56EEB8B91BEF8AF4B23BCB4 /* IFTTTFillColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FD3CF03FD3994B9039C63EF /* IFTTTFillColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - D683217CFA8D337ABDD2E042 /* IFTTTAnimatedPagingScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C748F8880E0A11BF2D91BFB3 /* IFTTTAnimatedPagingScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - D7C4C1CEEF874E4AA6EF0ED9 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 66C5C5B6E2894A60757FF56C /* IFTTTEasingFunction.h */; }; - D8582D6C05B4FCA6C935FAF2 /* ExpectaSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 23043E7DD2D5B53653FA27AE /* ExpectaSupport.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - D934C211A218BE6C28E60653 /* IFTTTTranslationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1537E4CE53FDCC85590BFC6C /* IFTTTTranslationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - DA886C15FA3AE10E9FC96148 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C4A2ED28DFE02466E7B2DB6 /* IFTTTTransform3DAnimation.h */; }; - DACBCA1A159DDA9A9FB9CE9F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCDBAEBFDD5F2EFE2BFF59D /* QuartzCore.framework */; }; - DB67A66BB47D5F948E1BFF3A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B41BC4F59C9AFB0F2B2F9709 /* XCTest.framework */; }; - DE3F780DC71B0CD3470FF3AB /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 85E852DF9A8D8B6C5BD9D174 /* IFTTTAnimator.h */; }; - DFB82CEE5D4EE6B864719C64 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4714C82809C283AD75123D20 /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - E0F0D04930ACE01D2C50E863 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB88DD680277C61C98FC295 /* IFTTTAlphaAnimation.h */; }; - E2E66ADCC45C81E249EF18A3 /* IFTTTShapeLayerAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7907D01D0D268B01F5E91357 /* IFTTTShapeLayerAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - E68F9252FD569CD9E9C7E220 /* SpectaTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = D9612CA2B60C3E8A91FC066E /* SpectaTypes.h */; }; - E69C98D05BBA0954FAEAD865 /* IFTTTStrokeEndAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 652870E176D149654FC4F114 /* IFTTTStrokeEndAnimation.h */; }; - E6F62634EF008AB1BBDA24B8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D891D288817872D5AD9FC40 /* UIKit.framework */; }; - E7FDCBFDDF5EC8199762BEE4 /* EXPMatchers+beLessThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A9B1FF0044C513E33841A9 /* EXPMatchers+beLessThanOrEqualTo.h */; }; - E8C3AB54B69A4D4994351181 /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F15AEFA328224BC372E4EB56 /* IFTTTFrameAnimation.h */; }; - E8D0FFA7468AA2AC7E5150F4 /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 47830E8280C22A00348B3A3A /* IFTTTAnimatedScrollViewController.h */; }; - E99DB0D50CC6C8C6CE497A4F /* EXPMatchers+haveCountOf.h in Headers */ = {isa = PBXBuildFile; fileRef = BF8E7F1EEE95E55452C23AEB /* EXPMatchers+haveCountOf.h */; }; - EA22ECA321C8B6EDF9894B9E /* IFTTTShapeLayerAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 78645949EDC177E1FBC00F5E /* IFTTTShapeLayerAnimation.h */; }; - EA24BA4B0D40671F373D7166 /* EXPMatchers+beginWith.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B4DF6374CDAF3E0A03C5B2A /* EXPMatchers+beginWith.h */; }; - EB66E9DD1563F41C2D2576E6 /* EXPMatchers+endWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ABB96F59464DE2566C69AFA /* EXPMatchers+endWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - EBE307F7B457F31A5AA00835 /* EXPMatchers+match.h in Headers */ = {isa = PBXBuildFile; fileRef = E2E57523EB6AA145577FAEE0 /* EXPMatchers+match.h */; }; - EC13F9FB6BB92638AB252516 /* IFTTTViewAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E49EE81C8B6906E648059D /* IFTTTViewAnimation.h */; }; - ECFCA1D920F3AD75098D4EEC /* EXPMatchers+beLessThan.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B5B8553878CEBEF88C5BB9B /* EXPMatchers+beLessThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - EE5CFC315FCC9705B10246AD /* NSValue+Expecta.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CD0CD9FC41731400E239262 /* NSValue+Expecta.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - F0BF4C10ED060C61ED83A892 /* Pods-JazzHandsDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2706E0E7D9AA89E92BDBF199 /* Pods-JazzHandsDemo-dummy.m */; }; - F1AB773FC02731C1524F95B6 /* IFTTTViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = B383AE2E43A2CE2341AC6C7E /* IFTTTViewAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - F1BD842001CB60DEDAC8C3DC /* EXPBlockDefinedMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 09575E439CBF70EA95DB5A39 /* EXPBlockDefinedMatcher.h */; }; - F2BBA54DD096B5E7F710BC65 /* EXPMatchers+raise.h in Headers */ = {isa = PBXBuildFile; fileRef = 9576A2DE3D9C00ED4B963C10 /* EXPMatchers+raise.h */; }; - F33CE5D170C6F709FA2EE893 /* EXPMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B89F3FC74388C51C36E8894 /* EXPMatcher.h */; }; - F40CBA6730EC67DC7FBAA3EB /* SpectaDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = CE734C94E8443D6FADDBB7BD /* SpectaDSL.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - F433D42C3142E7A228FCD752 /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E3DACEFD08C0645E69178D2 /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - F44C945CA601B3EB9665C6E5 /* EXPMatchers+raise.m in Sources */ = {isa = PBXBuildFile; fileRef = 42240CBAB22777F1797A8EA5 /* EXPMatchers+raise.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - F48379B8DCC44E745A2CC8EA /* EXPMatchers+beNil.h in Headers */ = {isa = PBXBuildFile; fileRef = 95CD90EE7B68BECE534221AB /* EXPMatchers+beNil.h */; }; - F648D8B86DDA6C4D6974725A /* ExpectaObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 2548213E96884E030A76C5D3 /* ExpectaObject.h */; }; - F6EC3D77BB0B1BF9E625901B /* EXPMatchers+match.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A04DD1C2E7D7F22A7C8B0B9 /* EXPMatchers+match.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - F9DC198B0C3FA529698E9751 /* XCTestCase+Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = 29255C0F3CF62A4B1DF8E6A4 /* XCTestCase+Specta.h */; }; - FA60D1A1497EA865C83E8015 /* IFTTTInterpolatable.h in Headers */ = {isa = PBXBuildFile; fileRef = E73A5EC36B307783A21CFDDB /* IFTTTInterpolatable.h */; }; - FAB0655B7F7656DE97F1A00D /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 41665A98E7A2989C0540932B /* IFTTTScaleAnimation.h */; }; - FB33704695B44330F8361BED /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 750FB2EF7FDC6010FCCA2506 /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; - FB4A5602F6D6801996C53D4C /* EXPMatchers.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE31AA03022BE3B166158A4 /* EXPMatchers.h */; }; - FBDDB5CDB340020AE8257F14 /* EXPMatchers+endWith.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A621680EDE998BA81FDE667 /* EXPMatchers+endWith.h */; }; - FC47D010FF86BDEC414FFB28 /* EXPMatchers+beKindOf.m in Sources */ = {isa = PBXBuildFile; fileRef = BAAC3FB77DFAC352B8E52CD3 /* EXPMatchers+beKindOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - FFF8573322324BE0F53E2BDB /* Pods-JazzHandsTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FE004A8C521BD9ACAAA87F7 /* Pods-JazzHandsTests-dummy.m */; }; + 03E8C4C585DFF14910051FF69688EA26 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D1466913725877B5C26F9199BC08EB8 /* MASConstraint+Private.h */; }; + 05FFF31A3F9556A0BF7BC285E1D6AE2A /* EXPMatchers+beTruthy.h in Headers */ = {isa = PBXBuildFile; fileRef = AD824E9743EDC05E8FCD7BD1891E0E5C /* EXPMatchers+beTruthy.h */; }; + 06442CB8F33BD30FA8E3CF5DEC87C384 /* EXPMatchers+conformTo.m in Sources */ = {isa = PBXBuildFile; fileRef = BE6099B6062F0708A5CBFB33BD012357 /* EXPMatchers+conformTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 07291CB8F259956F1DA7289A5C742D4D /* IFTTTLayerStrokeStartAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 017FC6D220FAA413BD7D191746186918 /* IFTTTLayerStrokeStartAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 07E73802CDFB92FB5AD22DC121B61CFA /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = B9E4C402E4D6835AAFE17C57E63ED316 /* IFTTTTextColorAnimation.h */; }; + 09D30087E025E9D2B30424981C48F3E7 /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 38DE256F90D274203BB0B7586C536768 /* IFTTTFrameAnimation.h */; }; + 09EDDD7FDDBE545F1651EB87B90EE7BE /* XCTestCase+Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = 739C414FEAE8C6E579E2A6672CC2BEFA /* XCTestCase+Specta.h */; }; + 0A44D9E1074AE7CF77FB7490B61EADDF /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = CE449897A111A7FC006B8660C5B7446B /* EXPMatchers+beGreaterThanOrEqualTo.h */; }; + 0A8B9BFE296F3AAD1F123C546E72BF49 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3FA964763C1DDB0BA9560E061CA98E /* IFTTTAlphaAnimation.h */; }; + 0AB56088B7A7A3D45B66C6BDB697E88B /* EXPMatchers+beTruthy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D2185136441FB8B281669BAA9B2C283 /* EXPMatchers+beTruthy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 0B92BD81FA310EA845D92D0F82BEDFA9 /* EXPMatchers+beFalsy.m in Sources */ = {isa = PBXBuildFile; fileRef = 02BB88871F8A376A6694285D966B7BD1 /* EXPMatchers+beFalsy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 0F24054D5BFB25E16986FAA029C73096 /* SPTExample.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AD978FEC8107CB5414FD65686099780 /* SPTExample.h */; }; + 113887BDA1743462B6C3DB9853A578BF /* SPTTestSuite.m in Sources */ = {isa = PBXBuildFile; fileRef = 9339D9187D0D833953BFF83FBDC6318B /* SPTTestSuite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 1198113A393D7D33B0F3359BB7744BAA /* SPTSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4478FE1575F6249DEF44A32F65BDEB3B /* SPTSpec.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 12157483148A10CACB66F1F3C1020587 /* EXPMatchers+beSupersetOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F633A3B997F9474EF4672947956E8E3 /* EXPMatchers+beSupersetOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 1224EAD9801E8C4E1D34AE68CE6C780D /* SPTSharedExampleGroups.h in Headers */ = {isa = PBXBuildFile; fileRef = 439D155986590405100077D4516A10CC /* SPTSharedExampleGroups.h */; }; + 12DB2E9313DE789948E572E43FBC903A /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 10E241FC9FA86B8755AC1637E56F48B3 /* IFTTTEasingFunction.h */; }; + 1515BDDC68C44C9075591D9D65038720 /* SpectaUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D7123431A0DA886D7C3DF29B8AB90028 /* SpectaUtility.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 1AEA98BA96CDF91F077DE12D25BEAE87 /* EXPMatchers+beCloseTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 5572C111EDD5C94CDA45FE8403A8CA28 /* EXPMatchers+beCloseTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 1AFA762020164C08EC80F3D277A8A75C /* IFTTTViewAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F7171AA6E08E5CC4941B507D4D11BDC9 /* IFTTTViewAnimation.h */; }; + 1BB935238FE80DF60822ECFF6E15223A /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A58A298CF4AD83AA2773054430AB2E8 /* View+MASAdditions.m */; }; + 1D49BB22B51E71ADC923063D51E6CAAB /* SPTSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 274F1CCE890DC33157C4AAD25A8AB1DE /* SPTSpec.h */; }; + 1D97E2B87F63B5B7B4E05864B3059381 /* SPTCallSite.h in Headers */ = {isa = PBXBuildFile; fileRef = C61B45BA4D81CB42405344BE39257114 /* SPTCallSite.h */; }; + 1F75EB3F2E6B39BE5F33D0EF226D07F3 /* EXPMatchers+beInTheRangeOf.h in Headers */ = {isa = PBXBuildFile; fileRef = E16304397FEF227A23092DA638C82446 /* EXPMatchers+beInTheRangeOf.h */; }; + 1F854FE91202751B66156CE36DDFE0D5 /* IFTTTBackgroundColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E88E59B6EDB6935BE7BC4E62EEBDEFF /* IFTTTBackgroundColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 1FB7DFE18F96E82963607D0CF4211231 /* EXPFloatTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FE34D74DFFDEC14B670E01760321 /* EXPFloatTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 1FBBB9EE3B11819E86C96E4EB1E6AE72 /* EXPMatchers+match.h in Headers */ = {isa = PBXBuildFile; fileRef = 902C38E1274810E40D30F3EDE7583A65 /* EXPMatchers+match.h */; }; + 1FCDA0A59B7DA09B92736326AF1A016A /* IFTTTLayerStrokeEndAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3592089E6B6764FA5085BF622FB4A28F /* IFTTTLayerStrokeEndAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2141CD11607D8776D7D865BFD72DE214 /* EXPUnsupportedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = CF987CC5EBA49241E2450AD835C9336E /* EXPUnsupportedObject.h */; }; + 2182F9FF2C3AF4F435CA277F60BB7EA8 /* EXPMatchers+conformTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 53413A54470EEECBCB3ED2076BEFC917 /* EXPMatchers+conformTo.h */; }; + 224E48C2F07345E51FED7115E98617D3 /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A5DBD67B0AC13F3B51DFC6E8EFD448EF /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 233881BD70FE2D2A1FEB6E7A2F8EA429 /* XCTestCase+Specta.m in Sources */ = {isa = PBXBuildFile; fileRef = 039307585B74513225DE868BD72CDDF2 /* XCTestCase+Specta.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 23D9116304AAE2A7E03EFA7ADB354DEF /* EXPMatchers+equal.m in Sources */ = {isa = PBXBuildFile; fileRef = F778B621E07B00779E8C0559EEF48295 /* EXPMatchers+equal.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2497E2237EF28BE466C66DB8B4EF6B4D /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C3656098A8F479FEFE47FE78F5B7D82 /* IFTTTCornerRadiusAnimation.h */; }; + 29B8C35B4E5C189EF20EC18505B88CEC /* EXPUnsupportedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 074CB9AEE48C00897532E99F4DD54B94 /* EXPUnsupportedObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 29F5428EFBBB87682558D6F0EEC8F7BF /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1541479B80B87EEB10575C0019A0886C /* MASConstraintMaker.m */; }; + 2ABDD7E8D8DE4726D84E1F2A979A8C46 /* IFTTTTranslationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = A1665585902A947D974113EBCFBB2CB3 /* IFTTTTranslationAnimation.h */; }; + 2AC3B91BEDBD10F33ACAC5870201F31E /* ExpectaSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 240D9CFF6C14BE0D9A6B60C560259873 /* ExpectaSupport.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2D54A731A05392D7DFCD53186BCA7165 /* EXPMatchers+beIdenticalTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CAC291410901C2348BDA4DCD911C612 /* EXPMatchers+beIdenticalTo.h */; }; + 2D9E0A060F0232DD15B5306C467AB687 /* IFTTTConstraintMultiplierAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D71069641BD5F781B575635DACF4EB9 /* IFTTTConstraintMultiplierAnimation.h */; }; + 2DDCADF3471597DC4F07C155AB6215CE /* IFTTTShapeLayerAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A3E90917A999E9FF906B583592407 /* IFTTTShapeLayerAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2ED94B7E9E99E45F47A442841DEA84B4 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C995AF079544567FFAD102FF82D3E710 /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2F29CA4EE41A564883D509C4D57CAD10 /* EXPMatchers+contain.m in Sources */ = {isa = PBXBuildFile; fileRef = 397C98202446A9506225D8D4F8AC4B30 /* EXPMatchers+contain.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 3292C3B3655620C7C055DE3700A1A528 /* EXPMatchers+beNil.m in Sources */ = {isa = PBXBuildFile; fileRef = D5E2308F20C4541E98548A6770D192C1 /* EXPMatchers+beNil.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 3300BF0D1C8F6929037EFAF74DA97C68 /* SPTCallSite.m in Sources */ = {isa = PBXBuildFile; fileRef = FC098F9EFC76345CDEFDCE8DBFA34AB0 /* SPTCallSite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 34449703F4296058417ED73754E48276 /* SPTExampleGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = E84B8AE44CAC9FA37E8282ABACBA57A9 /* SPTExampleGroup.h */; }; + 34BEA412544B2E7A253D1E9C280CB6FB /* EXPBlockDefinedMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = DCDA3128ABB9382CBEF4D668F241EB6B /* EXPBlockDefinedMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 379629D005838E241909BD3E8F5108DD /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AA514492A2A071B4C402B771323C81A /* IFTTTAnimatedScrollViewController.h */; }; + 38535B663FD658A94CC1D7F13DFB3BB7 /* IFTTTLayerFillColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = F29603C53D6E4E1A7EA6736D3C6374BC /* IFTTTLayerFillColorAnimation.h */; }; + 38914F59CB4CDCAB7B95E187D60E9520 /* ExpectaObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 34E555A119006DE80A85C17FF8CD9B36 /* ExpectaObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 38A2CF2F324AA123FA46ABF36B0D6F9B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F38BD6B2EA8E3D607D37364462D778DF /* CoreGraphics.framework */; }; + 39341B5FBBE44CEDD539CF1DC51021C0 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 888022AEFC3B3174B552185E61CE5584 /* MASLayoutConstraint.m */; }; + 39484DA1A54C6A69125842E45AAA251E /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = F43B145F6F49BD25867EA23C02E1BA06 /* IFTTTAnimator.h */; }; + 39DED9411A2A7D4892FE42170FF08B7D /* NSValue+Expecta.m in Sources */ = {isa = PBXBuildFile; fileRef = C7A249FEE57C22346B05B7994BFF3FD0 /* NSValue+Expecta.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 3BAFCE42B379E5702438EA9AB83AE2F5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC10E684DD68F44558F62A6931E6390A /* UIKit.framework */; }; + 3C4A84AB0617B01E93FE3F7BC1EDFB6B /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 93E3DBD91129F3B9C3942FF803ED5FAB /* NSLayoutConstraint+MASDebugAdditions.m */; }; + 401951A4ADC7E85843AA4400FBCF0A6D /* IFTTTConstraintConstantAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = E99D024E5F784133541724441FC2F638 /* IFTTTConstraintConstantAnimation.h */; }; + 434787BFB364FCC363E268BCEA25B412 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F2010A4D8DD54450B7DC01949F9C8035 /* View+MASShorthandAdditions.h */; }; + 45BFBD32B2F1A809E14A4B91FD73B121 /* EXPMatchers+raise.m in Sources */ = {isa = PBXBuildFile; fileRef = 92457E91286B083A7266E82F73AA4900 /* EXPMatchers+raise.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 45C415E1A681C0A9BE8D45362D0551D5 /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = 9230328A3DFC41F6F4175A7C15476F72 /* Masonry.h */; }; + 463CEB10D6F17AE42796F7EEFF9FD14F /* SPTExampleGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C35148BA2BD2F5C13707DE9ADD1E48D1 /* SPTExampleGroup.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4674EA21980730B9DE0C13B9C7CE9A34 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = A52E2914098688BDBAFC3E1D1FA83DD6 /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 492694830D43879AF1068DA41DE113AD /* EXPMatchers+match.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0B300C8497D3C88986E88DCCF3A718 /* EXPMatchers+match.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 4969F8004E63A7D6C3B4C6DB97F74791 /* Specta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F84AEE74F32BC419F27BE093F760E7C5 /* Specta-dummy.m */; }; + 4D25D63DE7DC16183585510B34DB080B /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D3EF0ABD850EDA264F0BAFB25B312BE /* MASCompositeConstraint.m */; }; + 4E94DCF82729DF8D98E99F29AAB00BE3 /* EXPDoubleTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = DE68907A3D1DDA1389A4B67B7C23F4C9 /* EXPDoubleTuple.h */; }; + 4ECA5480F8AEC4A553872713535477C9 /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = C7F66A045625D1435096068F130AC885 /* IFTTTJazzHands.h */; }; + 4FC451F18772F8E0A28ACD407E6D0D2E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + 53A7EE524B700616E8544EF243A738EC /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 29202C5DB7317367CB036B121CB16B61 /* MASCompositeConstraint.h */; }; + 5568D50DB7BD5E2BD678C6BCAC01DF00 /* Pods-JazzHandsTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A2B757FB2C593E3629B56B5082E61AB /* Pods-JazzHandsTests-dummy.m */; }; + 564DF10552D209A443F100703033909F /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F1BE4364C38BB8D3997A79D165523560 /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 59C4303608F831CEEE55148D67ED7109 /* IFTTTRotationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0813D7CCE93DF9FC7208102A816A5DBE /* IFTTTRotationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 5BFB60FB73F1A646C7F28D1FC7725B66 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DEB97F465B013C170D7E4672EF9878DE /* Masonry-dummy.m */; }; + 5C8CCF83DBE969E0B96079BFBC513D7F /* EXPMatchers+beginWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 2291C91CE4CFD39864CD61967E90742C /* EXPMatchers+beginWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 5D12F87FAC75704AB0E555E565444B9D /* IFTTTInterpolatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 248617CA3C52A0619F75C4AAD0EB233C /* IFTTTInterpolatable.h */; }; + 5F087DB00D7630C742067225FCB8EF29 /* EXPMatcherHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = A8E457F5C5FA7579DDD858E403184772 /* EXPMatcherHelpers.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 60BECF2EFBF82018C393C1D8C02E14F9 /* SPTCompiledExample.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EE3D98BAE31E2A1D84C0CBC741E2D7B /* SPTCompiledExample.h */; }; + 63725A0F64B164C6C3B2C767286EC437 /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F3B757C2350B998EC33E873A0632FB8F /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 6389307EECEDF33B7C6029A7D7341936 /* EXPMatchers+beSubclassOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 109DB120ECD56EB5D95DA72D18ED6AF9 /* EXPMatchers+beSubclassOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 65B963C3764B71427BED619C2E6BD83D /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 289497E8FCF89355E58891D37704ADFE /* MASConstraint.m */; }; + 676D50184B8C7965D0BEAAE0803F6D65 /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E500E91FCACA2C1502EDBF20C54BA5D /* MASConstraintMaker.h */; }; + 6783B7E9D0CBDBD2DAD9E49457A0DA82 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + 680598D408A6EA9E9A2B3FB3ACB37F34 /* EXPMatchers+beFalsy.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B1A4C4557882E3C8C642070A82864E3 /* EXPMatchers+beFalsy.h */; }; + 680FEC5DC208D895ADC5C95C8B385D2D /* EXPMatchers+beIdenticalTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B3C92EC4E399D3543EAEFAEFCFBC586 /* EXPMatchers+beIdenticalTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 6948E9263A05C5EFA82A649CFE1F75D9 /* SPTGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C0632B50DE110EFC8A10AD53DE5FE07 /* SPTGlobalBeforeAfterEach.h */; }; + 6A10264CF63BB1F9BEFC42DA97797889 /* Pods-JazzHandsDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F5AA6466E5CFC9EC77C7C69961AF0BF9 /* Pods-JazzHandsDemo-dummy.m */; }; + 6AFEA3903CB940FCB4594D7B6786FB7E /* EXPMatchers+beLessThan.h in Headers */ = {isa = PBXBuildFile; fileRef = E611E002EE8D03CAD27DB8D950A29491 /* EXPMatchers+beLessThan.h */; }; + 6B1CC60A5B27B27E49035841812195E2 /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADEA213D7D8619170AB9C3A80AC7BAB /* MASLayoutConstraint.h */; }; + 6B398CBF5682DA9EE8BA281B32688C7E /* IFTTTBackgroundColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 549D15680C5B8D9B8766F194283D1E25 /* IFTTTBackgroundColorAnimation.h */; }; + 6FC43C06143557C0FB370163A6750BB2 /* EXPMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D325390A8710E51553FA45D79BD1C98 /* EXPMatcher.h */; }; + 70E9C5B355EC19C65684DD7E408988B0 /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B88DECB64E8369145939917AFC2F03C /* MASViewAttribute.m */; }; + 72B3F54BDD3F1614BA49D525AA41C362 /* EXPMatchers+beInstanceOf.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C866ECB58DAA9CFCACAD26B740969A /* EXPMatchers+beInstanceOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 73C93E3CC16E33BB3B291E71F291D772 /* EXPMatchers+postNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 241198EE582FC113CAD1B6D6995971DB /* EXPMatchers+postNotification.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 7425B571ECAEE5A162A1B6B9C1B4869D /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = D340F50594D2F4E9059351E0F2BBCD0F /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 748EABA69E22EE0423380E984412BCC3 /* IFTTTConstraintMultiplierAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = AA7DE2EA41360E6C7CBB1291F86ED6CE /* IFTTTConstraintMultiplierAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 75BA922C19DCA9957871881BD29374D4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC10E684DD68F44558F62A6931E6390A /* UIKit.framework */; }; + 75D4E79C7E8DBFBFDC81972F4EE39DCC /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C4549C6F4E41D57F1009573AA927B58 /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 79A1B575017A7E1BBFF2274D91678732 /* EXPMatchers+raise.h in Headers */ = {isa = PBXBuildFile; fileRef = B952CDCCCC2CD9325C1B4CC3A6D4AD39 /* EXPMatchers+raise.h */; }; + 7AFAAD5A2F13102416AC967D2F8C34B8 /* EXPMatchers+beCloseTo.h in Headers */ = {isa = PBXBuildFile; fileRef = A52053B89834CE2D508A036A58030D55 /* EXPMatchers+beCloseTo.h */; }; + 7DC814404012C0FCFE7149D561A4E348 /* EXPMatchers+beginWith.h in Headers */ = {isa = PBXBuildFile; fileRef = 06429C0B758EED789E68DD6D1019CA91 /* EXPMatchers+beginWith.h */; }; + 7ECF6594D5BF0C76F17CF7C95CD2AE85 /* EXPMatchers+beKindOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 5950E9BE99B8F429C8AFF7AE7662D96C /* EXPMatchers+beKindOf.h */; }; + 7F94F6995F98F3E3E279702809DE05A1 /* SpectaTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = CF99FE6F64B865F4E4AEA41B5E68DB78 /* SpectaTypes.h */; }; + 7FBA7E60BD7C8AA24F9CD764ECE9B352 /* IFTTTPathPositionAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8556257F4CBFB21F7718750EEEE73718 /* IFTTTPathPositionAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 806F1431D196DF7486AF58F36FFAD6FC /* IFTTTAnimatedPagingScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 42C045A2DB0085AAE8AADF34D548B912 /* IFTTTAnimatedPagingScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 80AF866B628C2E835289DCEFC68A6FA9 /* IFTTTInterpolatable.m in Sources */ = {isa = PBXBuildFile; fileRef = 85E4DF546162ED78B0EB0D14D18563B9 /* IFTTTInterpolatable.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 82B8C06EA17CF6E1CA39446727B09550 /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DCF4429A4C1FBFBE14E06D24BCCFBFE9 /* IFTTTHideAnimation.h */; }; + 82F3E68A0935EE9682DB098319176372 /* IFTTTLayerFillColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E53E4E735B4EA57AB443C0C999D72848 /* IFTTTLayerFillColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 830A90FAE3F5FAD90B8C18328C690330 /* EXPFloatTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = FE38845655E796715A8F91C234BFBD1D /* EXPFloatTuple.h */; }; + 837FBD3C91BECDEB29038A97BAE895C5 /* SpectaDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 44750F273358F691D566C33252E3F829 /* SpectaDSL.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 845389102A8AB7F9266F9F7F9D2E5E2E /* SPTSharedExampleGroups.m in Sources */ = {isa = PBXBuildFile; fileRef = ABE30A66AB21BF5539E7F07B66BE0E9A /* SPTSharedExampleGroups.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 858C5F4DBE9E095E5371367874C568DC /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31281F6C0B269B0BE12175DDF3F5DA09 /* XCTest.framework */; }; + 89AEB64D3C4DF14A28F4C490D68D7FB3 /* EXPMatchers+endWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 8907D2FDB9BE66F533036B7139FF6D0A /* EXPMatchers+endWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 8A85D3182C247F545A468CF70F81BD7B /* SpectaDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6C643861AD186FA24948BC26BE887A /* SpectaDSL.h */; }; + 8D49D5D2BEC72D9C3646ADAD5848A5B4 /* EXPMatchers+haveCountOf.m in Sources */ = {isa = PBXBuildFile; fileRef = CA36B941D3DA431EBEDF1850FAB1EDBD /* EXPMatchers+haveCountOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 8DB9DF7740F1CC4E59581DB04D01B028 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 21CC79E8059D8DB568D9A094975204B3 /* MASConstraint.h */; }; + 8F93691EDF6CD03ACE2FE7E7512BC1D1 /* EXPMatchers+haveCountOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 13FA98AB1039849BB795C822CAEB533E /* EXPMatchers+haveCountOf.h */; }; + 917CE84066480C13029563D344EB9BCD /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = D0CB6C8B7BEF7D7F4654EFCEEA4BE035 /* MASViewAttribute.h */; }; + 91C7532E08414ED388424C41EC0937DC /* IFTTTScrollViewPageConstraintAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = B354A6E69AEC57DFD852CDF5644DD360 /* IFTTTScrollViewPageConstraintAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 9580BCD856AE6B65B5400EDE4E066397 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = A836D92B58014E3BFD8B916EC7FAE440 /* MASViewConstraint.h */; }; + 9671B3EB95DBB4B9CA3B0A25C5CC26EC /* EXPMatchers+beInTheRangeOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D837292CE0FF8206C520BDB4FFFCBC2 /* EXPMatchers+beInTheRangeOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 9AA53BDEAC954D0C54E18E7521232675 /* ExpectaSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 2491B930B7D1F76A39FFB408CDA739CE /* ExpectaSupport.h */; }; + 9E603E6D77612C0A4AC9344F62C9B291 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 73387320CCCE948631932AC117A1FD9A /* IFTTTScrollViewPageConstraintAnimation.h */; }; + A01726EAD6E0C432AC7FAEF79274DC96 /* IFTTTConstraintConstantAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B49D326FF48234ED67AB4B894753898 /* IFTTTConstraintConstantAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + A16CB69270E23187E9D24E555C591A6D /* Expecta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FE532F7977A7E08C1F828AD5FC3C85D7 /* Expecta-dummy.m */; }; + A1DD40EE68BEE53CEE299EA8D6023DFB /* SPTExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 476A0956DB554DFB1CD82C783C1A0CAC /* SPTExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + A2176516243047B7A669DBB40E52F59E /* EXPMatchers+beLessThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 41532C4D056DF42E03DD1E11E7D6F03F /* EXPMatchers+beLessThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A34E266BA17E968631E04BA1A9C5C00E /* EXPExpect.m in Sources */ = {isa = PBXBuildFile; fileRef = 517C24ABB2AE00DB4DA3D1F176420A34 /* EXPExpect.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A5D2500BBD59C1450FFB0B4DCF250C0C /* EXPMatchers+beSupersetOf.h in Headers */ = {isa = PBXBuildFile; fileRef = A58D6CD377F35F4EB94DEE4B695E07B8 /* EXPMatchers+beSupersetOf.h */; }; + A614FD3DABA5D9E390D16F7E22ABEB1F /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B7F76A8F2F270A862F8F388727EA1419 /* NSLayoutConstraint+MASDebugAdditions.h */; }; + A6CC5268BB571DE286AF17A37DBA116E /* UIView+IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C0A990A5AF02098FEE33D1B3E3513A2 /* UIView+IFTTTJazzHands.h */; }; + A7CD86BF0AABA24B599D748D824F7A7D /* XCTest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D1819DD8C0F51AEA8249E2E6AF37392 /* XCTest+Private.h */; }; + A91527692D3D275D7854785932EB68F9 /* EXPMatchers+endWith.h in Headers */ = {isa = PBXBuildFile; fileRef = BB24B5BEFD989D103654FFA4FD5DD9FB /* EXPMatchers+endWith.h */; }; + AAB337063E6F1357F19B4521490B7AD2 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 257ED81C3B6E3C3F79ED10F8A7D2F253 /* View+MASAdditions.h */; }; + AC3B1AD0813177D91A0E60D8081AB875 /* IFTTTViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = DBD703ECB28453EBDE7129AD437007B3 /* IFTTTViewAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + AE2FA414BDA81F80F8542336600E1594 /* EXPMatchers+beGreaterThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 39A4F92883A1EA9AC462D68B89A0A0B6 /* EXPMatchers+beGreaterThan.h */; }; + B1D6F2A1A733E1855D6EB6ABE0A36C3D /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = A838670FBCED2F3CA582C88DFE47F8E5 /* IFTTTAnimation.h */; }; + B1D749010EB65DE5CB2E580B13A382E7 /* EXPMatchers+beLessThan.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DE4E4D462BD16B6741FE39E5338A81A /* EXPMatchers+beLessThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B285C9F6A9B81325D0AA0E92C3482BA9 /* SPTTestSuite.h in Headers */ = {isa = PBXBuildFile; fileRef = 80DDC36D925729A51399070592A21A90 /* SPTTestSuite.h */; }; + B42F27B0A4AFB864F2A1015AA9AD9204 /* EXPMatchers+respondTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F580BFCDA7D94DE5798B242EF02DA96 /* EXPMatchers+respondTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B5C708A28DA3AF23242269491AB9250A /* Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = 43B371DB8D219320A8943C74CCD7B96F /* Expecta.h */; }; + B939E0FD6D785F2D49498B2C4CA3C553 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 39110B9DC3F194F2D3AF191CEBC362B2 /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + B9A617BF47D0C53A9ACA778272006A72 /* IFTTTPathPositionAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 202BA45B32EC397EB18C60369FE3B281 /* IFTTTPathPositionAnimation.h */; }; + BAC7CA6F276787D0FE07677725E0B175 /* IFTTTFilmstrip.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CFE8EA711BBBE7BE7550A9BD56C61EF /* IFTTTFilmstrip.h */; }; + BCE92825DA021C7FF7A64E91619243E6 /* IFTTTAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = CC5B31C3F33B66534ACA688918C48901 /* IFTTTAnimatable.h */; }; + BF8FDA039443185090571C7489A9E3D2 /* IFTTTFilmstrip.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A18D69CC44E60F85B7C25949947CC9E /* IFTTTFilmstrip.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + C2A368B25651C164F9B370A3A5EBE6A6 /* IFTTTShapeLayerAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB465E74FE1C7245764FCE04F870B75 /* IFTTTShapeLayerAnimation.h */; }; + C2C2573F8DB5E79CAA6C8C33B20F584C /* EXPMatchers+equal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8BAF57831E9734DE9A2B8E9FCCC7B91 /* EXPMatchers+equal.h */; }; + C6A05AA008F05E6C8EC79C9AE6CF4A14 /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = FE84A12B996695518311DA3C494CB13F /* IFTTTScaleAnimation.h */; }; + C8EECF8767F5D406DF0C61F9179A4A70 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 778F28937AAD3E90E1DC15850860F449 /* MASViewConstraint.m */; }; + C9605BE94C1A7BCB23D74F98F2D9BBAD /* EXPDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 535956B6230D0D5726B94544B1586B3D /* EXPDefines.h */; }; + C9DB2AD40125B0942ED0BB339D73C683 /* EXPMatchers.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B3F4C3503E6C633E6A1F769D5753111 /* EXPMatchers.h */; }; + CB27BBBDBC8B293DDDA7644DC0C2CD81 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + D1DA2BAE9D331458BF88CD0AC3056F98 /* EXPMatchers+raiseWithReason.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CFC057C52EE2A6DE239458D1FBBED9A /* EXPMatchers+raiseWithReason.h */; }; + D3BB4755818D01C5BBCF360FF7533F7E /* NSValue+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F823D670B378E3F3B1C6DCFC814634F /* NSValue+Expecta.h */; }; + D41B91325FDF52E59DE190950EC82525 /* EXPMatchers+beKindOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD462DB932E0CF9E404F08EC68BEAC6 /* EXPMatchers+beKindOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + D529A06A580AF31375B039AF35424B90 /* SpectaUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 229F3748A703778F7AF1CD314999B9DA /* SpectaUtility.h */; }; + D6B56C1921C36054CAB1D6EC17162B97 /* ExpectaObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D58D7864F8C1C7D0BDC67FBCEA333A9 /* ExpectaObject.h */; }; + D792A7A0110C9BC5246C3567EC82D85F /* EXPMatchers+beNil.h in Headers */ = {isa = PBXBuildFile; fileRef = A353918B7D857FB343CEE074EBBFA5C6 /* EXPMatchers+beNil.h */; }; + D8406E41FCFBF37645C9E09DCDEBBD34 /* IFTTTLayerStrokeEndAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = A79B2D894121CD0007654292154B3A11 /* IFTTTLayerStrokeEndAnimation.h */; }; + DBDCF7DB500A79CA8D2CDA010B3D382C /* EXPMatchers+respondTo.h in Headers */ = {isa = PBXBuildFile; fileRef = DC4A257E8F59403E0EE36B2AE0B0CAF7 /* EXPMatchers+respondTo.h */; }; + DBFB458F8DD7F1885189B471A27FD3D4 /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 723C788EE4CC5AF077956636C5E94A1D /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + DC7CEB45879B7893E6A6B88BB3C1913B /* IFTTTAnimatedPagingScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52DBFEBD676306CCA363511268DF33AB /* IFTTTAnimatedPagingScrollViewController.h */; }; + DCCA98B50C94D671EAB2A8401D5EC3A1 /* EXPMatchers+beSubclassOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 067233EFF021D699EC2BFB6CE8586D8B /* EXPMatchers+beSubclassOf.h */; }; + DDE649D09933209A5A3996C8A74BFACF /* IFTTTTranslationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FF95AAB9F514AD00B7885D3EA596C4C5 /* IFTTTTranslationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + DFB82EDD0A5BD4553FCD1079214F04C8 /* EXPMatchers+beInstanceOf.h in Headers */ = {isa = PBXBuildFile; fileRef = C80F2D797EA1D78FD7B34AC69E3FF2A8 /* EXPMatchers+beInstanceOf.h */; }; + E10E3FA330EA8C9F65CE65FA206984C4 /* IFTTTLayerStrokeStartAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E3343108889DCD7589DADD5B29717F8 /* IFTTTLayerStrokeStartAnimation.h */; }; + E2CC45755E71F6A5E7A3FE6BF13FCB52 /* NSObject+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = 673218E143FB3CA5F3E7B18DE547DA53 /* NSObject+Expecta.h */; }; + E46FF895D710A0D4A67B67202E8E4161 /* EXPMatcherHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = D707175482FA1D3E3C79BF4841141152 /* EXPMatcherHelpers.h */; }; + E4A8E8B4B0CE4D5E2A8C93F0ABE5FC01 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A0FA1B54BD155598E90FFB0738A5DE2B /* QuartzCore.framework */; }; + E7766F65255CCC046ED2B7EAB3C7C536 /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F58215B1B9D360582DFE8F7055FFFA3A /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + E8838E2E58A9476047CF5A215DD674F8 /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = CB5E76B708EA95481F7C14A1D52784C9 /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + E908D809235185DEC1A28C9420160DD7 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 323E02081128FFCC181E9F174D7F51A3 /* IFTTTTransform3DAnimation.h */; }; + EA65F2CFE3630A679DC208EBE613E36F /* EXPMatchers+beLessThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 98B9933347D6344DFC808F751C019F14 /* EXPMatchers+beLessThanOrEqualTo.h */; }; + EAFFACD65608496AD46AD54E45895E2A /* IFTTTRotationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = EECB2FA29D0F5886FC7EDFCE78E4461B /* IFTTTRotationAnimation.h */; }; + EB0691BC61ACBBA8C4C1AFF4394B3E4D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + EDA0E4FE81E9C094D994258EA6143C94 /* EXPMatchers+raiseWithReason.m in Sources */ = {isa = PBXBuildFile; fileRef = 65904F2DBC97DE38C57A681453A7317F /* EXPMatchers+raiseWithReason.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + EDA7EEDF476F5C02D9D42211D945B81B /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6878254997CF10937AE0DB2E6E8C25B0 /* NSArray+MASShorthandAdditions.h */; }; + EF4E8068C72B64F49D1CF4772F051FFF /* SPTExcludeGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A874C5A5C9210FB9EBF8AE74F5FDF0 /* SPTExcludeGlobalBeforeAfterEach.h */; }; + EFCB34D3D06D9016B6EDE986F1345201 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + F044E50D03CB8CC87583BD7B8CBC7624 /* SPTCompiledExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 97E017CFAF31AB762BBCA57D6FEA389E /* SPTCompiledExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F063A60DBCBBA076526555C41ACB6944 /* UIView+IFTTTJazzHands.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DC20D4CDAF1556C37EC20ECB983390E /* UIView+IFTTTJazzHands.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + F07FB7ECE5DA7E2CD062A73075BEC7DE /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041B392166417648DE97965F00951E4 /* EXPMatchers+beGreaterThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + F2B295BEF8E9B4936C5217E87744B3B2 /* EXPMatchers+postNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B939C3A1A5AEC8601A9FCD1B21FD1E6 /* EXPMatchers+postNotification.h */; }; + F2C694D094E0FD51A48DF16EE5B8CE76 /* EXPMatchers+beGreaterThan.m in Sources */ = {isa = PBXBuildFile; fileRef = ED007B475F422DDCECC68DB43B9CE57C /* EXPMatchers+beGreaterThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + F34DD1990298EA3F0C9B0C3DD515269F /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 278EE1149D48BC0B32BBAEB2F1AE5808 /* NSArray+MASAdditions.h */; }; + F3980A48F937DFC465EC24208CB451A0 /* EXPDoubleTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 4357BBD450F02ECA63791BF400D5BAAC /* EXPDoubleTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + F43F45130EA91679F312A2D2E7B6FC12 /* Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = B23712B0286454B97F688EA3E00CE475 /* Specta.h */; }; + F86DF2C8598F0D2DB88B13CB79976510 /* EXPExpect.h in Headers */ = {isa = PBXBuildFile; fileRef = 45D522101B40326050F2ED7DBD055DBD /* EXPExpect.h */; }; + F96BCFE42F5736362B9BD0CA8444C570 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31281F6C0B269B0BE12175DDF3F5DA09 /* XCTest.framework */; }; + FA41A706D66695B3046890950C59DAED /* EXPBlockDefinedMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A490377D2070BCF7CD8A95A8DFC3A55F /* EXPBlockDefinedMatcher.h */; }; + FB314B0699ADFA8DAFBC702D12032BC2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */; }; + FB9E6C5847348BA3CB43DC5C4B89EADD /* JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D8726E373349DF5E74BC65B64E3E2E /* JazzHands-dummy.m */; }; + FCE1C23E97083D6D21A84E5968EDAF96 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 897399199FD560D3425F52D51E1B906B /* MASUtilities.h */; }; + FE692DF46C60F005EB616C27A826A80C /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2720E6408315E49E8786711EC466E4C2 /* NSArray+MASAdditions.m */; }; + FEBE1DCB84A5C2A0513EDA063F3AA509 /* EXPMatchers+contain.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A578EEAA8DE8C1AECC87A01EC718ACC /* EXPMatchers+contain.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 4E354E530F8651F5D5438CF3 /* PBXContainerItemProxy */ = { + 0880A072E891C027C22DD622A3D7544E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = C16C44AFAEEB86A701910759 /* Project object */; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 8A6229949625CDF4302055FF; - remoteInfo = "Pods-JazzHandsTests-Expecta"; + remoteGlobalIDString = 6461F429FC34A261D9C5BC80A8A0168F; + remoteInfo = Specta; }; - B0EAE5804BAF46B2BA7C2144 /* PBXContainerItemProxy */ = { + 2EBA75BE8E777BA8BDE931CCBDAC1F3F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = C16C44AFAEEB86A701910759 /* Project object */; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 1BAEE0F54A94BCCE9852BE79; - remoteInfo = "Pods-JazzHandsTests-Specta"; + remoteGlobalIDString = DE8D6055D1EB4125419E68F583AEDFEF; + remoteInfo = JazzHands; }; - E5A2AAF03741624768E7A5B4 /* PBXContainerItemProxy */ = { + 333C8561CC099F5E68C2197A630CE4E4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = C16C44AFAEEB86A701910759 /* Project object */; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 46C63F80AE25A44731A70808; - remoteInfo = "Pods-JazzHandsDemo-JazzHands"; + remoteGlobalIDString = 384A9E45F2109FCBAFE63ED5C4C1DCCF; + remoteInfo = Masonry; }; - E78F0C3D6506DD454282392D /* PBXContainerItemProxy */ = { + 7DD34B4E1CC724C8F80A5428BFFAF8A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = C16C44AFAEEB86A701910759 /* Project object */; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E76FB6F4D30B4EC07AEEA8A3; - remoteInfo = "Pods-JazzHandsTests-JazzHands"; + remoteGlobalIDString = 384A9E45F2109FCBAFE63ED5C4C1DCCF; + remoteInfo = Masonry; + }; + 88C7DB72C9C964B30173FA576426A110 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1081246B2B8BF16266BA13C525E4A3EA; + remoteInfo = Expecta; + }; + D97FA108AD9F4FC9726AA2C690EE7CF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE8D6055D1EB4125419E68F583AEDFEF; + remoteInfo = JazzHands; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 01A063D479F7E7ED0ADA7C9F /* IFTTTCornerRadiusAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTCornerRadiusAnimation.m; sourceTree = ""; }; - 02410148FA9511863A054E12 /* Pods-JazzHandsDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsDemo-resources.sh"; sourceTree = ""; }; - 0385E9231A11BDEC59E31FC3 /* IFTTTTextColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTextColorAnimation.h; sourceTree = ""; }; - 056F3A6F464F3F77019C2057 /* EXPDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDefines.h; path = Expecta/EXPDefines.h; sourceTree = ""; }; - 05E2B8AD4E6A4FB10A3D60DD /* EXPMatchers+beSupersetOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSupersetOf.h"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.h"; sourceTree = ""; }; - 069882731E4D551CF7B80EC9 /* SpectaUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaUtility.h; path = Specta/Specta/SpectaUtility.h; sourceTree = ""; }; - 07A9B1FF0044C513E33841A9 /* EXPMatchers+beLessThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h"; sourceTree = ""; }; - 085BD59CA56065738DF42113 /* EXPMatchers+raiseWithReason.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raiseWithReason.m"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.m"; sourceTree = ""; }; - 09575E439CBF70EA95DB5A39 /* EXPBlockDefinedMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPBlockDefinedMatcher.h; path = Expecta/EXPBlockDefinedMatcher.h; sourceTree = ""; }; - 0C9CC552477FB201D26A2C8B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 0CF7BE4C7CD334FDE7799B95 /* EXPExpect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPExpect.m; path = Expecta/EXPExpect.m; sourceTree = ""; }; - 0DD2668D41D1B3BC3C559DE1 /* EXPMatchers+beSubclassOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSubclassOf.m"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.m"; sourceTree = ""; }; - 0E723542987580C4FEF93547 /* Pods-JazzHandsDemo-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-JazzHands-prefix.pch"; sourceTree = ""; }; - 0E8C366F517DDCC943F01AD3 /* IFTTTHideAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTHideAnimation.m; sourceTree = ""; }; - 0EF1204C44D8B49F7905C03A /* Pods-JazzHandsTests-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Pods-JazzHandsTests-JazzHands-prefix.pch"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; sourceTree = ""; }; - 0FD3CF03FD3994B9039C63EF /* IFTTTFillColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFillColorAnimation.m; sourceTree = ""; }; - 1110957F6855AE1BD2FB369F /* ExpectaSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaSupport.h; path = Expecta/ExpectaSupport.h; sourceTree = ""; }; - 11BB584B81272FC191A041A0 /* Pods-JazzHandsTests-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Pods-JazzHandsTests-JazzHands-dummy.m"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m"; sourceTree = ""; }; - 1319DDBF13541A4CECAF6F6C /* Pods-JazzHandsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.debug.xcconfig"; sourceTree = ""; }; - 13D205C03F477DA8F4A99A14 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands-Private.xcconfig"; sourceTree = ""; }; - 1537E4CE53FDCC85590BFC6C /* IFTTTTranslationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTranslationAnimation.m; sourceTree = ""; }; - 1581475D443D0D795DB1AC20 /* EXPFloatTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPFloatTuple.h; path = Expecta/EXPFloatTuple.h; sourceTree = ""; }; - 17C030FDB2672516FEC00B8A /* IFTTTAnimatedPagingScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedPagingScrollViewController.h; sourceTree = ""; }; - 1C6B72A5F6320F9CA082FB18 /* Pods-JazzHandsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.release.xcconfig"; sourceTree = ""; }; - 1E6987844DA1781B5E8F5749 /* EXPMatchers+beInTheRangeOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInTheRangeOf.h"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.h"; sourceTree = ""; }; - 20514729334487DACCC75BEB /* Pods-JazzHandsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.release.xcconfig"; sourceTree = ""; }; - 21035450E227DB901C3F33D7 /* EXPMatchers+postNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+postNotification.m"; path = "Expecta/Matchers/EXPMatchers+postNotification.m"; sourceTree = ""; }; - 23043E7DD2D5B53653FA27AE /* ExpectaSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaSupport.m; path = Expecta/ExpectaSupport.m; sourceTree = ""; }; - 2548213E96884E030A76C5D3 /* ExpectaObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaObject.h; path = Expecta/ExpectaObject.h; sourceTree = ""; }; - 26E49EE81C8B6906E648059D /* IFTTTViewAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTViewAnimation.h; sourceTree = ""; }; - 2706E0E7D9AA89E92BDBF199 /* Pods-JazzHandsDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-dummy.m"; sourceTree = ""; }; - 272D9B2C4213EEED01F9460E /* UIView+IFTTTJazzHands.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIView+IFTTTJazzHands.m"; sourceTree = ""; }; - 27D3203A4E720E7B7D3EE022 /* Pods-JazzHandsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.debug.xcconfig"; sourceTree = ""; }; - 29255C0F3CF62A4B1DF8E6A4 /* XCTestCase+Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTestCase+Specta.h"; path = "Specta/Specta/XCTestCase+Specta.h"; sourceTree = ""; }; - 294E402DA2EEE4E96A109F72 /* IFTTTFillColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFillColorAnimation.h; sourceTree = ""; }; - 2A04DD1C2E7D7F22A7C8B0B9 /* EXPMatchers+match.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+match.m"; path = "Expecta/Matchers/EXPMatchers+match.m"; sourceTree = ""; }; - 2A9F0CDB69C4A5232F0AD6B7 /* Pods-JazzHandsTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsTests-acknowledgements.markdown"; sourceTree = ""; }; - 2AA02D9FFB8AF6184582149C /* EXPMatchers+postNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+postNotification.h"; path = "Expecta/Matchers/EXPMatchers+postNotification.h"; sourceTree = ""; }; - 2ABB96F59464DE2566C69AFA /* EXPMatchers+endWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+endWith.m"; path = "Expecta/Matchers/EXPMatchers+endWith.m"; sourceTree = ""; }; - 2D39B8556F16E1CC786632B2 /* Pods-JazzHandsTests-Specta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-Specta-prefix.pch"; sourceTree = ""; }; - 2E57316DD118F52E45207152 /* SPTExcludeGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExcludeGlobalBeforeAfterEach.h; path = Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h; sourceTree = ""; }; - 2E64BC8420E597A057004433 /* IFTTTAnimatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatable.h; sourceTree = ""; }; - 30D4A17355F3E76FE956DD8F /* IFTTTAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimation.h; sourceTree = ""; }; - 33EBD14E380909DBEB60A523 /* IFTTTTranslationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTranslationAnimation.h; sourceTree = ""; }; - 3446018392C5339D4A3631D3 /* IFTTTTextColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTextColorAnimation.m; sourceTree = ""; }; - 39A24AC2A3192B4E396BDCCD /* IFTTTAnimatedScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedScrollViewController.m; sourceTree = ""; }; - 3B4DF6374CDAF3E0A03C5B2A /* EXPMatchers+beginWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beginWith.h"; path = "Expecta/Matchers/EXPMatchers+beginWith.h"; sourceTree = ""; }; - 3F58F3024B5A99ABF02A9148 /* Pods-JazzHandsTests-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig"; sourceTree = ""; }; - 40C00AF8AB4E778B0DC6A1AA /* Pods-JazzHandsTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsTests-acknowledgements.plist"; sourceTree = ""; }; - 411FE79644EFC92FD5999BC2 /* SPTExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExample.h; path = Specta/Specta/SPTExample.h; sourceTree = ""; }; - 41665A98E7A2989C0540932B /* IFTTTScaleAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScaleAnimation.h; sourceTree = ""; }; - 42240CBAB22777F1797A8EA5 /* EXPMatchers+raise.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raise.m"; path = "Expecta/Matchers/EXPMatchers+raise.m"; sourceTree = ""; }; - 42BA0CDE0F2BAC913D576C66 /* Pods-JazzHandsDemo-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands.xcconfig"; sourceTree = ""; }; - 439F8F70ABD2957C877335D2 /* EXPMatchers+beTruthy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beTruthy.h"; path = "Expecta/Matchers/EXPMatchers+beTruthy.h"; sourceTree = ""; }; - 4491CD033F8C68F60DC98D2D /* EXPMatchers+beNil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beNil.m"; path = "Expecta/Matchers/EXPMatchers+beNil.m"; sourceTree = ""; }; - 45217821746137F806307B8B /* IFTTTAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimator.m; sourceTree = ""; }; - 4714C82809C283AD75123D20 /* IFTTTAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimation.m; sourceTree = ""; }; - 475496CF1856DA976736F2C3 /* IFTTTRotationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTRotationAnimation.m; sourceTree = ""; }; - 47830E8280C22A00348B3A3A /* IFTTTAnimatedScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedScrollViewController.h; sourceTree = ""; }; - 4974C86B8D66A56007169259 /* XCTest+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTest+Private.h"; path = "Specta/Specta/XCTest+Private.h"; sourceTree = ""; }; - 4C022B31F1996A4E30BC964B /* SPTExampleGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExampleGroup.h; path = Specta/Specta/SPTExampleGroup.h; sourceTree = ""; }; - 4D3BC093FBD571E07F702DE6 /* EXPMatchers+beInstanceOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInstanceOf.m"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.m"; sourceTree = ""; }; - 4DD4285C28553964278F5CCC /* libPods-JazzHandsTests-Specta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-Specta.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4DF20F56A9E619A9CD821D55 /* SpectaDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaDSL.h; path = Specta/Specta/SpectaDSL.h; sourceTree = ""; }; - 4E5B6302116ECAF896A36A02 /* EXPMatchers+beSupersetOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSupersetOf.m"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.m"; sourceTree = ""; }; - 4EFD2D093A5CA5ADC681AE8E /* EXPBlockDefinedMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPBlockDefinedMatcher.m; path = Expecta/EXPBlockDefinedMatcher.m; sourceTree = ""; }; - 55AAA9162E2BBEDDAAFC1524 /* EXPMatchers+beInTheRangeOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInTheRangeOf.m"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.m"; sourceTree = ""; }; - 55FF746A899C264E74823631 /* IFTTTCornerRadiusAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTCornerRadiusAnimation.h; sourceTree = ""; }; - 56CF580A1548C16138C1A174 /* EXPMatchers+beFalsy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beFalsy.h"; path = "Expecta/Matchers/EXPMatchers+beFalsy.h"; sourceTree = ""; }; - 5B5B8553878CEBEF88C5BB9B /* EXPMatchers+beLessThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThan.m"; path = "Expecta/Matchers/EXPMatchers+beLessThan.m"; sourceTree = ""; }; - 5C44FA18D390D4A7C180C747 /* IFTTTConstraintConstantAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintConstantAnimation.m; sourceTree = ""; }; - 5E1050E299910C9551A73727 /* SPTTestSuite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTTestSuite.h; path = Specta/Specta/SPTTestSuite.h; sourceTree = ""; }; - 5F29880F4B7BB0C295040701 /* EXPMatchers+equal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+equal.h"; path = "Expecta/Matchers/EXPMatchers+equal.h"; sourceTree = ""; }; - 6022CE483547D3A6727C0AC8 /* IFTTTInterpolatable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTInterpolatable.m; sourceTree = ""; }; - 6067F91822EB4F1D3752C0B0 /* IFTTTStrokeEndAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTStrokeEndAnimation.m; sourceTree = ""; }; - 60A898A457ECC717FF89B1F2 /* EXPMatchers+beIdenticalTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beIdenticalTo.h"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.h"; sourceTree = ""; }; - 6186EC8D959CB54D484F6989 /* EXPMatcherHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPMatcherHelpers.m; path = Expecta/Matchers/EXPMatcherHelpers.m; sourceTree = ""; }; - 61B3B16635730AB19C470062 /* IFTTTFrameAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFrameAnimation.m; sourceTree = ""; }; - 641BC4FE9A9657D810384555 /* EXPMatchers+equal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+equal.m"; path = "Expecta/Matchers/EXPMatchers+equal.m"; sourceTree = ""; }; - 652870E176D149654FC4F114 /* IFTTTStrokeEndAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTStrokeEndAnimation.h; sourceTree = ""; }; - 6545EF0918678FA7FCC8F050 /* IFTTTLabelAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTLabelAnimation.h; sourceTree = ""; }; - 6564E350AAA1B2647EF101AE /* IFTTTScrollViewPageConstraintAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScrollViewPageConstraintAnimation.m; sourceTree = ""; }; - 6633193AD4BA6AFAF71B370B /* EXPMatchers+beTruthy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beTruthy.m"; path = "Expecta/Matchers/EXPMatchers+beTruthy.m"; sourceTree = ""; }; - 66827CB2F1A3D514BB314695 /* IFTTTEasingFunction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTEasingFunction.m; sourceTree = ""; }; - 66C5C5B6E2894A60757FF56C /* IFTTTEasingFunction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTEasingFunction.h; sourceTree = ""; }; - 6929F82124DD106E6E9EFDAF /* Pods-JazzHandsTests-Expecta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-Expecta-prefix.pch"; sourceTree = ""; }; - 6AEA0508E6B6580768E25A11 /* SPTExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExample.m; path = Specta/Specta/SPTExample.m; sourceTree = ""; }; - 6AF6E47F5FB8196B619F2194 /* Pods-JazzHandsTests-Specta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-Specta-dummy.m"; sourceTree = ""; }; - 6B89F3FC74388C51C36E8894 /* EXPMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcher.h; path = Expecta/EXPMatcher.h; sourceTree = ""; }; - 6E599076A43298BB62D0BCAF /* EXPMatchers+beginWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beginWith.m"; path = "Expecta/Matchers/EXPMatchers+beginWith.m"; sourceTree = ""; }; - 6F877527E404A15C4C0BF7F6 /* SPTSharedExampleGroups.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSharedExampleGroups.h; path = Specta/Specta/SPTSharedExampleGroups.h; sourceTree = ""; }; - 710EC4E5C7FE49A60DACAEAB /* EXPMatcherHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcherHelpers.h; path = Expecta/Matchers/EXPMatcherHelpers.h; sourceTree = ""; }; - 7339B482CD14D83172838D4A /* EXPMatchers+contain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+contain.m"; path = "Expecta/Matchers/EXPMatchers+contain.m"; sourceTree = ""; }; - 7436478379463FAEDCFC50C7 /* IFTTTStrokeStartAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTStrokeStartAnimation.h; sourceTree = ""; }; - 74C5B94E1F22A2B62F684DCA /* EXPMatchers+beLessThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m"; sourceTree = ""; }; - 74F71FE57ED77EC851C5B74E /* Pods-JazzHandsTests-Specta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Specta.xcconfig"; sourceTree = ""; }; - 750FB2EF7FDC6010FCCA2506 /* IFTTTTransform3DAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTransform3DAnimation.m; sourceTree = ""; }; - 759ED3AE9DCE9A46B442A9A2 /* EXPMatchers+contain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+contain.h"; path = "Expecta/Matchers/EXPMatchers+contain.h"; sourceTree = ""; }; - 75C654997F9E90270462B9C3 /* Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Specta.h; path = Specta/Specta/Specta.h; sourceTree = ""; }; - 77EAD45720FB5D5E2CA928C3 /* EXPMatchers+beIdenticalTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beIdenticalTo.m"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.m"; sourceTree = ""; }; - 785DDBC1ECA68425191C8A4D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 78645949EDC177E1FBC00F5E /* IFTTTShapeLayerAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTShapeLayerAnimation.h; sourceTree = ""; }; - 7907D01D0D268B01F5E91357 /* IFTTTShapeLayerAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTShapeLayerAnimation.m; sourceTree = ""; }; - 7A621680EDE998BA81FDE667 /* EXPMatchers+endWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+endWith.h"; path = "Expecta/Matchers/EXPMatchers+endWith.h"; sourceTree = ""; }; - 7C2F2F69A591B1C0705BC293 /* Pods-JazzHandsDemo-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-environment.h"; sourceTree = ""; }; - 7CD0CD9FC41731400E239262 /* NSValue+Expecta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+Expecta.m"; path = "Expecta/NSValue+Expecta.m"; sourceTree = ""; }; - 7F1D3C86CB28C9691E3D9914 /* XCTestCase+Specta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestCase+Specta.m"; path = "Specta/Specta/XCTestCase+Specta.m"; sourceTree = ""; }; - 8011556FDF9F30507CCDDB97 /* libPods-JazzHandsDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 838017DD02842D44F5EE765D /* EXPFloatTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPFloatTuple.m; path = Expecta/EXPFloatTuple.m; sourceTree = ""; }; - 84E383F1CCF3088D055550A6 /* SPTCallSite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCallSite.m; path = Specta/Specta/SPTCallSite.m; sourceTree = ""; }; - 85E852DF9A8D8B6C5BD9D174 /* IFTTTAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimator.h; sourceTree = ""; }; - 8D3536E34D98AD361993E21C /* SpectaUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaUtility.m; path = Specta/Specta/SpectaUtility.m; sourceTree = ""; }; - 8D891D288817872D5AD9FC40 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 8EDA2EB03F64F6C8B3AD147C /* EXPUnsupportedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPUnsupportedObject.h; path = Expecta/EXPUnsupportedObject.h; sourceTree = ""; }; - 907DD1B245F66962FCC38175 /* ExpectaObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaObject.m; path = Expecta/ExpectaObject.m; sourceTree = ""; }; - 934434C0BD2DB769110411CD /* EXPMatchers+beSubclassOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSubclassOf.h"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.h"; sourceTree = ""; }; - 9576A2DE3D9C00ED4B963C10 /* EXPMatchers+raise.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raise.h"; path = "Expecta/Matchers/EXPMatchers+raise.h"; sourceTree = ""; }; - 95CD90EE7B68BECE534221AB /* EXPMatchers+beNil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beNil.h"; path = "Expecta/Matchers/EXPMatchers+beNil.h"; sourceTree = ""; }; - 992D08D1D41A4CF21734DAE3 /* libPods-JazzHandsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9B1B5419A0190E33FC50F04E /* EXPMatchers+conformTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+conformTo.h"; path = "Expecta/Matchers/EXPMatchers+conformTo.h"; sourceTree = ""; }; - 9C49CA465A2547739740C01D /* SPTCompiledExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCompiledExample.m; path = Specta/Specta/SPTCompiledExample.m; sourceTree = ""; }; - 9C4A2ED28DFE02466E7B2DB6 /* IFTTTTransform3DAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTransform3DAnimation.h; sourceTree = ""; }; - 9D42A7CED746B6B91A99B360 /* EXPMatchers+beLessThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThan.h"; path = "Expecta/Matchers/EXPMatchers+beLessThan.h"; sourceTree = ""; }; - 9D5F2D6BA0BCFE437618171D /* EXPMatchers+beGreaterThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThan.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.h"; sourceTree = ""; }; - 9D85F65556ED22B74787D161 /* EXPDoubleTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPDoubleTuple.m; path = Expecta/EXPDoubleTuple.m; sourceTree = ""; }; - 9DE31AA03022BE3B166158A4 /* EXPMatchers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatchers.h; path = Expecta/Matchers/EXPMatchers.h; sourceTree = ""; }; - 9E3DACEFD08C0645E69178D2 /* IFTTTAlphaAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAlphaAnimation.m; sourceTree = ""; }; - 9EB30BAB5EC76B74CE45FB9E /* Pods-JazzHandsTests-Specta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Specta-Private.xcconfig"; sourceTree = ""; }; - 9FCDBAEBFDD5F2EFE2BFF59D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 9FE004A8C521BD9ACAAA87F7 /* Pods-JazzHandsTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-dummy.m"; sourceTree = ""; }; - A0662A21ACE7C1E14AF1FAA9 /* SPTCallSite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCallSite.h; path = Specta/Specta/SPTCallSite.h; sourceTree = ""; }; - A1F47E4C663DEEFEBDE6474C /* EXPUnsupportedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPUnsupportedObject.m; path = Expecta/EXPUnsupportedObject.m; sourceTree = ""; }; - A26063CB8EC8E43B6A342C1E /* EXPMatchers+respondTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+respondTo.m"; path = "Expecta/Matchers/EXPMatchers+respondTo.m"; sourceTree = ""; }; - A3F7DE6E48FEC85D3FAF87C9 /* IFTTTConstraintConstantAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintConstantAnimation.h; sourceTree = ""; }; - A7ACD2D2EBCF6E377FD67E00 /* SPTGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTGlobalBeforeAfterEach.h; path = Specta/Specta/SPTGlobalBeforeAfterEach.h; sourceTree = ""; }; - A8FD15B85FF51D8CDCC2FD5A /* SPTCompiledExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCompiledExample.h; path = Specta/Specta/SPTCompiledExample.h; sourceTree = ""; }; - ACE17D3C0CDAE51D6E6672DC /* EXPExpect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPExpect.h; path = Expecta/EXPExpect.h; sourceTree = ""; }; - AE00247518DCD77900CF76A3 /* IFTTTRotationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTRotationAnimation.h; sourceTree = ""; }; - AE752EA8051EDDBB5FBAC953 /* NSValue+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSValue+Expecta.h"; path = "Expecta/NSValue+Expecta.h"; sourceTree = ""; }; - AFBE40D3D0603C5727D292FE /* EXPMatchers+beFalsy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beFalsy.m"; path = "Expecta/Matchers/EXPMatchers+beFalsy.m"; sourceTree = ""; }; - B02B9C1E6538ACC6BBC21CEA /* EXPMatchers+beGreaterThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h"; sourceTree = ""; }; - B1212A8114D53161D6FB685D /* NSObject+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+Expecta.h"; path = "Expecta/NSObject+Expecta.h"; sourceTree = ""; }; - B383AE2E43A2CE2341AC6C7E /* IFTTTViewAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTViewAnimation.m; sourceTree = ""; }; - B3D1DD8DFA8F080872960CA8 /* EXPMatchers+beKindOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beKindOf.h"; path = "Expecta/Matchers/EXPMatchers+beKindOf.h"; sourceTree = ""; }; - B41BC4F59C9AFB0F2B2F9709 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - B41E7A44F69A601BA2E42AC8 /* EXPMatchers+beGreaterThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThan.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.m"; sourceTree = ""; }; - B5B4B8A49B8B86B75C90676C /* EXPDoubleTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDoubleTuple.h; path = Expecta/EXPDoubleTuple.h; sourceTree = ""; }; - B84FFC80140FB9FFF1D61249 /* Pods-JazzHandsDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsDemo-acknowledgements.markdown"; sourceTree = ""; }; - B9A4CAA18F8634246067D4E0 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - B9A680AEBD78661666B26114 /* SPTSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSpec.m; path = Specta/Specta/SPTSpec.m; sourceTree = ""; }; - BAAC3FB77DFAC352B8E52CD3 /* EXPMatchers+beKindOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beKindOf.m"; path = "Expecta/Matchers/EXPMatchers+beKindOf.m"; sourceTree = ""; }; - BBEA0F11C67AA49A843453E7 /* EXPMatchers+haveCountOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+haveCountOf.m"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.m"; sourceTree = ""; }; - BCB5203E60770E20F1BF4F5F /* IFTTTScaleAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScaleAnimation.m; sourceTree = ""; }; - BE3994FF1E749D82E426F273 /* Pods-JazzHandsDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsDemo-acknowledgements.plist"; sourceTree = ""; }; - BF2126960454E4508B4C8F47 /* IFTTTFilmstrip.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFilmstrip.h; sourceTree = ""; }; - BF8E7F1EEE95E55452C23AEB /* EXPMatchers+haveCountOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+haveCountOf.h"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.h"; sourceTree = ""; }; - C3DD9F07C9B3B9742C11384F /* SPTSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSpec.h; path = Specta/Specta/SPTSpec.h; sourceTree = ""; }; - C4D9476B57070C1EA13B45CB /* libPods-JazzHandsTests-Expecta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-Expecta.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - C748F8880E0A11BF2D91BFB3 /* IFTTTAnimatedPagingScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedPagingScrollViewController.m; sourceTree = ""; }; - C7824ABCCD4DB01B5092F46D /* IFTTTScrollViewPageConstraintAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScrollViewPageConstraintAnimation.h; sourceTree = ""; }; - C835FE7F279FDDC568CAACD6 /* SPTExampleGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExampleGroup.m; path = Specta/Specta/SPTExampleGroup.m; sourceTree = ""; }; - C875903EE48EE7513A5495A1 /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands-Private.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig"; sourceTree = ""; }; - CE734C94E8443D6FADDBB7BD /* SpectaDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaDSL.m; path = Specta/Specta/SpectaDSL.m; sourceTree = ""; }; - D09A2DD9308A955710899C86 /* EXPMatchers+conformTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+conformTo.m"; path = "Expecta/Matchers/EXPMatchers+conformTo.m"; sourceTree = ""; }; - D0AEE595E08376FA3AECF837 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Expecta-Private.xcconfig"; sourceTree = ""; }; - D1A7CA255EEE41815C415CEA /* IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTJazzHands.h; sourceTree = ""; }; - D1DECE85F99DB176A990CB84 /* IFTTTFilmstrip.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFilmstrip.m; sourceTree = ""; }; - D45C64A3B920291E2CA08B3D /* IFTTTStrokeStartAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTStrokeStartAnimation.m; sourceTree = ""; }; - D5F0B5332F43EBB506D452FF /* Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Expecta.h; path = Expecta/Expecta.h; sourceTree = ""; }; - D71CC96F4DD135744424EB3F /* EXPMatchers+beCloseTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beCloseTo.m"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.m"; sourceTree = ""; }; - D9375A8FA1FB91E14D42BFB3 /* EXPMatchers+beCloseTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beCloseTo.h"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.h"; sourceTree = ""; }; - D9612CA2B60C3E8A91FC066E /* SpectaTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaTypes.h; path = Specta/Specta/SpectaTypes.h; sourceTree = ""; }; - DC6D99FDA4AB993DC6B0B082 /* Pods-JazzHandsTests-Expecta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Expecta.xcconfig"; sourceTree = ""; }; - DC97B97BE29E599A1E061DF4 /* IFTTTConstraintMultiplierAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintMultiplierAnimation.m; sourceTree = ""; }; - DDE0D1A0A631EF774B5B5EA3 /* EXPMatchers+raiseWithReason.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raiseWithReason.h"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.h"; sourceTree = ""; }; - DF26417E447AAA9B5BE0B962 /* UIView+IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIView+IFTTTJazzHands.h"; sourceTree = ""; }; - E148F4C7E1F7B4AE6859D5F3 /* EXPMatchers+beGreaterThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m"; sourceTree = ""; }; - E201135640ABD991AB704B67 /* EXPMatchers+beInstanceOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInstanceOf.h"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.h"; sourceTree = ""; }; - E28E5B7BEE4F0CB18DBF7624 /* IFTTTColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTColorAnimation.h; sourceTree = ""; }; - E2E57523EB6AA145577FAEE0 /* EXPMatchers+match.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+match.h"; path = "Expecta/Matchers/EXPMatchers+match.h"; sourceTree = ""; }; - E39426B0F2CD4F298CB47CEF /* Pods-JazzHandsTests-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-environment.h"; sourceTree = ""; }; - E73A5EC36B307783A21CFDDB /* IFTTTInterpolatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTInterpolatable.h; sourceTree = ""; }; - EAB88DD680277C61C98FC295 /* IFTTTAlphaAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAlphaAnimation.h; sourceTree = ""; }; - EE4984D09E42888921D0E413 /* IFTTTHideAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTHideAnimation.h; sourceTree = ""; }; - F15AEFA328224BC372E4EB56 /* IFTTTFrameAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFrameAnimation.h; sourceTree = ""; }; - F176914B861567AB8DB7145C /* libPods-JazzHandsDemo-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - F3550B6564714C53C72E7E07 /* Pods-JazzHandsTests-Expecta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-Expecta-dummy.m"; sourceTree = ""; }; - F4A4D3AE9B257720CC1A3719 /* Pods-JazzHandsDemo-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-JazzHands-dummy.m"; sourceTree = ""; }; - F7993624656BB6FA551993BB /* IFTTTLabelAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTLabelAnimation.m; sourceTree = ""; }; - F7C0192850549356DAF19349 /* IFTTTConstraintMultiplierAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintMultiplierAnimation.h; sourceTree = ""; }; - F92F4C576AA5DF053E7FE99E /* IFTTTColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTColorAnimation.m; sourceTree = ""; }; - FA1F70434A46B8430904BA8A /* Pods-JazzHandsTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsTests-resources.sh"; sourceTree = ""; }; - FBB7DE6A6D8019C196B680D6 /* SPTSharedExampleGroups.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSharedExampleGroups.m; path = Specta/Specta/SPTSharedExampleGroups.m; sourceTree = ""; }; - FBE18933E13686194E220A52 /* EXPMatchers+respondTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+respondTo.h"; path = "Expecta/Matchers/EXPMatchers+respondTo.h"; sourceTree = ""; }; - FCF99CF5BE8060D20C0A3EE7 /* libPods-JazzHandsTests-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - FF049F59D8CA2671225B373D /* SPTTestSuite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTTestSuite.m; path = Specta/Specta/SPTTestSuite.m; sourceTree = ""; }; + 017FC6D220FAA413BD7D191746186918 /* IFTTTLayerStrokeStartAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTLayerStrokeStartAnimation.m; sourceTree = ""; }; + 02BB88871F8A376A6694285D966B7BD1 /* EXPMatchers+beFalsy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beFalsy.m"; path = "Expecta/Matchers/EXPMatchers+beFalsy.m"; sourceTree = ""; }; + 039307585B74513225DE868BD72CDDF2 /* XCTestCase+Specta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestCase+Specta.m"; path = "Specta/Specta/XCTestCase+Specta.m"; sourceTree = ""; }; + 06429C0B758EED789E68DD6D1019CA91 /* EXPMatchers+beginWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beginWith.h"; path = "Expecta/Matchers/EXPMatchers+beginWith.h"; sourceTree = ""; }; + 067233EFF021D699EC2BFB6CE8586D8B /* EXPMatchers+beSubclassOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSubclassOf.h"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.h"; sourceTree = ""; }; + 074CB9AEE48C00897532E99F4DD54B94 /* EXPUnsupportedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPUnsupportedObject.m; path = Expecta/EXPUnsupportedObject.m; sourceTree = ""; }; + 0813D7CCE93DF9FC7208102A816A5DBE /* IFTTTRotationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTRotationAnimation.m; sourceTree = ""; }; + 0A0B300C8497D3C88986E88DCCF3A718 /* EXPMatchers+match.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+match.m"; path = "Expecta/Matchers/EXPMatchers+match.m"; sourceTree = ""; }; + 0B24F39CC45C26A9EF321AD8649AA2AE /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; + 0D325390A8710E51553FA45D79BD1C98 /* EXPMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcher.h; path = Expecta/EXPMatcher.h; sourceTree = ""; }; + 0D71069641BD5F781B575635DACF4EB9 /* IFTTTConstraintMultiplierAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintMultiplierAnimation.h; sourceTree = ""; }; + 0E88E59B6EDB6935BE7BC4E62EEBDEFF /* IFTTTBackgroundColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTBackgroundColorAnimation.m; sourceTree = ""; }; + 0F633A3B997F9474EF4672947956E8E3 /* EXPMatchers+beSupersetOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSupersetOf.m"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.m"; sourceTree = ""; }; + 109DB120ECD56EB5D95DA72D18ED6AF9 /* EXPMatchers+beSubclassOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSubclassOf.m"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.m"; sourceTree = ""; }; + 10E241FC9FA86B8755AC1637E56F48B3 /* IFTTTEasingFunction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTEasingFunction.h; sourceTree = ""; }; + 13FA98AB1039849BB795C822CAEB533E /* EXPMatchers+haveCountOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+haveCountOf.h"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.h"; sourceTree = ""; }; + 143BFB0B98F1A2EE6862EBB1C95ED766 /* Expecta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Expecta-prefix.pch"; sourceTree = ""; }; + 1541479B80B87EEB10575C0019A0886C /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; + 1ADEA213D7D8619170AB9C3A80AC7BAB /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + 1B51AFFF317198196C9524ACD7651F28 /* Pods-JazzHandsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.debug.xcconfig"; sourceTree = ""; }; + 1D58D7864F8C1C7D0BDC67FBCEA333A9 /* ExpectaObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaObject.h; path = Expecta/ExpectaObject.h; sourceTree = ""; }; + 1F580BFCDA7D94DE5798B242EF02DA96 /* EXPMatchers+respondTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+respondTo.m"; path = "Expecta/Matchers/EXPMatchers+respondTo.m"; sourceTree = ""; }; + 2009023B8D773B413428D7EDB3F88A4E /* libPods-JazzHandsDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 202BA45B32EC397EB18C60369FE3B281 /* IFTTTPathPositionAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTPathPositionAnimation.h; sourceTree = ""; }; + 20D7552C29B8466BFD771A0829A23D25 /* Pods-JazzHandsTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsTests-acknowledgements.markdown"; sourceTree = ""; }; + 21CC79E8059D8DB568D9A094975204B3 /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; + 2291C91CE4CFD39864CD61967E90742C /* EXPMatchers+beginWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beginWith.m"; path = "Expecta/Matchers/EXPMatchers+beginWith.m"; sourceTree = ""; }; + 229F3748A703778F7AF1CD314999B9DA /* SpectaUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaUtility.h; path = Specta/Specta/SpectaUtility.h; sourceTree = ""; }; + 240D9CFF6C14BE0D9A6B60C560259873 /* ExpectaSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaSupport.m; path = Expecta/ExpectaSupport.m; sourceTree = ""; }; + 241198EE582FC113CAD1B6D6995971DB /* EXPMatchers+postNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+postNotification.m"; path = "Expecta/Matchers/EXPMatchers+postNotification.m"; sourceTree = ""; }; + 248617CA3C52A0619F75C4AAD0EB233C /* IFTTTInterpolatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTInterpolatable.h; sourceTree = ""; }; + 2491B930B7D1F76A39FFB408CDA739CE /* ExpectaSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaSupport.h; path = Expecta/ExpectaSupport.h; sourceTree = ""; }; + 24BAB4F5013D6BFADA4A640480A9D2C7 /* libPods-JazzHandsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 257ED81C3B6E3C3F79ED10F8A7D2F253 /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; + 2720E6408315E49E8786711EC466E4C2 /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; + 274F1CCE890DC33157C4AAD25A8AB1DE /* SPTSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSpec.h; path = Specta/Specta/SPTSpec.h; sourceTree = ""; }; + 278EE1149D48BC0B32BBAEB2F1AE5808 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; + 289497E8FCF89355E58891D37704ADFE /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; + 29202C5DB7317367CB036B121CB16B61 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; + 2A58A298CF4AD83AA2773054430AB2E8 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; + 31281F6C0B269B0BE12175DDF3F5DA09 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 323E02081128FFCC181E9F174D7F51A3 /* IFTTTTransform3DAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTransform3DAnimation.h; sourceTree = ""; }; + 32573047F16F3AF6CE441A8EE164D965 /* JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JazzHands.xcconfig; sourceTree = ""; }; + 32C0FE34D74DFFDEC14B670E01760321 /* EXPFloatTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPFloatTuple.m; path = Expecta/EXPFloatTuple.m; sourceTree = ""; }; + 34E555A119006DE80A85C17FF8CD9B36 /* ExpectaObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaObject.m; path = Expecta/ExpectaObject.m; sourceTree = ""; }; + 3592089E6B6764FA5085BF622FB4A28F /* IFTTTLayerStrokeEndAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTLayerStrokeEndAnimation.m; sourceTree = ""; }; + 38DE256F90D274203BB0B7586C536768 /* IFTTTFrameAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFrameAnimation.h; sourceTree = ""; }; + 39110B9DC3F194F2D3AF191CEBC362B2 /* IFTTTAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimator.m; sourceTree = ""; }; + 397C98202446A9506225D8D4F8AC4B30 /* EXPMatchers+contain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+contain.m"; path = "Expecta/Matchers/EXPMatchers+contain.m"; sourceTree = ""; }; + 39A4F92883A1EA9AC462D68B89A0A0B6 /* EXPMatchers+beGreaterThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThan.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.h"; sourceTree = ""; }; + 3B3F4C3503E6C633E6A1F769D5753111 /* EXPMatchers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatchers.h; path = Expecta/Matchers/EXPMatchers.h; sourceTree = ""; }; + 3B6C643861AD186FA24948BC26BE887A /* SpectaDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaDSL.h; path = Specta/Specta/SpectaDSL.h; sourceTree = ""; }; + 3B939C3A1A5AEC8601A9FCD1B21FD1E6 /* EXPMatchers+postNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+postNotification.h"; path = "Expecta/Matchers/EXPMatchers+postNotification.h"; sourceTree = ""; }; + 3BB465E74FE1C7245764FCE04F870B75 /* IFTTTShapeLayerAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTShapeLayerAnimation.h; sourceTree = ""; }; + 3C0A990A5AF02098FEE33D1B3E3513A2 /* UIView+IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIView+IFTTTJazzHands.h"; sourceTree = ""; }; + 3C4549C6F4E41D57F1009573AA927B58 /* IFTTTHideAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTHideAnimation.m; sourceTree = ""; }; + 3D2185136441FB8B281669BAA9B2C283 /* EXPMatchers+beTruthy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beTruthy.m"; path = "Expecta/Matchers/EXPMatchers+beTruthy.m"; sourceTree = ""; }; + 3D837292CE0FF8206C520BDB4FFFCBC2 /* EXPMatchers+beInTheRangeOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInTheRangeOf.m"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.m"; sourceTree = ""; }; + 3DC20D4CDAF1556C37EC20ECB983390E /* UIView+IFTTTJazzHands.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIView+IFTTTJazzHands.m"; sourceTree = ""; }; + 3E3343108889DCD7589DADD5B29717F8 /* IFTTTLayerStrokeStartAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTLayerStrokeStartAnimation.h; sourceTree = ""; }; + 41532C4D056DF42E03DD1E11E7D6F03F /* EXPMatchers+beLessThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m"; sourceTree = ""; }; + 42C045A2DB0085AAE8AADF34D548B912 /* IFTTTAnimatedPagingScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedPagingScrollViewController.m; sourceTree = ""; }; + 4357BBD450F02ECA63791BF400D5BAAC /* EXPDoubleTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPDoubleTuple.m; path = Expecta/EXPDoubleTuple.m; sourceTree = ""; }; + 439D155986590405100077D4516A10CC /* SPTSharedExampleGroups.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSharedExampleGroups.h; path = Specta/Specta/SPTSharedExampleGroups.h; sourceTree = ""; }; + 43B371DB8D219320A8943C74CCD7B96F /* Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Expecta.h; path = Expecta/Expecta.h; sourceTree = ""; }; + 44750F273358F691D566C33252E3F829 /* SpectaDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaDSL.m; path = Specta/Specta/SpectaDSL.m; sourceTree = ""; }; + 4478FE1575F6249DEF44A32F65BDEB3B /* SPTSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSpec.m; path = Specta/Specta/SPTSpec.m; sourceTree = ""; }; + 448B92D42D7AFF18F07688B52592AF8D /* Pods-JazzHandsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.release.xcconfig"; sourceTree = ""; }; + 45D522101B40326050F2ED7DBD055DBD /* EXPExpect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPExpect.h; path = Expecta/EXPExpect.h; sourceTree = ""; }; + 476A0956DB554DFB1CD82C783C1A0CAC /* SPTExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExample.m; path = Specta/Specta/SPTExample.m; sourceTree = ""; }; + 4A2B757FB2C593E3629B56B5082E61AB /* Pods-JazzHandsTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-dummy.m"; sourceTree = ""; }; + 4B0A3E90917A999E9FF906B583592407 /* IFTTTShapeLayerAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTShapeLayerAnimation.m; sourceTree = ""; }; + 4B3C92EC4E399D3543EAEFAEFCFBC586 /* EXPMatchers+beIdenticalTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beIdenticalTo.m"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.m"; sourceTree = ""; }; + 4B88DECB64E8369145939917AFC2F03C /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; + 517C24ABB2AE00DB4DA3D1F176420A34 /* EXPExpect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPExpect.m; path = Expecta/EXPExpect.m; sourceTree = ""; }; + 52DBFEBD676306CCA363511268DF33AB /* IFTTTAnimatedPagingScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedPagingScrollViewController.h; sourceTree = ""; }; + 53413A54470EEECBCB3ED2076BEFC917 /* EXPMatchers+conformTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+conformTo.h"; path = "Expecta/Matchers/EXPMatchers+conformTo.h"; sourceTree = ""; }; + 535956B6230D0D5726B94544B1586B3D /* EXPDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDefines.h; path = Expecta/EXPDefines.h; sourceTree = ""; }; + 538BA63B8796CDB8A7128F9BF180D6C0 /* libExpecta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libExpecta.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 549D15680C5B8D9B8766F194283D1E25 /* IFTTTBackgroundColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTBackgroundColorAnimation.h; sourceTree = ""; }; + 5572C111EDD5C94CDA45FE8403A8CA28 /* EXPMatchers+beCloseTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beCloseTo.m"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.m"; sourceTree = ""; }; + 58EF3D9A5F7D98D29EE9AC1366E1CCE1 /* Pods-JazzHandsDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsDemo-acknowledgements.markdown"; sourceTree = ""; }; + 5950E9BE99B8F429C8AFF7AE7662D96C /* EXPMatchers+beKindOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beKindOf.h"; path = "Expecta/Matchers/EXPMatchers+beKindOf.h"; sourceTree = ""; }; + 5AD978FEC8107CB5414FD65686099780 /* SPTExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExample.h; path = Specta/Specta/SPTExample.h; sourceTree = ""; }; + 5B1A4C4557882E3C8C642070A82864E3 /* EXPMatchers+beFalsy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beFalsy.h"; path = "Expecta/Matchers/EXPMatchers+beFalsy.h"; sourceTree = ""; }; + 5B76CC4A0E6498BB4080EDDF0A5F306F /* Pods-JazzHandsTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsTests-resources.sh"; sourceTree = ""; }; + 5CFC057C52EE2A6DE239458D1FBBED9A /* EXPMatchers+raiseWithReason.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raiseWithReason.h"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.h"; sourceTree = ""; }; + 5CFE8EA711BBBE7BE7550A9BD56C61EF /* IFTTTFilmstrip.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFilmstrip.h; sourceTree = ""; }; + 5E500E91FCACA2C1502EDBF20C54BA5D /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; + 637C17320BBC47A0AA58D582277A3CDC /* Masonry.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.xcconfig; sourceTree = ""; }; + 65904F2DBC97DE38C57A681453A7317F /* EXPMatchers+raiseWithReason.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raiseWithReason.m"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.m"; sourceTree = ""; }; + 673218E143FB3CA5F3E7B18DE547DA53 /* NSObject+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+Expecta.h"; path = "Expecta/NSObject+Expecta.h"; sourceTree = ""; }; + 6878254997CF10937AE0DB2E6E8C25B0 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; + 6A578EEAA8DE8C1AECC87A01EC718ACC /* EXPMatchers+contain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+contain.h"; path = "Expecta/Matchers/EXPMatchers+contain.h"; sourceTree = ""; }; + 6AD2AFDB66028B2AA2C77708F13E327B /* JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "JazzHands-Private.xcconfig"; sourceTree = ""; }; + 6B5985B109CE477C63944DCFC5A70E1E /* Pods-JazzHandsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.release.xcconfig"; sourceTree = ""; }; + 6C3656098A8F479FEFE47FE78F5B7D82 /* IFTTTCornerRadiusAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTCornerRadiusAnimation.h; sourceTree = ""; }; + 6D1819DD8C0F51AEA8249E2E6AF37392 /* XCTest+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTest+Private.h"; path = "Specta/Specta/XCTest+Private.h"; sourceTree = ""; }; + 6DE4E4D462BD16B6741FE39E5338A81A /* EXPMatchers+beLessThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThan.m"; path = "Expecta/Matchers/EXPMatchers+beLessThan.m"; sourceTree = ""; }; + 7041B392166417648DE97965F00951E4 /* EXPMatchers+beGreaterThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m"; sourceTree = ""; }; + 71731D6883D7514628863A0411588178 /* Expecta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Expecta-Private.xcconfig"; sourceTree = ""; }; + 72132E294331DD59F635FC1878F7D130 /* Specta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Specta-Private.xcconfig"; sourceTree = ""; }; + 723C788EE4CC5AF077956636C5E94A1D /* IFTTTAlphaAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAlphaAnimation.m; sourceTree = ""; }; + 73387320CCCE948631932AC117A1FD9A /* IFTTTScrollViewPageConstraintAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScrollViewPageConstraintAnimation.h; sourceTree = ""; }; + 739C414FEAE8C6E579E2A6672CC2BEFA /* XCTestCase+Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTestCase+Specta.h"; path = "Specta/Specta/XCTestCase+Specta.h"; sourceTree = ""; }; + 778F28937AAD3E90E1DC15850860F449 /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; + 787E08A5EA62167C40AD079DD184498E /* libJazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJazzHands.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 7B49D326FF48234ED67AB4B894753898 /* IFTTTConstraintConstantAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintConstantAnimation.m; sourceTree = ""; }; + 7D1466913725877B5C26F9199BC08EB8 /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; + 8025E16DAF3C5B476B22E46B320A30E0 /* Pods-JazzHandsTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsTests-acknowledgements.plist"; sourceTree = ""; }; + 80DDC36D925729A51399070592A21A90 /* SPTTestSuite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTTestSuite.h; path = Specta/Specta/SPTTestSuite.h; sourceTree = ""; }; + 8217845E2A5F620A82A4BAA4EEC951AC /* Specta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Specta.xcconfig; sourceTree = ""; }; + 8556257F4CBFB21F7718750EEEE73718 /* IFTTTPathPositionAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTPathPositionAnimation.m; sourceTree = ""; }; + 85E4DF546162ED78B0EB0D14D18563B9 /* IFTTTInterpolatable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTInterpolatable.m; sourceTree = ""; }; + 888022AEFC3B3174B552185E61CE5584 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; + 8907D2FDB9BE66F533036B7139FF6D0A /* EXPMatchers+endWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+endWith.m"; path = "Expecta/Matchers/EXPMatchers+endWith.m"; sourceTree = ""; }; + 897399199FD560D3425F52D51E1B906B /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; + 8A18D69CC44E60F85B7C25949947CC9E /* IFTTTFilmstrip.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFilmstrip.m; sourceTree = ""; }; + 8D3EF0ABD850EDA264F0BAFB25B312BE /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; + 8FD462DB932E0CF9E404F08EC68BEAC6 /* EXPMatchers+beKindOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beKindOf.m"; path = "Expecta/Matchers/EXPMatchers+beKindOf.m"; sourceTree = ""; }; + 902C38E1274810E40D30F3EDE7583A65 /* EXPMatchers+match.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+match.h"; path = "Expecta/Matchers/EXPMatchers+match.h"; sourceTree = ""; }; + 9230328A3DFC41F6F4175A7C15476F72 /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; + 92457E91286B083A7266E82F73AA4900 /* EXPMatchers+raise.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raise.m"; path = "Expecta/Matchers/EXPMatchers+raise.m"; sourceTree = ""; }; + 9339D9187D0D833953BFF83FBDC6318B /* SPTTestSuite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTTestSuite.m; path = Specta/Specta/SPTTestSuite.m; sourceTree = ""; }; + 93E3DBD91129F3B9C3942FF803ED5FAB /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; + 97E017CFAF31AB762BBCA57D6FEA389E /* SPTCompiledExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCompiledExample.m; path = Specta/Specta/SPTCompiledExample.m; sourceTree = ""; }; + 98B9933347D6344DFC808F751C019F14 /* EXPMatchers+beLessThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h"; sourceTree = ""; }; + 9AA514492A2A071B4C402B771323C81A /* IFTTTAnimatedScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedScrollViewController.h; sourceTree = ""; }; + 9C0632B50DE110EFC8A10AD53DE5FE07 /* SPTGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTGlobalBeforeAfterEach.h; path = Specta/Specta/SPTGlobalBeforeAfterEach.h; sourceTree = ""; }; + 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 9CAC291410901C2348BDA4DCD911C612 /* EXPMatchers+beIdenticalTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beIdenticalTo.h"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.h"; sourceTree = ""; }; + 9EE3D98BAE31E2A1D84C0CBC741E2D7B /* SPTCompiledExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCompiledExample.h; path = Specta/Specta/SPTCompiledExample.h; sourceTree = ""; }; + 9F823D670B378E3F3B1C6DCFC814634F /* NSValue+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSValue+Expecta.h"; path = "Expecta/NSValue+Expecta.h"; sourceTree = ""; }; + A06D2ED301A23E55AABE964BBF96609B /* Masonry-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Masonry-Private.xcconfig"; sourceTree = ""; }; + A0FA1B54BD155598E90FFB0738A5DE2B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + A1665585902A947D974113EBCFBB2CB3 /* IFTTTTranslationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTranslationAnimation.h; sourceTree = ""; }; + A353918B7D857FB343CEE074EBBFA5C6 /* EXPMatchers+beNil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beNil.h"; path = "Expecta/Matchers/EXPMatchers+beNil.h"; sourceTree = ""; }; + A490377D2070BCF7CD8A95A8DFC3A55F /* EXPBlockDefinedMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPBlockDefinedMatcher.h; path = Expecta/EXPBlockDefinedMatcher.h; sourceTree = ""; }; + A4EE0C17FCFECDCE7A3D5ABCEAA213EB /* Pods-JazzHandsDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsDemo-acknowledgements.plist"; sourceTree = ""; }; + A52053B89834CE2D508A036A58030D55 /* EXPMatchers+beCloseTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beCloseTo.h"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.h"; sourceTree = ""; }; + A52E2914098688BDBAFC3E1D1FA83DD6 /* IFTTTEasingFunction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTEasingFunction.m; sourceTree = ""; }; + A58D6CD377F35F4EB94DEE4B695E07B8 /* EXPMatchers+beSupersetOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSupersetOf.h"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.h"; sourceTree = ""; }; + A5DBD67B0AC13F3B51DFC6E8EFD448EF /* IFTTTAnimatedScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedScrollViewController.m; sourceTree = ""; }; + A79B2D894121CD0007654292154B3A11 /* IFTTTLayerStrokeEndAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTLayerStrokeEndAnimation.h; sourceTree = ""; }; + A836D92B58014E3BFD8B916EC7FAE440 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; + A838670FBCED2F3CA582C88DFE47F8E5 /* IFTTTAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimation.h; sourceTree = ""; }; + A8BAF57831E9734DE9A2B8E9FCCC7B91 /* EXPMatchers+equal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+equal.h"; path = "Expecta/Matchers/EXPMatchers+equal.h"; sourceTree = ""; }; + A8E457F5C5FA7579DDD858E403184772 /* EXPMatcherHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPMatcherHelpers.m; path = Expecta/Matchers/EXPMatcherHelpers.m; sourceTree = ""; }; + AA7DE2EA41360E6C7CBB1291F86ED6CE /* IFTTTConstraintMultiplierAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintMultiplierAnimation.m; sourceTree = ""; }; + ABE30A66AB21BF5539E7F07B66BE0E9A /* SPTSharedExampleGroups.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSharedExampleGroups.m; path = Specta/Specta/SPTSharedExampleGroups.m; sourceTree = ""; }; + AD824E9743EDC05E8FCD7BD1891E0E5C /* EXPMatchers+beTruthy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beTruthy.h"; path = "Expecta/Matchers/EXPMatchers+beTruthy.h"; sourceTree = ""; }; + ADACCBAD4359D5275B5FF2F361C1713B /* JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JazzHands-prefix.pch"; sourceTree = ""; }; + AE9D95FF7D3FAB387818FF008289FA3E /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B23712B0286454B97F688EA3E00CE475 /* Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Specta.h; path = Specta/Specta/Specta.h; sourceTree = ""; }; + B354A6E69AEC57DFD852CDF5644DD360 /* IFTTTScrollViewPageConstraintAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScrollViewPageConstraintAnimation.m; sourceTree = ""; }; + B7F76A8F2F270A862F8F388727EA1419 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; + B952CDCCCC2CD9325C1B4CC3A6D4AD39 /* EXPMatchers+raise.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raise.h"; path = "Expecta/Matchers/EXPMatchers+raise.h"; sourceTree = ""; }; + B9A874C5A5C9210FB9EBF8AE74F5FDF0 /* SPTExcludeGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExcludeGlobalBeforeAfterEach.h; path = Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h; sourceTree = ""; }; + B9E4C402E4D6835AAFE17C57E63ED316 /* IFTTTTextColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTextColorAnimation.h; sourceTree = ""; }; + BB24B5BEFD989D103654FFA4FD5DD9FB /* EXPMatchers+endWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+endWith.h"; path = "Expecta/Matchers/EXPMatchers+endWith.h"; sourceTree = ""; }; + BC3FA964763C1DDB0BA9560E061CA98E /* IFTTTAlphaAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAlphaAnimation.h; sourceTree = ""; }; + BE6099B6062F0708A5CBFB33BD012357 /* EXPMatchers+conformTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+conformTo.m"; path = "Expecta/Matchers/EXPMatchers+conformTo.m"; sourceTree = ""; }; + BE829408D0E583327D8A1549D1B583DF /* Pods-JazzHandsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.debug.xcconfig"; sourceTree = ""; }; + C35148BA2BD2F5C13707DE9ADD1E48D1 /* SPTExampleGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExampleGroup.m; path = Specta/Specta/SPTExampleGroup.m; sourceTree = ""; }; + C3D8726E373349DF5E74BC65B64E3E2E /* JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JazzHands-dummy.m"; sourceTree = ""; }; + C61B45BA4D81CB42405344BE39257114 /* SPTCallSite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCallSite.h; path = Specta/Specta/SPTCallSite.h; sourceTree = ""; }; + C64410716204AC18CCE56D712F87081F /* Expecta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Expecta.xcconfig; sourceTree = ""; }; + C7A249FEE57C22346B05B7994BFF3FD0 /* NSValue+Expecta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+Expecta.m"; path = "Expecta/NSValue+Expecta.m"; sourceTree = ""; }; + C7F66A045625D1435096068F130AC885 /* IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTJazzHands.h; sourceTree = ""; }; + C80F2D797EA1D78FD7B34AC69E3FF2A8 /* EXPMatchers+beInstanceOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInstanceOf.h"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.h"; sourceTree = ""; }; + C88113A79685B4EFEE7BAD12896829F7 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + C995AF079544567FFAD102FF82D3E710 /* IFTTTAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimation.m; sourceTree = ""; }; + CA36B941D3DA431EBEDF1850FAB1EDBD /* EXPMatchers+haveCountOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+haveCountOf.m"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.m"; sourceTree = ""; }; + CB5E76B708EA95481F7C14A1D52784C9 /* IFTTTFrameAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFrameAnimation.m; sourceTree = ""; }; + CC5B31C3F33B66534ACA688918C48901 /* IFTTTAnimatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatable.h; sourceTree = ""; }; + CE449897A111A7FC006B8660C5B7446B /* EXPMatchers+beGreaterThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h"; sourceTree = ""; }; + CF987CC5EBA49241E2450AD835C9336E /* EXPUnsupportedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPUnsupportedObject.h; path = Expecta/EXPUnsupportedObject.h; sourceTree = ""; }; + CF99FE6F64B865F4E4AEA41B5E68DB78 /* SpectaTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaTypes.h; path = Specta/Specta/SpectaTypes.h; sourceTree = ""; }; + D0CB6C8B7BEF7D7F4654EFCEEA4BE035 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; + D340F50594D2F4E9059351E0F2BBCD0F /* IFTTTTransform3DAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTransform3DAnimation.m; sourceTree = ""; }; + D5E2308F20C4541E98548A6770D192C1 /* EXPMatchers+beNil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beNil.m"; path = "Expecta/Matchers/EXPMatchers+beNil.m"; sourceTree = ""; }; + D707175482FA1D3E3C79BF4841141152 /* EXPMatcherHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcherHelpers.h; path = Expecta/Matchers/EXPMatcherHelpers.h; sourceTree = ""; }; + D7123431A0DA886D7C3DF29B8AB90028 /* SpectaUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaUtility.m; path = Specta/Specta/SpectaUtility.m; sourceTree = ""; }; + DBD703ECB28453EBDE7129AD437007B3 /* IFTTTViewAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTViewAnimation.m; sourceTree = ""; }; + DC4A257E8F59403E0EE36B2AE0B0CAF7 /* EXPMatchers+respondTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+respondTo.h"; path = "Expecta/Matchers/EXPMatchers+respondTo.h"; sourceTree = ""; }; + DCA176491E5A220CF0E1AA4A9664EBD4 /* Specta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Specta-prefix.pch"; sourceTree = ""; }; + DCDA3128ABB9382CBEF4D668F241EB6B /* EXPBlockDefinedMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPBlockDefinedMatcher.m; path = Expecta/EXPBlockDefinedMatcher.m; sourceTree = ""; }; + DCF4429A4C1FBFBE14E06D24BCCFBFE9 /* IFTTTHideAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTHideAnimation.h; sourceTree = ""; }; + DE68907A3D1DDA1389A4B67B7C23F4C9 /* EXPDoubleTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDoubleTuple.h; path = Expecta/EXPDoubleTuple.h; sourceTree = ""; }; + DEB97F465B013C170D7E4672EF9878DE /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; + E16304397FEF227A23092DA638C82446 /* EXPMatchers+beInTheRangeOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInTheRangeOf.h"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.h"; sourceTree = ""; }; + E53E4E735B4EA57AB443C0C999D72848 /* IFTTTLayerFillColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTLayerFillColorAnimation.m; sourceTree = ""; }; + E611E002EE8D03CAD27DB8D950A29491 /* EXPMatchers+beLessThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThan.h"; path = "Expecta/Matchers/EXPMatchers+beLessThan.h"; sourceTree = ""; }; + E84B8AE44CAC9FA37E8282ABACBA57A9 /* SPTExampleGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExampleGroup.h; path = Specta/Specta/SPTExampleGroup.h; sourceTree = ""; }; + E99D024E5F784133541724441FC2F638 /* IFTTTConstraintConstantAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintConstantAnimation.h; sourceTree = ""; }; + ED007B475F422DDCECC68DB43B9CE57C /* EXPMatchers+beGreaterThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThan.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.m"; sourceTree = ""; }; + EECB2FA29D0F5886FC7EDFCE78E4461B /* IFTTTRotationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTRotationAnimation.h; sourceTree = ""; }; + F1BE4364C38BB8D3997A79D165523560 /* IFTTTScaleAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScaleAnimation.m; sourceTree = ""; }; + F2010A4D8DD54450B7DC01949F9C8035 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; + F29603C53D6E4E1A7EA6736D3C6374BC /* IFTTTLayerFillColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTLayerFillColorAnimation.h; sourceTree = ""; }; + F38BD6B2EA8E3D607D37364462D778DF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + F3B757C2350B998EC33E873A0632FB8F /* IFTTTCornerRadiusAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTCornerRadiusAnimation.m; sourceTree = ""; }; + F43B145F6F49BD25867EA23C02E1BA06 /* IFTTTAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimator.h; sourceTree = ""; }; + F4C866ECB58DAA9CFCACAD26B740969A /* EXPMatchers+beInstanceOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInstanceOf.m"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.m"; sourceTree = ""; }; + F58215B1B9D360582DFE8F7055FFFA3A /* IFTTTTextColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTextColorAnimation.m; sourceTree = ""; }; + F5AA6466E5CFC9EC77C7C69961AF0BF9 /* Pods-JazzHandsDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-dummy.m"; sourceTree = ""; }; + F5D6688928836B150DE5F25BD4652ADF /* libSpecta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSpecta.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F60BF142E8337E30681505961DD68D45 /* Pods-JazzHandsDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsDemo-resources.sh"; sourceTree = ""; }; + F7171AA6E08E5CC4941B507D4D11BDC9 /* IFTTTViewAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTViewAnimation.h; sourceTree = ""; }; + F778B621E07B00779E8C0559EEF48295 /* EXPMatchers+equal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+equal.m"; path = "Expecta/Matchers/EXPMatchers+equal.m"; sourceTree = ""; }; + F84AEE74F32BC419F27BE093F760E7C5 /* Specta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Specta-dummy.m"; sourceTree = ""; }; + FC098F9EFC76345CDEFDCE8DBFA34AB0 /* SPTCallSite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCallSite.m; path = Specta/Specta/SPTCallSite.m; sourceTree = ""; }; + FC10E684DD68F44558F62A6931E6390A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + FE38845655E796715A8F91C234BFBD1D /* EXPFloatTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPFloatTuple.h; path = Expecta/EXPFloatTuple.h; sourceTree = ""; }; + FE532F7977A7E08C1F828AD5FC3C85D7 /* Expecta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Expecta-dummy.m"; sourceTree = ""; }; + FE84A12B996695518311DA3C494CB13F /* IFTTTScaleAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScaleAnimation.h; sourceTree = ""; }; + FF95AAB9F514AD00B7885D3EA596C4C5 /* IFTTTTranslationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTranslationAnimation.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0385495BBD0FE022AF123047 /* Frameworks */ = { + 6911CF59E03BE9CF1CFCDE50716F425F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 176F0B0CFABDE496FE2CB75C /* Foundation.framework in Frameworks */, + EB0691BC61ACBBA8C4C1AFF4394B3E4D /* Foundation.framework in Frameworks */, + F96BCFE42F5736362B9BD0CA8444C570 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 0633515D73E73B83E246A829 /* Frameworks */ = { + 7480D7B2BED33A6AFA145F888D84AEC0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 38F0699F2E01878CD5799170 /* CoreGraphics.framework in Frameworks */, - 886DCA8421D181A0BDC8F847 /* Foundation.framework in Frameworks */, - B386064B6191149915F43479 /* QuartzCore.framework in Frameworks */, - E6F62634EF008AB1BBDA24B8 /* UIKit.framework in Frameworks */, + 6783B7E9D0CBDBD2DAD9E49457A0DA82 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 114C539DA7F000F313C7B84B /* Frameworks */ = { + 8A24AF3B78D5D7A10B7EB02783E6A7EC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 64877141CC91721A160D01BD /* CoreGraphics.framework in Frameworks */, - 995D6A6781ACC97511B06C6F /* Foundation.framework in Frameworks */, - DACBCA1A159DDA9A9FB9CE9F /* QuartzCore.framework in Frameworks */, - 85A67B087289D31EE36081AE /* UIKit.framework in Frameworks */, + 4FC451F18772F8E0A28ACD407E6D0D2E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2BAE57C503748206CFBF6369 /* Frameworks */ = { + A69CB06F0077C8B1F578DB7E3F577653 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B725BA404E5AE55ACA31A002 /* Foundation.framework in Frameworks */, - DB67A66BB47D5F948E1BFF3A /* XCTest.framework in Frameworks */, + EFCB34D3D06D9016B6EDE986F1345201 /* Foundation.framework in Frameworks */, + 75BA922C19DCA9957871881BD29374D4 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B9A7A1F8B88584088284E23F /* Frameworks */ = { + B8DE970F49B8CD3172CF696898746077 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 80CD7BE60090B1A2B9A12D12 /* Foundation.framework in Frameworks */, + 38A2CF2F324AA123FA46ABF36B0D6F9B /* CoreGraphics.framework in Frameworks */, + FB314B0699ADFA8DAFBC702D12032BC2 /* Foundation.framework in Frameworks */, + E4A8E8B4B0CE4D5E2A8C93F0ABE5FC01 /* QuartzCore.framework in Frameworks */, + 3BAFCE42B379E5702438EA9AB83AE2F5 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4FE4B073AB9523746B384A0 /* Frameworks */ = { + D9D3B3DADDFDC1D199759B6D935EDD88 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 52F55117A9EE0609C89C3DD1 /* Foundation.framework in Frameworks */, - 0292CDCF88E0AE040AE457AD /* XCTest.framework in Frameworks */, + CB27BBBDBC8B293DDDA7644DC0C2CD81 /* Foundation.framework in Frameworks */, + 858C5F4DBE9E095E5371367874C568DC /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 073DE5EAAADA64A2E4078AE7 /* Support Files */ = { + 067EB64301F0A54597901FF5B28879C2 /* JazzHands */ = { isa = PBXGroup; children = ( - 74F71FE57ED77EC851C5B74E /* Pods-JazzHandsTests-Specta.xcconfig */, - 9EB30BAB5EC76B74CE45FB9E /* Pods-JazzHandsTests-Specta-Private.xcconfig */, - 6AF6E47F5FB8196B619F2194 /* Pods-JazzHandsTests-Specta-dummy.m */, - 2D39B8556F16E1CC786632B2 /* Pods-JazzHandsTests-Specta-prefix.pch */, + BC3FA964763C1DDB0BA9560E061CA98E /* IFTTTAlphaAnimation.h */, + 723C788EE4CC5AF077956636C5E94A1D /* IFTTTAlphaAnimation.m */, + CC5B31C3F33B66534ACA688918C48901 /* IFTTTAnimatable.h */, + 52DBFEBD676306CCA363511268DF33AB /* IFTTTAnimatedPagingScrollViewController.h */, + 42C045A2DB0085AAE8AADF34D548B912 /* IFTTTAnimatedPagingScrollViewController.m */, + 9AA514492A2A071B4C402B771323C81A /* IFTTTAnimatedScrollViewController.h */, + A5DBD67B0AC13F3B51DFC6E8EFD448EF /* IFTTTAnimatedScrollViewController.m */, + A838670FBCED2F3CA582C88DFE47F8E5 /* IFTTTAnimation.h */, + C995AF079544567FFAD102FF82D3E710 /* IFTTTAnimation.m */, + F43B145F6F49BD25867EA23C02E1BA06 /* IFTTTAnimator.h */, + 39110B9DC3F194F2D3AF191CEBC362B2 /* IFTTTAnimator.m */, + 549D15680C5B8D9B8766F194283D1E25 /* IFTTTBackgroundColorAnimation.h */, + 0E88E59B6EDB6935BE7BC4E62EEBDEFF /* IFTTTBackgroundColorAnimation.m */, + E99D024E5F784133541724441FC2F638 /* IFTTTConstraintConstantAnimation.h */, + 7B49D326FF48234ED67AB4B894753898 /* IFTTTConstraintConstantAnimation.m */, + 0D71069641BD5F781B575635DACF4EB9 /* IFTTTConstraintMultiplierAnimation.h */, + AA7DE2EA41360E6C7CBB1291F86ED6CE /* IFTTTConstraintMultiplierAnimation.m */, + 6C3656098A8F479FEFE47FE78F5B7D82 /* IFTTTCornerRadiusAnimation.h */, + F3B757C2350B998EC33E873A0632FB8F /* IFTTTCornerRadiusAnimation.m */, + 10E241FC9FA86B8755AC1637E56F48B3 /* IFTTTEasingFunction.h */, + A52E2914098688BDBAFC3E1D1FA83DD6 /* IFTTTEasingFunction.m */, + 5CFE8EA711BBBE7BE7550A9BD56C61EF /* IFTTTFilmstrip.h */, + 8A18D69CC44E60F85B7C25949947CC9E /* IFTTTFilmstrip.m */, + 38DE256F90D274203BB0B7586C536768 /* IFTTTFrameAnimation.h */, + CB5E76B708EA95481F7C14A1D52784C9 /* IFTTTFrameAnimation.m */, + DCF4429A4C1FBFBE14E06D24BCCFBFE9 /* IFTTTHideAnimation.h */, + 3C4549C6F4E41D57F1009573AA927B58 /* IFTTTHideAnimation.m */, + 248617CA3C52A0619F75C4AAD0EB233C /* IFTTTInterpolatable.h */, + 85E4DF546162ED78B0EB0D14D18563B9 /* IFTTTInterpolatable.m */, + C7F66A045625D1435096068F130AC885 /* IFTTTJazzHands.h */, + F29603C53D6E4E1A7EA6736D3C6374BC /* IFTTTLayerFillColorAnimation.h */, + E53E4E735B4EA57AB443C0C999D72848 /* IFTTTLayerFillColorAnimation.m */, + A79B2D894121CD0007654292154B3A11 /* IFTTTLayerStrokeEndAnimation.h */, + 3592089E6B6764FA5085BF622FB4A28F /* IFTTTLayerStrokeEndAnimation.m */, + 3E3343108889DCD7589DADD5B29717F8 /* IFTTTLayerStrokeStartAnimation.h */, + 017FC6D220FAA413BD7D191746186918 /* IFTTTLayerStrokeStartAnimation.m */, + 202BA45B32EC397EB18C60369FE3B281 /* IFTTTPathPositionAnimation.h */, + 8556257F4CBFB21F7718750EEEE73718 /* IFTTTPathPositionAnimation.m */, + EECB2FA29D0F5886FC7EDFCE78E4461B /* IFTTTRotationAnimation.h */, + 0813D7CCE93DF9FC7208102A816A5DBE /* IFTTTRotationAnimation.m */, + FE84A12B996695518311DA3C494CB13F /* IFTTTScaleAnimation.h */, + F1BE4364C38BB8D3997A79D165523560 /* IFTTTScaleAnimation.m */, + 73387320CCCE948631932AC117A1FD9A /* IFTTTScrollViewPageConstraintAnimation.h */, + B354A6E69AEC57DFD852CDF5644DD360 /* IFTTTScrollViewPageConstraintAnimation.m */, + 3BB465E74FE1C7245764FCE04F870B75 /* IFTTTShapeLayerAnimation.h */, + 4B0A3E90917A999E9FF906B583592407 /* IFTTTShapeLayerAnimation.m */, + B9E4C402E4D6835AAFE17C57E63ED316 /* IFTTTTextColorAnimation.h */, + F58215B1B9D360582DFE8F7055FFFA3A /* IFTTTTextColorAnimation.m */, + 323E02081128FFCC181E9F174D7F51A3 /* IFTTTTransform3DAnimation.h */, + D340F50594D2F4E9059351E0F2BBCD0F /* IFTTTTransform3DAnimation.m */, + A1665585902A947D974113EBCFBB2CB3 /* IFTTTTranslationAnimation.h */, + FF95AAB9F514AD00B7885D3EA596C4C5 /* IFTTTTranslationAnimation.m */, + F7171AA6E08E5CC4941B507D4D11BDC9 /* IFTTTViewAnimation.h */, + DBD703ECB28453EBDE7129AD437007B3 /* IFTTTViewAnimation.m */, + 3C0A990A5AF02098FEE33D1B3E3513A2 /* UIView+IFTTTJazzHands.h */, + 3DC20D4CDAF1556C37EC20ECB983390E /* UIView+IFTTTJazzHands.m */, ); - name = "Support Files"; - path = "../Target Support Files/Pods-JazzHandsTests-Specta"; + path = JazzHands; sourceTree = ""; }; - 3DF78207B02F6808EC5DC3A2 /* Pods-JazzHandsTests */ = { + 0720760E6FAA87218C034E98CCD3509B /* Development Pods */ = { isa = PBXGroup; children = ( - 2A9F0CDB69C4A5232F0AD6B7 /* Pods-JazzHandsTests-acknowledgements.markdown */, - 40C00AF8AB4E778B0DC6A1AA /* Pods-JazzHandsTests-acknowledgements.plist */, - 9FE004A8C521BD9ACAAA87F7 /* Pods-JazzHandsTests-dummy.m */, - E39426B0F2CD4F298CB47CEF /* Pods-JazzHandsTests-environment.h */, - FA1F70434A46B8430904BA8A /* Pods-JazzHandsTests-resources.sh */, - 27D3203A4E720E7B7D3EE022 /* Pods-JazzHandsTests.debug.xcconfig */, - 20514729334487DACCC75BEB /* Pods-JazzHandsTests.release.xcconfig */, + F939568682B2AB9EFD9EC2957D80A86D /* JazzHands */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 121676E7055B87530EEB8983B917F9B6 /* Specta */ = { + isa = PBXGroup; + children = ( + C61B45BA4D81CB42405344BE39257114 /* SPTCallSite.h */, + FC098F9EFC76345CDEFDCE8DBFA34AB0 /* SPTCallSite.m */, + 9EE3D98BAE31E2A1D84C0CBC741E2D7B /* SPTCompiledExample.h */, + 97E017CFAF31AB762BBCA57D6FEA389E /* SPTCompiledExample.m */, + 5AD978FEC8107CB5414FD65686099780 /* SPTExample.h */, + 476A0956DB554DFB1CD82C783C1A0CAC /* SPTExample.m */, + E84B8AE44CAC9FA37E8282ABACBA57A9 /* SPTExampleGroup.h */, + C35148BA2BD2F5C13707DE9ADD1E48D1 /* SPTExampleGroup.m */, + B9A874C5A5C9210FB9EBF8AE74F5FDF0 /* SPTExcludeGlobalBeforeAfterEach.h */, + 9C0632B50DE110EFC8A10AD53DE5FE07 /* SPTGlobalBeforeAfterEach.h */, + 439D155986590405100077D4516A10CC /* SPTSharedExampleGroups.h */, + ABE30A66AB21BF5539E7F07B66BE0E9A /* SPTSharedExampleGroups.m */, + 274F1CCE890DC33157C4AAD25A8AB1DE /* SPTSpec.h */, + 4478FE1575F6249DEF44A32F65BDEB3B /* SPTSpec.m */, + 80DDC36D925729A51399070592A21A90 /* SPTTestSuite.h */, + 9339D9187D0D833953BFF83FBDC6318B /* SPTTestSuite.m */, + B23712B0286454B97F688EA3E00CE475 /* Specta.h */, + 3B6C643861AD186FA24948BC26BE887A /* SpectaDSL.h */, + 44750F273358F691D566C33252E3F829 /* SpectaDSL.m */, + CF99FE6F64B865F4E4AEA41B5E68DB78 /* SpectaTypes.h */, + 229F3748A703778F7AF1CD314999B9DA /* SpectaUtility.h */, + D7123431A0DA886D7C3DF29B8AB90028 /* SpectaUtility.m */, + 6D1819DD8C0F51AEA8249E2E6AF37392 /* XCTest+Private.h */, + 739C414FEAE8C6E579E2A6672CC2BEFA /* XCTestCase+Specta.h */, + 039307585B74513225DE868BD72CDDF2 /* XCTestCase+Specta.m */, + DD8AE74F14E8E24602764D894FD76CB6 /* Support Files */, + ); + path = Specta; + sourceTree = ""; + }; + 144BF115C4736078A910E83B04F491D6 /* Pods-JazzHandsTests */ = { + isa = PBXGroup; + children = ( + 20D7552C29B8466BFD771A0829A23D25 /* Pods-JazzHandsTests-acknowledgements.markdown */, + 8025E16DAF3C5B476B22E46B320A30E0 /* Pods-JazzHandsTests-acknowledgements.plist */, + 4A2B757FB2C593E3629B56B5082E61AB /* Pods-JazzHandsTests-dummy.m */, + 5B76CC4A0E6498BB4080EDDF0A5F306F /* Pods-JazzHandsTests-resources.sh */, + 1B51AFFF317198196C9524ACD7651F28 /* Pods-JazzHandsTests.debug.xcconfig */, + 6B5985B109CE477C63944DCFC5A70E1E /* Pods-JazzHandsTests.release.xcconfig */, ); name = "Pods-JazzHandsTests"; path = "Target Support Files/Pods-JazzHandsTests"; sourceTree = ""; }; - 45FC01CCAC4CCC3E41449454 = { + 1ABCA98B5044B5E47AA95E30CD621017 /* Support Files */ = { isa = PBXGroup; children = ( - B9A4CAA18F8634246067D4E0 /* Podfile */, - 6AB14CD9EA49C61A5057C27D /* Development Pods */, - CA4282CD1A2D79FF49AD1BCB /* Frameworks */, - 5BB27855DD11A6D520963ADE /* Pods */, - FE90CB2C3F72067D3364D64B /* Products */, - 618054182AD88E5DB2FD7C7E /* Targets Support Files */, + 32573047F16F3AF6CE441A8EE164D965 /* JazzHands.xcconfig */, + 6AD2AFDB66028B2AA2C77708F13E327B /* JazzHands-Private.xcconfig */, + C3D8726E373349DF5E74BC65B64E3E2E /* JazzHands-dummy.m */, + ADACCBAD4359D5275B5FF2F361C1713B /* JazzHands-prefix.pch */, ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/JazzHands"; sourceTree = ""; }; - 512374F6CDC20E51321F5D7C /* JazzHands */ = { + 446573FE20C68906C9F64253C7AF24FC /* Pods-JazzHandsDemo */ = { isa = PBXGroup; children = ( - EAB88DD680277C61C98FC295 /* IFTTTAlphaAnimation.h */, - 9E3DACEFD08C0645E69178D2 /* IFTTTAlphaAnimation.m */, - 2E64BC8420E597A057004433 /* IFTTTAnimatable.h */, - 17C030FDB2672516FEC00B8A /* IFTTTAnimatedPagingScrollViewController.h */, - C748F8880E0A11BF2D91BFB3 /* IFTTTAnimatedPagingScrollViewController.m */, - 47830E8280C22A00348B3A3A /* IFTTTAnimatedScrollViewController.h */, - 39A24AC2A3192B4E396BDCCD /* IFTTTAnimatedScrollViewController.m */, - 30D4A17355F3E76FE956DD8F /* IFTTTAnimation.h */, - 4714C82809C283AD75123D20 /* IFTTTAnimation.m */, - 85E852DF9A8D8B6C5BD9D174 /* IFTTTAnimator.h */, - 45217821746137F806307B8B /* IFTTTAnimator.m */, - E28E5B7BEE4F0CB18DBF7624 /* IFTTTColorAnimation.h */, - F92F4C576AA5DF053E7FE99E /* IFTTTColorAnimation.m */, - A3F7DE6E48FEC85D3FAF87C9 /* IFTTTConstraintConstantAnimation.h */, - 5C44FA18D390D4A7C180C747 /* IFTTTConstraintConstantAnimation.m */, - F7C0192850549356DAF19349 /* IFTTTConstraintMultiplierAnimation.h */, - DC97B97BE29E599A1E061DF4 /* IFTTTConstraintMultiplierAnimation.m */, - 55FF746A899C264E74823631 /* IFTTTCornerRadiusAnimation.h */, - 01A063D479F7E7ED0ADA7C9F /* IFTTTCornerRadiusAnimation.m */, - 66C5C5B6E2894A60757FF56C /* IFTTTEasingFunction.h */, - 66827CB2F1A3D514BB314695 /* IFTTTEasingFunction.m */, - 294E402DA2EEE4E96A109F72 /* IFTTTFillColorAnimation.h */, - 0FD3CF03FD3994B9039C63EF /* IFTTTFillColorAnimation.m */, - BF2126960454E4508B4C8F47 /* IFTTTFilmstrip.h */, - D1DECE85F99DB176A990CB84 /* IFTTTFilmstrip.m */, - F15AEFA328224BC372E4EB56 /* IFTTTFrameAnimation.h */, - 61B3B16635730AB19C470062 /* IFTTTFrameAnimation.m */, - EE4984D09E42888921D0E413 /* IFTTTHideAnimation.h */, - 0E8C366F517DDCC943F01AD3 /* IFTTTHideAnimation.m */, - E73A5EC36B307783A21CFDDB /* IFTTTInterpolatable.h */, - 6022CE483547D3A6727C0AC8 /* IFTTTInterpolatable.m */, - D1A7CA255EEE41815C415CEA /* IFTTTJazzHands.h */, - 6545EF0918678FA7FCC8F050 /* IFTTTLabelAnimation.h */, - F7993624656BB6FA551993BB /* IFTTTLabelAnimation.m */, - AE00247518DCD77900CF76A3 /* IFTTTRotationAnimation.h */, - 475496CF1856DA976736F2C3 /* IFTTTRotationAnimation.m */, - 41665A98E7A2989C0540932B /* IFTTTScaleAnimation.h */, - BCB5203E60770E20F1BF4F5F /* IFTTTScaleAnimation.m */, - C7824ABCCD4DB01B5092F46D /* IFTTTScrollViewPageConstraintAnimation.h */, - 6564E350AAA1B2647EF101AE /* IFTTTScrollViewPageConstraintAnimation.m */, - 78645949EDC177E1FBC00F5E /* IFTTTShapeLayerAnimation.h */, - 7907D01D0D268B01F5E91357 /* IFTTTShapeLayerAnimation.m */, - 652870E176D149654FC4F114 /* IFTTTStrokeEndAnimation.h */, - 6067F91822EB4F1D3752C0B0 /* IFTTTStrokeEndAnimation.m */, - 7436478379463FAEDCFC50C7 /* IFTTTStrokeStartAnimation.h */, - D45C64A3B920291E2CA08B3D /* IFTTTStrokeStartAnimation.m */, - 0385E9231A11BDEC59E31FC3 /* IFTTTTextColorAnimation.h */, - 3446018392C5339D4A3631D3 /* IFTTTTextColorAnimation.m */, - 9C4A2ED28DFE02466E7B2DB6 /* IFTTTTransform3DAnimation.h */, - 750FB2EF7FDC6010FCCA2506 /* IFTTTTransform3DAnimation.m */, - 33EBD14E380909DBEB60A523 /* IFTTTTranslationAnimation.h */, - 1537E4CE53FDCC85590BFC6C /* IFTTTTranslationAnimation.m */, - 26E49EE81C8B6906E648059D /* IFTTTViewAnimation.h */, - B383AE2E43A2CE2341AC6C7E /* IFTTTViewAnimation.m */, - DF26417E447AAA9B5BE0B962 /* UIView+IFTTTJazzHands.h */, - 272D9B2C4213EEED01F9460E /* UIView+IFTTTJazzHands.m */, + 58EF3D9A5F7D98D29EE9AC1366E1CCE1 /* Pods-JazzHandsDemo-acknowledgements.markdown */, + A4EE0C17FCFECDCE7A3D5ABCEAA213EB /* Pods-JazzHandsDemo-acknowledgements.plist */, + F5AA6466E5CFC9EC77C7C69961AF0BF9 /* Pods-JazzHandsDemo-dummy.m */, + F60BF142E8337E30681505961DD68D45 /* Pods-JazzHandsDemo-resources.sh */, + BE829408D0E583327D8A1549D1B583DF /* Pods-JazzHandsDemo.debug.xcconfig */, + 448B92D42D7AFF18F07688B52592AF8D /* Pods-JazzHandsDemo.release.xcconfig */, ); - path = JazzHands; + name = "Pods-JazzHandsDemo"; + path = "Target Support Files/Pods-JazzHandsDemo"; sourceTree = ""; }; - 5BB27855DD11A6D520963ADE /* Pods */ = { + 4D5F1C5266E23BFD9C475AE722FFC6E8 /* Support Files */ = { isa = PBXGroup; children = ( - CEA7C2E49D2774EEA4FBA1D2 /* Expecta */, - F58C5B0F9F83B524EE2248FA /* Specta */, + 637C17320BBC47A0AA58D582277A3CDC /* Masonry.xcconfig */, + A06D2ED301A23E55AABE964BBF96609B /* Masonry-Private.xcconfig */, + DEB97F465B013C170D7E4672EF9878DE /* Masonry-dummy.m */, + 0B24F39CC45C26A9EF321AD8649AA2AE /* Masonry-prefix.pch */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/Masonry"; sourceTree = ""; }; - 618054182AD88E5DB2FD7C7E /* Targets Support Files */ = { + 50592577B484E557DA325AE948843624 /* Support Files */ = { isa = PBXGroup; children = ( - 890E069510A93D42149E13CD /* Pods-JazzHandsDemo */, - 3DF78207B02F6808EC5DC3A2 /* Pods-JazzHandsTests */, + C64410716204AC18CCE56D712F87081F /* Expecta.xcconfig */, + 71731D6883D7514628863A0411588178 /* Expecta-Private.xcconfig */, + FE532F7977A7E08C1F828AD5FC3C85D7 /* Expecta-dummy.m */, + 143BFB0B98F1A2EE6862EBB1C95ED766 /* Expecta-prefix.pch */, ); - name = "Targets Support Files"; + name = "Support Files"; + path = "../Target Support Files/Expecta"; sourceTree = ""; }; - 6AB14CD9EA49C61A5057C27D /* Development Pods */ = { + 5E1F3384B1B39575144FEBFCF3210CCC /* Frameworks */ = { isa = PBXGroup; children = ( - 9699690F02CCD4943526E2B0 /* JazzHands */, + D29526F7A46BE1E52CC03A03EA372EBA /* iOS */, ); - name = "Development Pods"; + name = Frameworks; sourceTree = ""; }; - 71FA4741DB4F3EE2ABBB2E81 /* Support Files */ = { + 69E0949A4E24637AE0C75A1ACB8F3669 /* Expecta */ = { isa = PBXGroup; children = ( - DC6D99FDA4AB993DC6B0B082 /* Pods-JazzHandsTests-Expecta.xcconfig */, - D0AEE595E08376FA3AECF837 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */, - F3550B6564714C53C72E7E07 /* Pods-JazzHandsTests-Expecta-dummy.m */, - 6929F82124DD106E6E9EFDAF /* Pods-JazzHandsTests-Expecta-prefix.pch */, + A490377D2070BCF7CD8A95A8DFC3A55F /* EXPBlockDefinedMatcher.h */, + DCDA3128ABB9382CBEF4D668F241EB6B /* EXPBlockDefinedMatcher.m */, + 535956B6230D0D5726B94544B1586B3D /* EXPDefines.h */, + DE68907A3D1DDA1389A4B67B7C23F4C9 /* EXPDoubleTuple.h */, + 4357BBD450F02ECA63791BF400D5BAAC /* EXPDoubleTuple.m */, + 45D522101B40326050F2ED7DBD055DBD /* EXPExpect.h */, + 517C24ABB2AE00DB4DA3D1F176420A34 /* EXPExpect.m */, + FE38845655E796715A8F91C234BFBD1D /* EXPFloatTuple.h */, + 32C0FE34D74DFFDEC14B670E01760321 /* EXPFloatTuple.m */, + 0D325390A8710E51553FA45D79BD1C98 /* EXPMatcher.h */, + D707175482FA1D3E3C79BF4841141152 /* EXPMatcherHelpers.h */, + A8E457F5C5FA7579DDD858E403184772 /* EXPMatcherHelpers.m */, + 3B3F4C3503E6C633E6A1F769D5753111 /* EXPMatchers.h */, + A52053B89834CE2D508A036A58030D55 /* EXPMatchers+beCloseTo.h */, + 5572C111EDD5C94CDA45FE8403A8CA28 /* EXPMatchers+beCloseTo.m */, + 5B1A4C4557882E3C8C642070A82864E3 /* EXPMatchers+beFalsy.h */, + 02BB88871F8A376A6694285D966B7BD1 /* EXPMatchers+beFalsy.m */, + 39A4F92883A1EA9AC462D68B89A0A0B6 /* EXPMatchers+beGreaterThan.h */, + ED007B475F422DDCECC68DB43B9CE57C /* EXPMatchers+beGreaterThan.m */, + CE449897A111A7FC006B8660C5B7446B /* EXPMatchers+beGreaterThanOrEqualTo.h */, + 7041B392166417648DE97965F00951E4 /* EXPMatchers+beGreaterThanOrEqualTo.m */, + 9CAC291410901C2348BDA4DCD911C612 /* EXPMatchers+beIdenticalTo.h */, + 4B3C92EC4E399D3543EAEFAEFCFBC586 /* EXPMatchers+beIdenticalTo.m */, + E16304397FEF227A23092DA638C82446 /* EXPMatchers+beInTheRangeOf.h */, + 3D837292CE0FF8206C520BDB4FFFCBC2 /* EXPMatchers+beInTheRangeOf.m */, + C80F2D797EA1D78FD7B34AC69E3FF2A8 /* EXPMatchers+beInstanceOf.h */, + F4C866ECB58DAA9CFCACAD26B740969A /* EXPMatchers+beInstanceOf.m */, + 5950E9BE99B8F429C8AFF7AE7662D96C /* EXPMatchers+beKindOf.h */, + 8FD462DB932E0CF9E404F08EC68BEAC6 /* EXPMatchers+beKindOf.m */, + E611E002EE8D03CAD27DB8D950A29491 /* EXPMatchers+beLessThan.h */, + 6DE4E4D462BD16B6741FE39E5338A81A /* EXPMatchers+beLessThan.m */, + 98B9933347D6344DFC808F751C019F14 /* EXPMatchers+beLessThanOrEqualTo.h */, + 41532C4D056DF42E03DD1E11E7D6F03F /* EXPMatchers+beLessThanOrEqualTo.m */, + A353918B7D857FB343CEE074EBBFA5C6 /* EXPMatchers+beNil.h */, + D5E2308F20C4541E98548A6770D192C1 /* EXPMatchers+beNil.m */, + 067233EFF021D699EC2BFB6CE8586D8B /* EXPMatchers+beSubclassOf.h */, + 109DB120ECD56EB5D95DA72D18ED6AF9 /* EXPMatchers+beSubclassOf.m */, + A58D6CD377F35F4EB94DEE4B695E07B8 /* EXPMatchers+beSupersetOf.h */, + 0F633A3B997F9474EF4672947956E8E3 /* EXPMatchers+beSupersetOf.m */, + AD824E9743EDC05E8FCD7BD1891E0E5C /* EXPMatchers+beTruthy.h */, + 3D2185136441FB8B281669BAA9B2C283 /* EXPMatchers+beTruthy.m */, + 06429C0B758EED789E68DD6D1019CA91 /* EXPMatchers+beginWith.h */, + 2291C91CE4CFD39864CD61967E90742C /* EXPMatchers+beginWith.m */, + 53413A54470EEECBCB3ED2076BEFC917 /* EXPMatchers+conformTo.h */, + BE6099B6062F0708A5CBFB33BD012357 /* EXPMatchers+conformTo.m */, + 6A578EEAA8DE8C1AECC87A01EC718ACC /* EXPMatchers+contain.h */, + 397C98202446A9506225D8D4F8AC4B30 /* EXPMatchers+contain.m */, + BB24B5BEFD989D103654FFA4FD5DD9FB /* EXPMatchers+endWith.h */, + 8907D2FDB9BE66F533036B7139FF6D0A /* EXPMatchers+endWith.m */, + A8BAF57831E9734DE9A2B8E9FCCC7B91 /* EXPMatchers+equal.h */, + F778B621E07B00779E8C0559EEF48295 /* EXPMatchers+equal.m */, + 13FA98AB1039849BB795C822CAEB533E /* EXPMatchers+haveCountOf.h */, + CA36B941D3DA431EBEDF1850FAB1EDBD /* EXPMatchers+haveCountOf.m */, + 902C38E1274810E40D30F3EDE7583A65 /* EXPMatchers+match.h */, + 0A0B300C8497D3C88986E88DCCF3A718 /* EXPMatchers+match.m */, + 3B939C3A1A5AEC8601A9FCD1B21FD1E6 /* EXPMatchers+postNotification.h */, + 241198EE582FC113CAD1B6D6995971DB /* EXPMatchers+postNotification.m */, + B952CDCCCC2CD9325C1B4CC3A6D4AD39 /* EXPMatchers+raise.h */, + 92457E91286B083A7266E82F73AA4900 /* EXPMatchers+raise.m */, + 5CFC057C52EE2A6DE239458D1FBBED9A /* EXPMatchers+raiseWithReason.h */, + 65904F2DBC97DE38C57A681453A7317F /* EXPMatchers+raiseWithReason.m */, + DC4A257E8F59403E0EE36B2AE0B0CAF7 /* EXPMatchers+respondTo.h */, + 1F580BFCDA7D94DE5798B242EF02DA96 /* EXPMatchers+respondTo.m */, + CF987CC5EBA49241E2450AD835C9336E /* EXPUnsupportedObject.h */, + 074CB9AEE48C00897532E99F4DD54B94 /* EXPUnsupportedObject.m */, + 43B371DB8D219320A8943C74CCD7B96F /* Expecta.h */, + 1D58D7864F8C1C7D0BDC67FBCEA333A9 /* ExpectaObject.h */, + 34E555A119006DE80A85C17FF8CD9B36 /* ExpectaObject.m */, + 2491B930B7D1F76A39FFB408CDA739CE /* ExpectaSupport.h */, + 240D9CFF6C14BE0D9A6B60C560259873 /* ExpectaSupport.m */, + 673218E143FB3CA5F3E7B18DE547DA53 /* NSObject+Expecta.h */, + 9F823D670B378E3F3B1C6DCFC814634F /* NSValue+Expecta.h */, + C7A249FEE57C22346B05B7994BFF3FD0 /* NSValue+Expecta.m */, + 50592577B484E557DA325AE948843624 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Pods-JazzHandsTests-Expecta"; + path = Expecta; sourceTree = ""; }; - 890E069510A93D42149E13CD /* Pods-JazzHandsDemo */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - B84FFC80140FB9FFF1D61249 /* Pods-JazzHandsDemo-acknowledgements.markdown */, - BE3994FF1E749D82E426F273 /* Pods-JazzHandsDemo-acknowledgements.plist */, - 2706E0E7D9AA89E92BDBF199 /* Pods-JazzHandsDemo-dummy.m */, - 7C2F2F69A591B1C0705BC293 /* Pods-JazzHandsDemo-environment.h */, - 02410148FA9511863A054E12 /* Pods-JazzHandsDemo-resources.sh */, - 1319DDBF13541A4CECAF6F6C /* Pods-JazzHandsDemo.debug.xcconfig */, - 1C6B72A5F6320F9CA082FB18 /* Pods-JazzHandsDemo.release.xcconfig */, + C88113A79685B4EFEE7BAD12896829F7 /* Podfile */, + 0720760E6FAA87218C034E98CCD3509B /* Development Pods */, + 5E1F3384B1B39575144FEBFCF3210CCC /* Frameworks */, + B72A7892EECA4A44771AFFC274D6CFA9 /* Pods */, + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, + D871C749CBB672E76A502DD5E90F9842 /* Targets Support Files */, ); - name = "Pods-JazzHandsDemo"; - path = "Target Support Files/Pods-JazzHandsDemo"; sourceTree = ""; }; - 9328CEA3FE3B7A3E3EBAB1E6 /* iOS */ = { + B72A7892EECA4A44771AFFC274D6CFA9 /* Pods */ = { isa = PBXGroup; children = ( - 785DDBC1ECA68425191C8A4D /* CoreGraphics.framework */, - 0C9CC552477FB201D26A2C8B /* Foundation.framework */, - 9FCDBAEBFDD5F2EFE2BFF59D /* QuartzCore.framework */, - 8D891D288817872D5AD9FC40 /* UIKit.framework */, - B41BC4F59C9AFB0F2B2F9709 /* XCTest.framework */, + 69E0949A4E24637AE0C75A1ACB8F3669 /* Expecta */, + ED99826B3185E5E36561F9C13F402F0E /* Masonry */, + 121676E7055B87530EEB8983B917F9B6 /* Specta */, ); - name = iOS; + name = Pods; sourceTree = ""; }; - 9699690F02CCD4943526E2B0 /* JazzHands */ = { + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { isa = PBXGroup; children = ( - 512374F6CDC20E51321F5D7C /* JazzHands */, - 9C71C89C4D98C17E9448F50E /* Support Files */, + 538BA63B8796CDB8A7128F9BF180D6C0 /* libExpecta.a */, + 787E08A5EA62167C40AD079DD184498E /* libJazzHands.a */, + AE9D95FF7D3FAB387818FF008289FA3E /* libMasonry.a */, + 2009023B8D773B413428D7EDB3F88A4E /* libPods-JazzHandsDemo.a */, + 24BAB4F5013D6BFADA4A640480A9D2C7 /* libPods-JazzHandsTests.a */, + F5D6688928836B150DE5F25BD4652ADF /* libSpecta.a */, ); - name = JazzHands; - path = ../..; + name = Products; sourceTree = ""; }; - 9C71C89C4D98C17E9448F50E /* Support Files */ = { + D29526F7A46BE1E52CC03A03EA372EBA /* iOS */ = { isa = PBXGroup; children = ( - 42BA0CDE0F2BAC913D576C66 /* Pods-JazzHandsDemo-JazzHands.xcconfig */, - 13D205C03F477DA8F4A99A14 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */, - F4A4D3AE9B257720CC1A3719 /* Pods-JazzHandsDemo-JazzHands-dummy.m */, - 0E723542987580C4FEF93547 /* Pods-JazzHandsDemo-JazzHands-prefix.pch */, - 3F58F3024B5A99ABF02A9148 /* Pods-JazzHandsTests-JazzHands.xcconfig */, - C875903EE48EE7513A5495A1 /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */, - 11BB584B81272FC191A041A0 /* Pods-JazzHandsTests-JazzHands-dummy.m */, - 0EF1204C44D8B49F7905C03A /* Pods-JazzHandsTests-JazzHands-prefix.pch */, + F38BD6B2EA8E3D607D37364462D778DF /* CoreGraphics.framework */, + 9C20ADF85C0B6161A280C0E82DCE69B7 /* Foundation.framework */, + A0FA1B54BD155598E90FFB0738A5DE2B /* QuartzCore.framework */, + FC10E684DD68F44558F62A6931E6390A /* UIKit.framework */, + 31281F6C0B269B0BE12175DDF3F5DA09 /* XCTest.framework */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands"; + name = iOS; sourceTree = ""; }; - CA4282CD1A2D79FF49AD1BCB /* Frameworks */ = { + D871C749CBB672E76A502DD5E90F9842 /* Targets Support Files */ = { isa = PBXGroup; children = ( - 9328CEA3FE3B7A3E3EBAB1E6 /* iOS */, + 446573FE20C68906C9F64253C7AF24FC /* Pods-JazzHandsDemo */, + 144BF115C4736078A910E83B04F491D6 /* Pods-JazzHandsTests */, ); - name = Frameworks; + name = "Targets Support Files"; sourceTree = ""; }; - CEA7C2E49D2774EEA4FBA1D2 /* Expecta */ = { + DD8AE74F14E8E24602764D894FD76CB6 /* Support Files */ = { isa = PBXGroup; children = ( - 09575E439CBF70EA95DB5A39 /* EXPBlockDefinedMatcher.h */, - 4EFD2D093A5CA5ADC681AE8E /* EXPBlockDefinedMatcher.m */, - 056F3A6F464F3F77019C2057 /* EXPDefines.h */, - B5B4B8A49B8B86B75C90676C /* EXPDoubleTuple.h */, - 9D85F65556ED22B74787D161 /* EXPDoubleTuple.m */, - ACE17D3C0CDAE51D6E6672DC /* EXPExpect.h */, - 0CF7BE4C7CD334FDE7799B95 /* EXPExpect.m */, - 1581475D443D0D795DB1AC20 /* EXPFloatTuple.h */, - 838017DD02842D44F5EE765D /* EXPFloatTuple.m */, - 6B89F3FC74388C51C36E8894 /* EXPMatcher.h */, - 710EC4E5C7FE49A60DACAEAB /* EXPMatcherHelpers.h */, - 6186EC8D959CB54D484F6989 /* EXPMatcherHelpers.m */, - 9DE31AA03022BE3B166158A4 /* EXPMatchers.h */, - D9375A8FA1FB91E14D42BFB3 /* EXPMatchers+beCloseTo.h */, - D71CC96F4DD135744424EB3F /* EXPMatchers+beCloseTo.m */, - 56CF580A1548C16138C1A174 /* EXPMatchers+beFalsy.h */, - AFBE40D3D0603C5727D292FE /* EXPMatchers+beFalsy.m */, - 9D5F2D6BA0BCFE437618171D /* EXPMatchers+beGreaterThan.h */, - B41E7A44F69A601BA2E42AC8 /* EXPMatchers+beGreaterThan.m */, - B02B9C1E6538ACC6BBC21CEA /* EXPMatchers+beGreaterThanOrEqualTo.h */, - E148F4C7E1F7B4AE6859D5F3 /* EXPMatchers+beGreaterThanOrEqualTo.m */, - 60A898A457ECC717FF89B1F2 /* EXPMatchers+beIdenticalTo.h */, - 77EAD45720FB5D5E2CA928C3 /* EXPMatchers+beIdenticalTo.m */, - 1E6987844DA1781B5E8F5749 /* EXPMatchers+beInTheRangeOf.h */, - 55AAA9162E2BBEDDAAFC1524 /* EXPMatchers+beInTheRangeOf.m */, - E201135640ABD991AB704B67 /* EXPMatchers+beInstanceOf.h */, - 4D3BC093FBD571E07F702DE6 /* EXPMatchers+beInstanceOf.m */, - B3D1DD8DFA8F080872960CA8 /* EXPMatchers+beKindOf.h */, - BAAC3FB77DFAC352B8E52CD3 /* EXPMatchers+beKindOf.m */, - 9D42A7CED746B6B91A99B360 /* EXPMatchers+beLessThan.h */, - 5B5B8553878CEBEF88C5BB9B /* EXPMatchers+beLessThan.m */, - 07A9B1FF0044C513E33841A9 /* EXPMatchers+beLessThanOrEqualTo.h */, - 74C5B94E1F22A2B62F684DCA /* EXPMatchers+beLessThanOrEqualTo.m */, - 95CD90EE7B68BECE534221AB /* EXPMatchers+beNil.h */, - 4491CD033F8C68F60DC98D2D /* EXPMatchers+beNil.m */, - 934434C0BD2DB769110411CD /* EXPMatchers+beSubclassOf.h */, - 0DD2668D41D1B3BC3C559DE1 /* EXPMatchers+beSubclassOf.m */, - 05E2B8AD4E6A4FB10A3D60DD /* EXPMatchers+beSupersetOf.h */, - 4E5B6302116ECAF896A36A02 /* EXPMatchers+beSupersetOf.m */, - 439F8F70ABD2957C877335D2 /* EXPMatchers+beTruthy.h */, - 6633193AD4BA6AFAF71B370B /* EXPMatchers+beTruthy.m */, - 3B4DF6374CDAF3E0A03C5B2A /* EXPMatchers+beginWith.h */, - 6E599076A43298BB62D0BCAF /* EXPMatchers+beginWith.m */, - 9B1B5419A0190E33FC50F04E /* EXPMatchers+conformTo.h */, - D09A2DD9308A955710899C86 /* EXPMatchers+conformTo.m */, - 759ED3AE9DCE9A46B442A9A2 /* EXPMatchers+contain.h */, - 7339B482CD14D83172838D4A /* EXPMatchers+contain.m */, - 7A621680EDE998BA81FDE667 /* EXPMatchers+endWith.h */, - 2ABB96F59464DE2566C69AFA /* EXPMatchers+endWith.m */, - 5F29880F4B7BB0C295040701 /* EXPMatchers+equal.h */, - 641BC4FE9A9657D810384555 /* EXPMatchers+equal.m */, - BF8E7F1EEE95E55452C23AEB /* EXPMatchers+haveCountOf.h */, - BBEA0F11C67AA49A843453E7 /* EXPMatchers+haveCountOf.m */, - E2E57523EB6AA145577FAEE0 /* EXPMatchers+match.h */, - 2A04DD1C2E7D7F22A7C8B0B9 /* EXPMatchers+match.m */, - 2AA02D9FFB8AF6184582149C /* EXPMatchers+postNotification.h */, - 21035450E227DB901C3F33D7 /* EXPMatchers+postNotification.m */, - 9576A2DE3D9C00ED4B963C10 /* EXPMatchers+raise.h */, - 42240CBAB22777F1797A8EA5 /* EXPMatchers+raise.m */, - DDE0D1A0A631EF774B5B5EA3 /* EXPMatchers+raiseWithReason.h */, - 085BD59CA56065738DF42113 /* EXPMatchers+raiseWithReason.m */, - FBE18933E13686194E220A52 /* EXPMatchers+respondTo.h */, - A26063CB8EC8E43B6A342C1E /* EXPMatchers+respondTo.m */, - 8EDA2EB03F64F6C8B3AD147C /* EXPUnsupportedObject.h */, - A1F47E4C663DEEFEBDE6474C /* EXPUnsupportedObject.m */, - D5F0B5332F43EBB506D452FF /* Expecta.h */, - 2548213E96884E030A76C5D3 /* ExpectaObject.h */, - 907DD1B245F66962FCC38175 /* ExpectaObject.m */, - 1110957F6855AE1BD2FB369F /* ExpectaSupport.h */, - 23043E7DD2D5B53653FA27AE /* ExpectaSupport.m */, - B1212A8114D53161D6FB685D /* NSObject+Expecta.h */, - AE752EA8051EDDBB5FBAC953 /* NSValue+Expecta.h */, - 7CD0CD9FC41731400E239262 /* NSValue+Expecta.m */, - 71FA4741DB4F3EE2ABBB2E81 /* Support Files */, + 8217845E2A5F620A82A4BAA4EEC951AC /* Specta.xcconfig */, + 72132E294331DD59F635FC1878F7D130 /* Specta-Private.xcconfig */, + F84AEE74F32BC419F27BE093F760E7C5 /* Specta-dummy.m */, + DCA176491E5A220CF0E1AA4A9664EBD4 /* Specta-prefix.pch */, ); - path = Expecta; + name = "Support Files"; + path = "../Target Support Files/Specta"; sourceTree = ""; }; - F58C5B0F9F83B524EE2248FA /* Specta */ = { + ED99826B3185E5E36561F9C13F402F0E /* Masonry */ = { isa = PBXGroup; children = ( - A0662A21ACE7C1E14AF1FAA9 /* SPTCallSite.h */, - 84E383F1CCF3088D055550A6 /* SPTCallSite.m */, - A8FD15B85FF51D8CDCC2FD5A /* SPTCompiledExample.h */, - 9C49CA465A2547739740C01D /* SPTCompiledExample.m */, - 411FE79644EFC92FD5999BC2 /* SPTExample.h */, - 6AEA0508E6B6580768E25A11 /* SPTExample.m */, - 4C022B31F1996A4E30BC964B /* SPTExampleGroup.h */, - C835FE7F279FDDC568CAACD6 /* SPTExampleGroup.m */, - 2E57316DD118F52E45207152 /* SPTExcludeGlobalBeforeAfterEach.h */, - A7ACD2D2EBCF6E377FD67E00 /* SPTGlobalBeforeAfterEach.h */, - 6F877527E404A15C4C0BF7F6 /* SPTSharedExampleGroups.h */, - FBB7DE6A6D8019C196B680D6 /* SPTSharedExampleGroups.m */, - C3DD9F07C9B3B9742C11384F /* SPTSpec.h */, - B9A680AEBD78661666B26114 /* SPTSpec.m */, - 5E1050E299910C9551A73727 /* SPTTestSuite.h */, - FF049F59D8CA2671225B373D /* SPTTestSuite.m */, - 75C654997F9E90270462B9C3 /* Specta.h */, - 4DF20F56A9E619A9CD821D55 /* SpectaDSL.h */, - CE734C94E8443D6FADDBB7BD /* SpectaDSL.m */, - D9612CA2B60C3E8A91FC066E /* SpectaTypes.h */, - 069882731E4D551CF7B80EC9 /* SpectaUtility.h */, - 8D3536E34D98AD361993E21C /* SpectaUtility.m */, - 4974C86B8D66A56007169259 /* XCTest+Private.h */, - 29255C0F3CF62A4B1DF8E6A4 /* XCTestCase+Specta.h */, - 7F1D3C86CB28C9691E3D9914 /* XCTestCase+Specta.m */, - 073DE5EAAADA64A2E4078AE7 /* Support Files */, + 29202C5DB7317367CB036B121CB16B61 /* MASCompositeConstraint.h */, + 8D3EF0ABD850EDA264F0BAFB25B312BE /* MASCompositeConstraint.m */, + 21CC79E8059D8DB568D9A094975204B3 /* MASConstraint.h */, + 289497E8FCF89355E58891D37704ADFE /* MASConstraint.m */, + 7D1466913725877B5C26F9199BC08EB8 /* MASConstraint+Private.h */, + 5E500E91FCACA2C1502EDBF20C54BA5D /* MASConstraintMaker.h */, + 1541479B80B87EEB10575C0019A0886C /* MASConstraintMaker.m */, + 1ADEA213D7D8619170AB9C3A80AC7BAB /* MASLayoutConstraint.h */, + 888022AEFC3B3174B552185E61CE5584 /* MASLayoutConstraint.m */, + 897399199FD560D3425F52D51E1B906B /* MASUtilities.h */, + D0CB6C8B7BEF7D7F4654EFCEEA4BE035 /* MASViewAttribute.h */, + 4B88DECB64E8369145939917AFC2F03C /* MASViewAttribute.m */, + A836D92B58014E3BFD8B916EC7FAE440 /* MASViewConstraint.h */, + 778F28937AAD3E90E1DC15850860F449 /* MASViewConstraint.m */, + 9230328A3DFC41F6F4175A7C15476F72 /* Masonry.h */, + 278EE1149D48BC0B32BBAEB2F1AE5808 /* NSArray+MASAdditions.h */, + 2720E6408315E49E8786711EC466E4C2 /* NSArray+MASAdditions.m */, + 6878254997CF10937AE0DB2E6E8C25B0 /* NSArray+MASShorthandAdditions.h */, + B7F76A8F2F270A862F8F388727EA1419 /* NSLayoutConstraint+MASDebugAdditions.h */, + 93E3DBD91129F3B9C3942FF803ED5FAB /* NSLayoutConstraint+MASDebugAdditions.m */, + 257ED81C3B6E3C3F79ED10F8A7D2F253 /* View+MASAdditions.h */, + 2A58A298CF4AD83AA2773054430AB2E8 /* View+MASAdditions.m */, + F2010A4D8DD54450B7DC01949F9C8035 /* View+MASShorthandAdditions.h */, + 4D5F1C5266E23BFD9C475AE722FFC6E8 /* Support Files */, ); - path = Specta; + path = Masonry; sourceTree = ""; }; - FE90CB2C3F72067D3364D64B /* Products */ = { + F939568682B2AB9EFD9EC2957D80A86D /* JazzHands */ = { isa = PBXGroup; children = ( - 8011556FDF9F30507CCDDB97 /* libPods-JazzHandsDemo.a */, - F176914B861567AB8DB7145C /* libPods-JazzHandsDemo-JazzHands.a */, - 992D08D1D41A4CF21734DAE3 /* libPods-JazzHandsTests.a */, - C4D9476B57070C1EA13B45CB /* libPods-JazzHandsTests-Expecta.a */, - FCF99CF5BE8060D20C0A3EE7 /* libPods-JazzHandsTests-JazzHands.a */, - 4DD4285C28553964278F5CCC /* libPods-JazzHandsTests-Specta.a */, + 067EB64301F0A54597901FF5B28879C2 /* JazzHands */, + 1ABCA98B5044B5E47AA95E30CD621017 /* Support Files */, ); - name = Products; + name = JazzHands; + path = ../..; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 19575613CB006830739CD0C9 /* Headers */ = { + 34EFED0CC32B311AED30015D0F8F45E8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 392A54F40B3EC68311942B1A /* IFTTTAlphaAnimation.h in Headers */, - D29FAA17389476FF7953A5CB /* IFTTTAnimatable.h in Headers */, - 1438674FE8E05E421B774F4B /* IFTTTAnimatedPagingScrollViewController.h in Headers */, - D008F1E054C3E8448A2E2A30 /* IFTTTAnimatedScrollViewController.h in Headers */, - B22D1CFEB4042132C21B5F0F /* IFTTTAnimation.h in Headers */, - 139D1C1CB14AA8BC86AA26F6 /* IFTTTAnimator.h in Headers */, - 5246C2ABD428044190235A69 /* IFTTTColorAnimation.h in Headers */, - B8BEC9051FC8BB3316C517FB /* IFTTTConstraintConstantAnimation.h in Headers */, - 7BF42DA08DD571A7DA07BD95 /* IFTTTConstraintMultiplierAnimation.h in Headers */, - BE665A569FC18E64E4EE9EA0 /* IFTTTCornerRadiusAnimation.h in Headers */, - 306CFAB93A5A15EA82A26A57 /* IFTTTEasingFunction.h in Headers */, - 7582CA2E13BF419313F585F8 /* IFTTTFillColorAnimation.h in Headers */, - C5C3E5A7B22A4359A1ACAAA5 /* IFTTTFilmstrip.h in Headers */, - E8C3AB54B69A4D4994351181 /* IFTTTFrameAnimation.h in Headers */, - 44F50BCBB5E732AE3E0B7BD1 /* IFTTTHideAnimation.h in Headers */, - FA60D1A1497EA865C83E8015 /* IFTTTInterpolatable.h in Headers */, - 2A5D50B959D7BA13596DA6D6 /* IFTTTJazzHands.h in Headers */, - 6ED2BE0EDC023FF4A2B7FF79 /* IFTTTLabelAnimation.h in Headers */, - 63C066B14D0ACD7F7FAEB625 /* IFTTTRotationAnimation.h in Headers */, - 159B0775A1BF98C5D503946A /* IFTTTScaleAnimation.h in Headers */, - 315A780D1CB573F839388CA9 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */, - EA22ECA321C8B6EDF9894B9E /* IFTTTShapeLayerAnimation.h in Headers */, - 9681993C6747C1DF4273B541 /* IFTTTStrokeEndAnimation.h in Headers */, - 800F0FCDC016E97DC972072D /* IFTTTStrokeStartAnimation.h in Headers */, - 33DB088C0CEBF66F56D84925 /* IFTTTTextColorAnimation.h in Headers */, - DA886C15FA3AE10E9FC96148 /* IFTTTTransform3DAnimation.h in Headers */, - 10A0A7E270EE3C5D2A6BD15E /* IFTTTTranslationAnimation.h in Headers */, - 195BAA47E890209EEBB8BDE4 /* IFTTTViewAnimation.h in Headers */, - CC3C9FE15DBC036ABA00AA11 /* UIView+IFTTTJazzHands.h in Headers */, + 53A7EE524B700616E8544EF243A738EC /* MASCompositeConstraint.h in Headers */, + 03E8C4C585DFF14910051FF69688EA26 /* MASConstraint+Private.h in Headers */, + 8DB9DF7740F1CC4E59581DB04D01B028 /* MASConstraint.h in Headers */, + 676D50184B8C7965D0BEAAE0803F6D65 /* MASConstraintMaker.h in Headers */, + 6B1CC60A5B27B27E49035841812195E2 /* MASLayoutConstraint.h in Headers */, + FCE1C23E97083D6D21A84E5968EDAF96 /* MASUtilities.h in Headers */, + 917CE84066480C13029563D344EB9BCD /* MASViewAttribute.h in Headers */, + 9580BCD856AE6B65B5400EDE4E066397 /* MASViewConstraint.h in Headers */, + 45C415E1A681C0A9BE8D45362D0551D5 /* Masonry.h in Headers */, + F34DD1990298EA3F0C9B0C3DD515269F /* NSArray+MASAdditions.h in Headers */, + EDA7EEDF476F5C02D9D42211D945B81B /* NSArray+MASShorthandAdditions.h in Headers */, + A614FD3DABA5D9E390D16F7E22ABEB1F /* NSLayoutConstraint+MASDebugAdditions.h in Headers */, + AAB337063E6F1357F19B4521490B7AD2 /* View+MASAdditions.h in Headers */, + 434787BFB364FCC363E268BCEA25B412 /* View+MASShorthandAdditions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4377B708220D3F690A685E3B /* Headers */ = { + 725B0C1640264B7CA9CEB0AD7973B1C8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E0F0D04930ACE01D2C50E863 /* IFTTTAlphaAnimation.h in Headers */, - AA88B3E196B989A04999889D /* IFTTTAnimatable.h in Headers */, - B145AC676E8E4DCCE928A4C7 /* IFTTTAnimatedPagingScrollViewController.h in Headers */, - E8D0FFA7468AA2AC7E5150F4 /* IFTTTAnimatedScrollViewController.h in Headers */, - 48537965DB768D84C23CB45A /* IFTTTAnimation.h in Headers */, - DE3F780DC71B0CD3470FF3AB /* IFTTTAnimator.h in Headers */, - B129A79A7F5995227A6030C3 /* IFTTTColorAnimation.h in Headers */, - 85C92E43CD73CFA456D3200E /* IFTTTConstraintConstantAnimation.h in Headers */, - 7D25C3357C030C687FE08EC8 /* IFTTTConstraintMultiplierAnimation.h in Headers */, - A14D62D6FC10147822B42392 /* IFTTTCornerRadiusAnimation.h in Headers */, - D7C4C1CEEF874E4AA6EF0ED9 /* IFTTTEasingFunction.h in Headers */, - 21EBA63E9D88A8E6A754E6EB /* IFTTTFillColorAnimation.h in Headers */, - A68F084F61752B741CB2D167 /* IFTTTFilmstrip.h in Headers */, - 8752804DECC81C49D4EBD4E2 /* IFTTTFrameAnimation.h in Headers */, - 2A028F81753787B6A419D5F3 /* IFTTTHideAnimation.h in Headers */, - 9934961F07249278011FD22E /* IFTTTInterpolatable.h in Headers */, - 27D31754A20F4CD00089387B /* IFTTTJazzHands.h in Headers */, - 6701530040B139446AFE8AC5 /* IFTTTLabelAnimation.h in Headers */, - BC7CF6F1BCBB044A31B3AAC6 /* IFTTTRotationAnimation.h in Headers */, - FAB0655B7F7656DE97F1A00D /* IFTTTScaleAnimation.h in Headers */, - 2C99B0DDFBC1069FEDBC1007 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */, - 5FEA35F336C5ED994DEF0154 /* IFTTTShapeLayerAnimation.h in Headers */, - E69C98D05BBA0954FAEAD865 /* IFTTTStrokeEndAnimation.h in Headers */, - 325FA289B5E6F3496BF3A758 /* IFTTTStrokeStartAnimation.h in Headers */, - 65C6225AC843B7D2F7C1FB03 /* IFTTTTextColorAnimation.h in Headers */, - 04D5A51BC5418EE88719B937 /* IFTTTTransform3DAnimation.h in Headers */, - 9903969F3BAD6AD3F7829D17 /* IFTTTTranslationAnimation.h in Headers */, - EC13F9FB6BB92638AB252516 /* IFTTTViewAnimation.h in Headers */, - 41F55D96D3FF084C0AAF3B6A /* UIView+IFTTTJazzHands.h in Headers */, + 0A8B9BFE296F3AAD1F123C546E72BF49 /* IFTTTAlphaAnimation.h in Headers */, + BCE92825DA021C7FF7A64E91619243E6 /* IFTTTAnimatable.h in Headers */, + DC7CEB45879B7893E6A6B88BB3C1913B /* IFTTTAnimatedPagingScrollViewController.h in Headers */, + 379629D005838E241909BD3E8F5108DD /* IFTTTAnimatedScrollViewController.h in Headers */, + B1D6F2A1A733E1855D6EB6ABE0A36C3D /* IFTTTAnimation.h in Headers */, + 39484DA1A54C6A69125842E45AAA251E /* IFTTTAnimator.h in Headers */, + 6B398CBF5682DA9EE8BA281B32688C7E /* IFTTTBackgroundColorAnimation.h in Headers */, + 401951A4ADC7E85843AA4400FBCF0A6D /* IFTTTConstraintConstantAnimation.h in Headers */, + 2D9E0A060F0232DD15B5306C467AB687 /* IFTTTConstraintMultiplierAnimation.h in Headers */, + 2497E2237EF28BE466C66DB8B4EF6B4D /* IFTTTCornerRadiusAnimation.h in Headers */, + 12DB2E9313DE789948E572E43FBC903A /* IFTTTEasingFunction.h in Headers */, + BAC7CA6F276787D0FE07677725E0B175 /* IFTTTFilmstrip.h in Headers */, + 09D30087E025E9D2B30424981C48F3E7 /* IFTTTFrameAnimation.h in Headers */, + 82B8C06EA17CF6E1CA39446727B09550 /* IFTTTHideAnimation.h in Headers */, + 5D12F87FAC75704AB0E555E565444B9D /* IFTTTInterpolatable.h in Headers */, + 4ECA5480F8AEC4A553872713535477C9 /* IFTTTJazzHands.h in Headers */, + 38535B663FD658A94CC1D7F13DFB3BB7 /* IFTTTLayerFillColorAnimation.h in Headers */, + D8406E41FCFBF37645C9E09DCDEBBD34 /* IFTTTLayerStrokeEndAnimation.h in Headers */, + E10E3FA330EA8C9F65CE65FA206984C4 /* IFTTTLayerStrokeStartAnimation.h in Headers */, + B9A617BF47D0C53A9ACA778272006A72 /* IFTTTPathPositionAnimation.h in Headers */, + EAFFACD65608496AD46AD54E45895E2A /* IFTTTRotationAnimation.h in Headers */, + C6A05AA008F05E6C8EC79C9AE6CF4A14 /* IFTTTScaleAnimation.h in Headers */, + 9E603E6D77612C0A4AC9344F62C9B291 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */, + C2A368B25651C164F9B370A3A5EBE6A6 /* IFTTTShapeLayerAnimation.h in Headers */, + 07E73802CDFB92FB5AD22DC121B61CFA /* IFTTTTextColorAnimation.h in Headers */, + E908D809235185DEC1A28C9420160DD7 /* IFTTTTransform3DAnimation.h in Headers */, + 2ABDD7E8D8DE4726D84E1F2A979A8C46 /* IFTTTTranslationAnimation.h in Headers */, + 1AFA762020164C08EC80F3D277A8A75C /* IFTTTViewAnimation.h in Headers */, + A6CC5268BB571DE286AF17A37DBA116E /* UIView+IFTTTJazzHands.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 60BB0FA8578B793325F905B8 /* Headers */ = { + DFD6FD3BF659AAE344BDDA88A9B2D5FE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2B0D16AECD7050C99BEEDFB9 /* SPTCallSite.h in Headers */, - 3DB800444D4EDBD1EA8830D3 /* SPTCompiledExample.h in Headers */, - 0F30A89BCF0F033C5B8F174A /* SPTExample.h in Headers */, - 12D7C3815AE235C1097FA56F /* SPTExampleGroup.h in Headers */, - 7DC06BA9846C33EC42D206A8 /* SPTExcludeGlobalBeforeAfterEach.h in Headers */, - 7C9A824B6C0052C1D3C070B5 /* SPTGlobalBeforeAfterEach.h in Headers */, - 31D9BD8037C4BD78BD906EEA /* SPTSharedExampleGroups.h in Headers */, - 500F5B8E5FC47672818DA917 /* SPTSpec.h in Headers */, - C01BB1C0955E09579B198635 /* SPTTestSuite.h in Headers */, - 4ED62314C18CDA44E2240370 /* Specta.h in Headers */, - 3A4C0AF097B4F050268CD0B9 /* SpectaDSL.h in Headers */, - E68F9252FD569CD9E9C7E220 /* SpectaTypes.h in Headers */, - 3BFB22AD97DAD0D502244D8E /* SpectaUtility.h in Headers */, - B98167CCBB32AF8D3AD11653 /* XCTest+Private.h in Headers */, - F9DC198B0C3FA529698E9751 /* XCTestCase+Specta.h in Headers */, + FA41A706D66695B3046890950C59DAED /* EXPBlockDefinedMatcher.h in Headers */, + C9605BE94C1A7BCB23D74F98F2D9BBAD /* EXPDefines.h in Headers */, + 4E94DCF82729DF8D98E99F29AAB00BE3 /* EXPDoubleTuple.h in Headers */, + F86DF2C8598F0D2DB88B13CB79976510 /* EXPExpect.h in Headers */, + 830A90FAE3F5FAD90B8C18328C690330 /* EXPFloatTuple.h in Headers */, + 6FC43C06143557C0FB370163A6750BB2 /* EXPMatcher.h in Headers */, + E46FF895D710A0D4A67B67202E8E4161 /* EXPMatcherHelpers.h in Headers */, + 7AFAAD5A2F13102416AC967D2F8C34B8 /* EXPMatchers+beCloseTo.h in Headers */, + 680598D408A6EA9E9A2B3FB3ACB37F34 /* EXPMatchers+beFalsy.h in Headers */, + AE2FA414BDA81F80F8542336600E1594 /* EXPMatchers+beGreaterThan.h in Headers */, + 0A44D9E1074AE7CF77FB7490B61EADDF /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */, + 2D54A731A05392D7DFCD53186BCA7165 /* EXPMatchers+beIdenticalTo.h in Headers */, + 1F75EB3F2E6B39BE5F33D0EF226D07F3 /* EXPMatchers+beInTheRangeOf.h in Headers */, + DFB82EDD0A5BD4553FCD1079214F04C8 /* EXPMatchers+beInstanceOf.h in Headers */, + 7ECF6594D5BF0C76F17CF7C95CD2AE85 /* EXPMatchers+beKindOf.h in Headers */, + 6AFEA3903CB940FCB4594D7B6786FB7E /* EXPMatchers+beLessThan.h in Headers */, + EA65F2CFE3630A679DC208EBE613E36F /* EXPMatchers+beLessThanOrEqualTo.h in Headers */, + D792A7A0110C9BC5246C3567EC82D85F /* EXPMatchers+beNil.h in Headers */, + DCCA98B50C94D671EAB2A8401D5EC3A1 /* EXPMatchers+beSubclassOf.h in Headers */, + A5D2500BBD59C1450FFB0B4DCF250C0C /* EXPMatchers+beSupersetOf.h in Headers */, + 05FFF31A3F9556A0BF7BC285E1D6AE2A /* EXPMatchers+beTruthy.h in Headers */, + 7DC814404012C0FCFE7149D561A4E348 /* EXPMatchers+beginWith.h in Headers */, + 2182F9FF2C3AF4F435CA277F60BB7EA8 /* EXPMatchers+conformTo.h in Headers */, + FEBE1DCB84A5C2A0513EDA063F3AA509 /* EXPMatchers+contain.h in Headers */, + A91527692D3D275D7854785932EB68F9 /* EXPMatchers+endWith.h in Headers */, + C2C2573F8DB5E79CAA6C8C33B20F584C /* EXPMatchers+equal.h in Headers */, + 8F93691EDF6CD03ACE2FE7E7512BC1D1 /* EXPMatchers+haveCountOf.h in Headers */, + 1FBBB9EE3B11819E86C96E4EB1E6AE72 /* EXPMatchers+match.h in Headers */, + F2B295BEF8E9B4936C5217E87744B3B2 /* EXPMatchers+postNotification.h in Headers */, + 79A1B575017A7E1BBFF2274D91678732 /* EXPMatchers+raise.h in Headers */, + D1DA2BAE9D331458BF88CD0AC3056F98 /* EXPMatchers+raiseWithReason.h in Headers */, + DBDCF7DB500A79CA8D2CDA010B3D382C /* EXPMatchers+respondTo.h in Headers */, + C9DB2AD40125B0942ED0BB339D73C683 /* EXPMatchers.h in Headers */, + 2141CD11607D8776D7D865BFD72DE214 /* EXPUnsupportedObject.h in Headers */, + B5C708A28DA3AF23242269491AB9250A /* Expecta.h in Headers */, + D6B56C1921C36054CAB1D6EC17162B97 /* ExpectaObject.h in Headers */, + 9AA53BDEAC954D0C54E18E7521232675 /* ExpectaSupport.h in Headers */, + E2CC45755E71F6A5E7A3FE6BF13FCB52 /* NSObject+Expecta.h in Headers */, + D3BB4755818D01C5BBCF360FF7533F7E /* NSValue+Expecta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C98CBCF23D594E3D084C5EAC /* Headers */ = { + F0A5F1EE094EFEBD1BF6BD82F2EDDDC6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F1BD842001CB60DEDAC8C3DC /* EXPBlockDefinedMatcher.h in Headers */, - B739A048A7B7CC3870F8A6C6 /* EXPDefines.h in Headers */, - B2F5135481E23EB9065CE3E2 /* EXPDoubleTuple.h in Headers */, - 88B71C71561A754744BD3CE4 /* EXPExpect.h in Headers */, - 334243D85377389D1C65EC71 /* EXPFloatTuple.h in Headers */, - F33CE5D170C6F709FA2EE893 /* EXPMatcher.h in Headers */, - BA5FB6F3B1D25420598F80C6 /* EXPMatcherHelpers.h in Headers */, - 16B841CBC555D8C5B6DF8E16 /* EXPMatchers+beCloseTo.h in Headers */, - 9E56EB3754464BCC728D0591 /* EXPMatchers+beFalsy.h in Headers */, - C18A439E943BC1CA86128BC9 /* EXPMatchers+beGreaterThan.h in Headers */, - 35ABF55FD5CDDF2208EE5CE7 /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */, - 4A380256D66880F4C68D6627 /* EXPMatchers+beIdenticalTo.h in Headers */, - 95BECE5D4C3719B629DD7B1E /* EXPMatchers+beInTheRangeOf.h in Headers */, - A5F99C360088CA1A58D5D84A /* EXPMatchers+beInstanceOf.h in Headers */, - 7BE758224697E24A2AEC9954 /* EXPMatchers+beKindOf.h in Headers */, - 8002D933224DDEC6BB0C2C8B /* EXPMatchers+beLessThan.h in Headers */, - E7FDCBFDDF5EC8199762BEE4 /* EXPMatchers+beLessThanOrEqualTo.h in Headers */, - F48379B8DCC44E745A2CC8EA /* EXPMatchers+beNil.h in Headers */, - 9A4F82CCA7E3A410AB9CEC04 /* EXPMatchers+beSubclassOf.h in Headers */, - 8BE9183CC214E3EBD3C519C6 /* EXPMatchers+beSupersetOf.h in Headers */, - AE089596AB771096ED52EE4B /* EXPMatchers+beTruthy.h in Headers */, - EA24BA4B0D40671F373D7166 /* EXPMatchers+beginWith.h in Headers */, - 1CBED30EFD0EE9F3E9852211 /* EXPMatchers+conformTo.h in Headers */, - 3D1BAF646FC923D0B587F44C /* EXPMatchers+contain.h in Headers */, - FBDDB5CDB340020AE8257F14 /* EXPMatchers+endWith.h in Headers */, - 2A0FE7308221339BC8906D75 /* EXPMatchers+equal.h in Headers */, - E99DB0D50CC6C8C6CE497A4F /* EXPMatchers+haveCountOf.h in Headers */, - EBE307F7B457F31A5AA00835 /* EXPMatchers+match.h in Headers */, - 5C2931306FE64CD2DDBFF0E8 /* EXPMatchers+postNotification.h in Headers */, - F2BBA54DD096B5E7F710BC65 /* EXPMatchers+raise.h in Headers */, - 8A5AAD775DF0432ADF0F0D7A /* EXPMatchers+raiseWithReason.h in Headers */, - B32D3067815526DAEB5FB51C /* EXPMatchers+respondTo.h in Headers */, - FB4A5602F6D6801996C53D4C /* EXPMatchers.h in Headers */, - 4C2617AB94CB2DD4FEC72DF6 /* EXPUnsupportedObject.h in Headers */, - 222FC3D192E6844C6A7DF36F /* Expecta.h in Headers */, - F648D8B86DDA6C4D6974725A /* ExpectaObject.h in Headers */, - AB905F401AFD285D932B25DE /* ExpectaSupport.h in Headers */, - 2DB6759B8496A3E92AF9171A /* NSObject+Expecta.h in Headers */, - 3F9F8794A8EC55FE0B28C036 /* NSValue+Expecta.h in Headers */, + 1D97E2B87F63B5B7B4E05864B3059381 /* SPTCallSite.h in Headers */, + 60BECF2EFBF82018C393C1D8C02E14F9 /* SPTCompiledExample.h in Headers */, + 0F24054D5BFB25E16986FAA029C73096 /* SPTExample.h in Headers */, + 34449703F4296058417ED73754E48276 /* SPTExampleGroup.h in Headers */, + EF4E8068C72B64F49D1CF4772F051FFF /* SPTExcludeGlobalBeforeAfterEach.h in Headers */, + 6948E9263A05C5EFA82A649CFE1F75D9 /* SPTGlobalBeforeAfterEach.h in Headers */, + 1224EAD9801E8C4E1D34AE68CE6C780D /* SPTSharedExampleGroups.h in Headers */, + 1D49BB22B51E71ADC923063D51E6CAAB /* SPTSpec.h in Headers */, + B285C9F6A9B81325D0AA0E92C3482BA9 /* SPTTestSuite.h in Headers */, + F43F45130EA91679F312A2D2E7B6FC12 /* Specta.h in Headers */, + 8A85D3182C247F545A468CF70F81BD7B /* SpectaDSL.h in Headers */, + 7F94F6995F98F3E3E279702809DE05A1 /* SpectaTypes.h in Headers */, + D529A06A580AF31375B039AF35424B90 /* SpectaUtility.h in Headers */, + A7CD86BF0AABA24B599D748D824F7A7D /* XCTest+Private.h in Headers */, + 09EDDD7FDDBE545F1651EB87B90EE7BE /* XCTestCase+Specta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 09B4787EC8EAF16E54E4730C /* Pods-JazzHandsTests */ = { + 0B1D9575F656C98B99B019874E9BE874 /* Pods-JazzHandsDemo */ = { isa = PBXNativeTarget; - buildConfigurationList = 6618CF4272A74F84538E7390 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */; + buildConfigurationList = 27A356AABFAC6F8454D93DC675C56B44 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */; buildPhases = ( - 99B4E4213F588C54B39A6EC5 /* Sources */, - 0385495BBD0FE022AF123047 /* Frameworks */, + A136A2C24FD2E312B16295FA9E8E5F81 /* Sources */, + 8A24AF3B78D5D7A10B7EB02783E6A7EC /* Frameworks */, ); buildRules = ( ); dependencies = ( - 643B5A1C84EEDD73C1E8320F /* PBXTargetDependency */, - EF7B2845BF38E1FCAF99F291 /* PBXTargetDependency */, - C6317C0280A1A2F5C0F6B11B /* PBXTargetDependency */, + 710FE455CC00F7A31639DDF4D8071CC6 /* PBXTargetDependency */, + 6AA9201AE977C821D1A537E4F60D29BA /* PBXTargetDependency */, ); - name = "Pods-JazzHandsTests"; - productName = "Pods-JazzHandsTests"; - productReference = 992D08D1D41A4CF21734DAE3 /* libPods-JazzHandsTests.a */; + name = "Pods-JazzHandsDemo"; + productName = "Pods-JazzHandsDemo"; + productReference = 2009023B8D773B413428D7EDB3F88A4E /* libPods-JazzHandsDemo.a */; productType = "com.apple.product-type.library.static"; }; - 1BAEE0F54A94BCCE9852BE79 /* Pods-JazzHandsTests-Specta */ = { + 1081246B2B8BF16266BA13C525E4A3EA /* Expecta */ = { isa = PBXNativeTarget; - buildConfigurationList = 9270C3A61FABFB7EB40ED0C6 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Specta" */; + buildConfigurationList = 29BD7D5C0D60E75D70AEB3B3F7322D7A /* Build configuration list for PBXNativeTarget "Expecta" */; buildPhases = ( - C7757CCEFDADAFDA098C797C /* Sources */, - 2BAE57C503748206CFBF6369 /* Frameworks */, - 60BB0FA8578B793325F905B8 /* Headers */, + 15D660C55999EC8C5160A101938ADE03 /* Sources */, + D9D3B3DADDFDC1D199759B6D935EDD88 /* Frameworks */, + DFD6FD3BF659AAE344BDDA88A9B2D5FE /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsTests-Specta"; - productName = "Pods-JazzHandsTests-Specta"; - productReference = 4DD4285C28553964278F5CCC /* libPods-JazzHandsTests-Specta.a */; + name = Expecta; + productName = Expecta; + productReference = 538BA63B8796CDB8A7128F9BF180D6C0 /* libExpecta.a */; productType = "com.apple.product-type.library.static"; }; - 46C63F80AE25A44731A70808 /* Pods-JazzHandsDemo-JazzHands */ = { + 384A9E45F2109FCBAFE63ED5C4C1DCCF /* Masonry */ = { isa = PBXNativeTarget; - buildConfigurationList = B3C1FFFD497C3F883DD52720 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */; + buildConfigurationList = 9720BDCBC9E2608F59F9FF6D38D0D7FD /* Build configuration list for PBXNativeTarget "Masonry" */; buildPhases = ( - ACFD376D1506C2F358D5A1FF /* Sources */, - 114C539DA7F000F313C7B84B /* Frameworks */, - 19575613CB006830739CD0C9 /* Headers */, + 5A7600D3BE3DE0C7FD9C31185D9F7624 /* Sources */, + A69CB06F0077C8B1F578DB7E3F577653 /* Frameworks */, + 34EFED0CC32B311AED30015D0F8F45E8 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsDemo-JazzHands"; - productName = "Pods-JazzHandsDemo-JazzHands"; - productReference = F176914B861567AB8DB7145C /* libPods-JazzHandsDemo-JazzHands.a */; + name = Masonry; + productName = Masonry; + productReference = AE9D95FF7D3FAB387818FF008289FA3E /* libMasonry.a */; productType = "com.apple.product-type.library.static"; }; - 74B20E3948A2667763EE2DE8 /* Pods-JazzHandsDemo */ = { + 6461F429FC34A261D9C5BC80A8A0168F /* Specta */ = { isa = PBXNativeTarget; - buildConfigurationList = 5D7D9139F1D38E851DD8447E /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */; + buildConfigurationList = 7C738256F7193E1F82094B85A17EC88D /* Build configuration list for PBXNativeTarget "Specta" */; buildPhases = ( - 2BBD4FC304A154BA70AC9E90 /* Sources */, - B9A7A1F8B88584088284E23F /* Frameworks */, + 30A5D03DEA0F2FB0E6339CF9E32BEB0A /* Sources */, + 6911CF59E03BE9CF1CFCDE50716F425F /* Frameworks */, + F0A5F1EE094EFEBD1BF6BD82F2EDDDC6 /* Headers */, ); buildRules = ( ); dependencies = ( - C8C103762E688957C3398E8D /* PBXTargetDependency */, ); - name = "Pods-JazzHandsDemo"; - productName = "Pods-JazzHandsDemo"; - productReference = 8011556FDF9F30507CCDDB97 /* libPods-JazzHandsDemo.a */; + name = Specta; + productName = Specta; + productReference = F5D6688928836B150DE5F25BD4652ADF /* libSpecta.a */; productType = "com.apple.product-type.library.static"; }; - 8A6229949625CDF4302055FF /* Pods-JazzHandsTests-Expecta */ = { + D35B605F0609926D3373B1E60847BEA9 /* Pods-JazzHandsTests */ = { isa = PBXNativeTarget; - buildConfigurationList = DB992089F0CA60E24DE0888D /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Expecta" */; + buildConfigurationList = 7996470AADAE3AD19EB5CB48FAA02B77 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */; buildPhases = ( - 3FFFF1A2D3E85489AC91F67B /* Sources */, - C4FE4B073AB9523746B384A0 /* Frameworks */, - C98CBCF23D594E3D084C5EAC /* Headers */, + 2BFE7E080254003A9628FAD3C46FC008 /* Sources */, + 7480D7B2BED33A6AFA145F888D84AEC0 /* Frameworks */, ); buildRules = ( ); dependencies = ( + 2227C35C62B59D3D80043B21683B448F /* PBXTargetDependency */, + 28331CBF012A5DFC4D3E711848A7AFC1 /* PBXTargetDependency */, + 74C6B3EA76F7FE8A47329F4A5D89FDBB /* PBXTargetDependency */, + 11E91F0B5766E492EC7A7A997A940D69 /* PBXTargetDependency */, ); - name = "Pods-JazzHandsTests-Expecta"; - productName = "Pods-JazzHandsTests-Expecta"; - productReference = C4D9476B57070C1EA13B45CB /* libPods-JazzHandsTests-Expecta.a */; + name = "Pods-JazzHandsTests"; + productName = "Pods-JazzHandsTests"; + productReference = 24BAB4F5013D6BFADA4A640480A9D2C7 /* libPods-JazzHandsTests.a */; productType = "com.apple.product-type.library.static"; }; - E76FB6F4D30B4EC07AEEA8A3 /* Pods-JazzHandsTests-JazzHands */ = { + DE8D6055D1EB4125419E68F583AEDFEF /* JazzHands */ = { isa = PBXNativeTarget; - buildConfigurationList = 2D25D4C3B00B0A2C93AA2DDF /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */; + buildConfigurationList = 8A629825683195731F6F868BF6F1AEF4 /* Build configuration list for PBXNativeTarget "JazzHands" */; buildPhases = ( - 73EDA6E113E51E7BE8511E96 /* Sources */, - 0633515D73E73B83E246A829 /* Frameworks */, - 4377B708220D3F690A685E3B /* Headers */, + 1CCC4B21173060BE5DCFBFA1ED80D68D /* Sources */, + B8DE970F49B8CD3172CF696898746077 /* Frameworks */, + 725B0C1640264B7CA9CEB0AD7973B1C8 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsTests-JazzHands"; - productName = "Pods-JazzHandsTests-JazzHands"; - productReference = FCF99CF5BE8060D20C0A3EE7 /* libPods-JazzHandsTests-JazzHands.a */; + name = JazzHands; + productName = JazzHands; + productReference = 787E08A5EA62167C40AD079DD184498E /* libJazzHands.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - C16C44AFAEEB86A701910759 /* Project object */ = { + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; }; - buildConfigurationList = 0877D39069543586EA853855 /* Build configuration list for PBXProject "Pods" */; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = 45FC01CCAC4CCC3E41449454; - productRefGroup = FE90CB2C3F72067D3364D64B /* Products */; + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = CCA510CFBEA2D207524CDA0D73C3B561 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 74B20E3948A2667763EE2DE8 /* Pods-JazzHandsDemo */, - 46C63F80AE25A44731A70808 /* Pods-JazzHandsDemo-JazzHands */, - 09B4787EC8EAF16E54E4730C /* Pods-JazzHandsTests */, - 8A6229949625CDF4302055FF /* Pods-JazzHandsTests-Expecta */, - E76FB6F4D30B4EC07AEEA8A3 /* Pods-JazzHandsTests-JazzHands */, - 1BAEE0F54A94BCCE9852BE79 /* Pods-JazzHandsTests-Specta */, + 1081246B2B8BF16266BA13C525E4A3EA /* Expecta */, + DE8D6055D1EB4125419E68F583AEDFEF /* JazzHands */, + 384A9E45F2109FCBAFE63ED5C4C1DCCF /* Masonry */, + 0B1D9575F656C98B99B019874E9BE874 /* Pods-JazzHandsDemo */, + D35B605F0609926D3373B1E60847BEA9 /* Pods-JazzHandsTests */, + 6461F429FC34A261D9C5BC80A8A0168F /* Specta */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 2BBD4FC304A154BA70AC9E90 /* Sources */ = { + 15D660C55999EC8C5160A101938ADE03 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F0BF4C10ED060C61ED83A892 /* Pods-JazzHandsDemo-dummy.m in Sources */, + 34BEA412544B2E7A253D1E9C280CB6FB /* EXPBlockDefinedMatcher.m in Sources */, + F3980A48F937DFC465EC24208CB451A0 /* EXPDoubleTuple.m in Sources */, + A34E266BA17E968631E04BA1A9C5C00E /* EXPExpect.m in Sources */, + 1FB7DFE18F96E82963607D0CF4211231 /* EXPFloatTuple.m in Sources */, + 5F087DB00D7630C742067225FCB8EF29 /* EXPMatcherHelpers.m in Sources */, + 1AEA98BA96CDF91F077DE12D25BEAE87 /* EXPMatchers+beCloseTo.m in Sources */, + 0B92BD81FA310EA845D92D0F82BEDFA9 /* EXPMatchers+beFalsy.m in Sources */, + F2C694D094E0FD51A48DF16EE5B8CE76 /* EXPMatchers+beGreaterThan.m in Sources */, + F07FB7ECE5DA7E2CD062A73075BEC7DE /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */, + 680FEC5DC208D895ADC5C95C8B385D2D /* EXPMatchers+beIdenticalTo.m in Sources */, + 9671B3EB95DBB4B9CA3B0A25C5CC26EC /* EXPMatchers+beInTheRangeOf.m in Sources */, + 72B3F54BDD3F1614BA49D525AA41C362 /* EXPMatchers+beInstanceOf.m in Sources */, + D41B91325FDF52E59DE190950EC82525 /* EXPMatchers+beKindOf.m in Sources */, + B1D749010EB65DE5CB2E580B13A382E7 /* EXPMatchers+beLessThan.m in Sources */, + A2176516243047B7A669DBB40E52F59E /* EXPMatchers+beLessThanOrEqualTo.m in Sources */, + 3292C3B3655620C7C055DE3700A1A528 /* EXPMatchers+beNil.m in Sources */, + 6389307EECEDF33B7C6029A7D7341936 /* EXPMatchers+beSubclassOf.m in Sources */, + 12157483148A10CACB66F1F3C1020587 /* EXPMatchers+beSupersetOf.m in Sources */, + 0AB56088B7A7A3D45B66C6BDB697E88B /* EXPMatchers+beTruthy.m in Sources */, + 5C8CCF83DBE969E0B96079BFBC513D7F /* EXPMatchers+beginWith.m in Sources */, + 06442CB8F33BD30FA8E3CF5DEC87C384 /* EXPMatchers+conformTo.m in Sources */, + 2F29CA4EE41A564883D509C4D57CAD10 /* EXPMatchers+contain.m in Sources */, + 89AEB64D3C4DF14A28F4C490D68D7FB3 /* EXPMatchers+endWith.m in Sources */, + 23D9116304AAE2A7E03EFA7ADB354DEF /* EXPMatchers+equal.m in Sources */, + 8D49D5D2BEC72D9C3646ADAD5848A5B4 /* EXPMatchers+haveCountOf.m in Sources */, + 492694830D43879AF1068DA41DE113AD /* EXPMatchers+match.m in Sources */, + 73C93E3CC16E33BB3B291E71F291D772 /* EXPMatchers+postNotification.m in Sources */, + 45BFBD32B2F1A809E14A4B91FD73B121 /* EXPMatchers+raise.m in Sources */, + EDA0E4FE81E9C094D994258EA6143C94 /* EXPMatchers+raiseWithReason.m in Sources */, + B42F27B0A4AFB864F2A1015AA9AD9204 /* EXPMatchers+respondTo.m in Sources */, + 29B8C35B4E5C189EF20EC18505B88CEC /* EXPUnsupportedObject.m in Sources */, + A16CB69270E23187E9D24E555C591A6D /* Expecta-dummy.m in Sources */, + 38914F59CB4CDCAB7B95E187D60E9520 /* ExpectaObject.m in Sources */, + 2AC3B91BEDBD10F33ACAC5870201F31E /* ExpectaSupport.m in Sources */, + 39DED9411A2A7D4892FE42170FF08B7D /* NSValue+Expecta.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3FFFF1A2D3E85489AC91F67B /* Sources */ = { + 1CCC4B21173060BE5DCFBFA1ED80D68D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4FE2E327E5A4EF2C0DB0D3A0 /* EXPBlockDefinedMatcher.m in Sources */, - 47ADBAD6176CA9F36DCC028A /* EXPDoubleTuple.m in Sources */, - 7DDAC136F0A88F60D59819AB /* EXPExpect.m in Sources */, - 438C8BB0B439BEEA34690A7B /* EXPFloatTuple.m in Sources */, - 375037094CFC94BD0418B323 /* EXPMatcherHelpers.m in Sources */, - 7AC716705A089C6E3C8B15A6 /* EXPMatchers+beCloseTo.m in Sources */, - 468F3ED8EF8A3584608650E9 /* EXPMatchers+beFalsy.m in Sources */, - 2DF575221F1C748A71BEA15B /* EXPMatchers+beGreaterThan.m in Sources */, - 0E0A17AF6C5CD43F23D78921 /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */, - 77CC42D502BFBDCBEE305850 /* EXPMatchers+beIdenticalTo.m in Sources */, - C4E7481024CD88098560A310 /* EXPMatchers+beInTheRangeOf.m in Sources */, - 570130BF0A444F0992C16548 /* EXPMatchers+beInstanceOf.m in Sources */, - FC47D010FF86BDEC414FFB28 /* EXPMatchers+beKindOf.m in Sources */, - ECFCA1D920F3AD75098D4EEC /* EXPMatchers+beLessThan.m in Sources */, - 6D6CF4B0C2AF532B12EB8C4D /* EXPMatchers+beLessThanOrEqualTo.m in Sources */, - 252568172A036560CA1689E0 /* EXPMatchers+beNil.m in Sources */, - D212149881EB1D2A9DBC849B /* EXPMatchers+beSubclassOf.m in Sources */, - 70EFA63A96B065F6FCDA154A /* EXPMatchers+beSupersetOf.m in Sources */, - 7FCB92A56ACB3713B1F50405 /* EXPMatchers+beTruthy.m in Sources */, - 35DD98939CA7BA6B7469AD69 /* EXPMatchers+beginWith.m in Sources */, - 0B652046B8FE9A6D49A86F8C /* EXPMatchers+conformTo.m in Sources */, - 045A5B5B3709D5C7715C300B /* EXPMatchers+contain.m in Sources */, - EB66E9DD1563F41C2D2576E6 /* EXPMatchers+endWith.m in Sources */, - 90FC36BD24509FA4703C6AAF /* EXPMatchers+equal.m in Sources */, - 7A130EFBDB71E142E848724F /* EXPMatchers+haveCountOf.m in Sources */, - F6EC3D77BB0B1BF9E625901B /* EXPMatchers+match.m in Sources */, - 6EE6F6846EF04012DB87319A /* EXPMatchers+postNotification.m in Sources */, - F44C945CA601B3EB9665C6E5 /* EXPMatchers+raise.m in Sources */, - 44E2A01AA83CD44F48068F9A /* EXPMatchers+raiseWithReason.m in Sources */, - D49C495BEEDA1BB1FD506180 /* EXPMatchers+respondTo.m in Sources */, - 7F5A14EECEDD0328325DC732 /* EXPUnsupportedObject.m in Sources */, - 0994C094BFA00464C0F2DE33 /* ExpectaObject.m in Sources */, - D8582D6C05B4FCA6C935FAF2 /* ExpectaSupport.m in Sources */, - EE5CFC315FCC9705B10246AD /* NSValue+Expecta.m in Sources */, - 6B45BCFEB08A64B102A0CFAC /* Pods-JazzHandsTests-Expecta-dummy.m in Sources */, + DBFB458F8DD7F1885189B471A27FD3D4 /* IFTTTAlphaAnimation.m in Sources */, + 806F1431D196DF7486AF58F36FFAD6FC /* IFTTTAnimatedPagingScrollViewController.m in Sources */, + 224E48C2F07345E51FED7115E98617D3 /* IFTTTAnimatedScrollViewController.m in Sources */, + 2ED94B7E9E99E45F47A442841DEA84B4 /* IFTTTAnimation.m in Sources */, + B939E0FD6D785F2D49498B2C4CA3C553 /* IFTTTAnimator.m in Sources */, + 1F854FE91202751B66156CE36DDFE0D5 /* IFTTTBackgroundColorAnimation.m in Sources */, + A01726EAD6E0C432AC7FAEF79274DC96 /* IFTTTConstraintConstantAnimation.m in Sources */, + 748EABA69E22EE0423380E984412BCC3 /* IFTTTConstraintMultiplierAnimation.m in Sources */, + 63725A0F64B164C6C3B2C767286EC437 /* IFTTTCornerRadiusAnimation.m in Sources */, + 4674EA21980730B9DE0C13B9C7CE9A34 /* IFTTTEasingFunction.m in Sources */, + BF8FDA039443185090571C7489A9E3D2 /* IFTTTFilmstrip.m in Sources */, + E8838E2E58A9476047CF5A215DD674F8 /* IFTTTFrameAnimation.m in Sources */, + 75D4E79C7E8DBFBFDC81972F4EE39DCC /* IFTTTHideAnimation.m in Sources */, + 80AF866B628C2E835289DCEFC68A6FA9 /* IFTTTInterpolatable.m in Sources */, + 82F3E68A0935EE9682DB098319176372 /* IFTTTLayerFillColorAnimation.m in Sources */, + 1FCDA0A59B7DA09B92736326AF1A016A /* IFTTTLayerStrokeEndAnimation.m in Sources */, + 07291CB8F259956F1DA7289A5C742D4D /* IFTTTLayerStrokeStartAnimation.m in Sources */, + 7FBA7E60BD7C8AA24F9CD764ECE9B352 /* IFTTTPathPositionAnimation.m in Sources */, + 59C4303608F831CEEE55148D67ED7109 /* IFTTTRotationAnimation.m in Sources */, + 564DF10552D209A443F100703033909F /* IFTTTScaleAnimation.m in Sources */, + 91C7532E08414ED388424C41EC0937DC /* IFTTTScrollViewPageConstraintAnimation.m in Sources */, + 2DDCADF3471597DC4F07C155AB6215CE /* IFTTTShapeLayerAnimation.m in Sources */, + E7766F65255CCC046ED2B7EAB3C7C536 /* IFTTTTextColorAnimation.m in Sources */, + 7425B571ECAEE5A162A1B6B9C1B4869D /* IFTTTTransform3DAnimation.m in Sources */, + DDE649D09933209A5A3996C8A74BFACF /* IFTTTTranslationAnimation.m in Sources */, + AC3B1AD0813177D91A0E60D8081AB875 /* IFTTTViewAnimation.m in Sources */, + FB9E6C5847348BA3CB43DC5C4B89EADD /* JazzHands-dummy.m in Sources */, + F063A60DBCBBA076526555C41ACB6944 /* UIView+IFTTTJazzHands.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 73EDA6E113E51E7BE8511E96 /* Sources */ = { + 2BFE7E080254003A9628FAD3C46FC008 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F433D42C3142E7A228FCD752 /* IFTTTAlphaAnimation.m in Sources */, - D683217CFA8D337ABDD2E042 /* IFTTTAnimatedPagingScrollViewController.m in Sources */, - D19A9C14E7DE124DCB6B9696 /* IFTTTAnimatedScrollViewController.m in Sources */, - DFB82CEE5D4EE6B864719C64 /* IFTTTAnimation.m in Sources */, - 3A59FEB38BA3D6DCC2CCB82B /* IFTTTAnimator.m in Sources */, - 099C8FAB2CA040449260F0BB /* IFTTTColorAnimation.m in Sources */, - 8F51C9758C0D6D0A94F38ED9 /* IFTTTConstraintConstantAnimation.m in Sources */, - 3549919920910D13D6467976 /* IFTTTConstraintMultiplierAnimation.m in Sources */, - 887C6C0EECAC5BD4C537B53E /* IFTTTCornerRadiusAnimation.m in Sources */, - 042E8F9038771BD52F7CA5D8 /* IFTTTEasingFunction.m in Sources */, - D56EEB8B91BEF8AF4B23BCB4 /* IFTTTFillColorAnimation.m in Sources */, - 08154935B7EAD98A36767285 /* IFTTTFilmstrip.m in Sources */, - A3990BB12514F458170AF4EE /* IFTTTFrameAnimation.m in Sources */, - 0875F4680F789BF646473FB7 /* IFTTTHideAnimation.m in Sources */, - 2E1A43FD33880DDD68824C0F /* IFTTTInterpolatable.m in Sources */, - 7C2B0643008CF97DBE803A19 /* IFTTTLabelAnimation.m in Sources */, - 850E0F9C334CF89D0156DEF6 /* IFTTTRotationAnimation.m in Sources */, - 5D4DCA227763B675FF64498E /* IFTTTScaleAnimation.m in Sources */, - 9B323AF1E31F90FCABF797A1 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */, - 2AB1689EAFBE5C90C88F1779 /* IFTTTShapeLayerAnimation.m in Sources */, - 91C998C488B50F6909FB3145 /* IFTTTStrokeEndAnimation.m in Sources */, - BBBB0EEA7707CE1242BA7AE5 /* IFTTTStrokeStartAnimation.m in Sources */, - C7DABBF3D686565A0E2D0337 /* IFTTTTextColorAnimation.m in Sources */, - 03799167DD970F98A0AE533F /* IFTTTTransform3DAnimation.m in Sources */, - 8322BF370EF3225DF80E09C1 /* IFTTTTranslationAnimation.m in Sources */, - AB456E309AB09BF42B4F366B /* IFTTTViewAnimation.m in Sources */, - B0C0FD88E306CD985B4D5197 /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */, - 6FFB7115608386FE68393A22 /* UIView+IFTTTJazzHands.m in Sources */, + 5568D50DB7BD5E2BD678C6BCAC01DF00 /* Pods-JazzHandsTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 99B4E4213F588C54B39A6EC5 /* Sources */ = { + 30A5D03DEA0F2FB0E6339CF9E32BEB0A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - FFF8573322324BE0F53E2BDB /* Pods-JazzHandsTests-dummy.m in Sources */, + 3300BF0D1C8F6929037EFAF74DA97C68 /* SPTCallSite.m in Sources */, + F044E50D03CB8CC87583BD7B8CBC7624 /* SPTCompiledExample.m in Sources */, + A1DD40EE68BEE53CEE299EA8D6023DFB /* SPTExample.m in Sources */, + 463CEB10D6F17AE42796F7EEFF9FD14F /* SPTExampleGroup.m in Sources */, + 845389102A8AB7F9266F9F7F9D2E5E2E /* SPTSharedExampleGroups.m in Sources */, + 1198113A393D7D33B0F3359BB7744BAA /* SPTSpec.m in Sources */, + 113887BDA1743462B6C3DB9853A578BF /* SPTTestSuite.m in Sources */, + 4969F8004E63A7D6C3B4C6DB97F74791 /* Specta-dummy.m in Sources */, + 837FBD3C91BECDEB29038A97BAE895C5 /* SpectaDSL.m in Sources */, + 1515BDDC68C44C9075591D9D65038720 /* SpectaUtility.m in Sources */, + 233881BD70FE2D2A1FEB6E7A2F8EA429 /* XCTestCase+Specta.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - ACFD376D1506C2F358D5A1FF /* Sources */ = { + 5A7600D3BE3DE0C7FD9C31185D9F7624 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 02F89F0F32F9666ECF4FD784 /* IFTTTAlphaAnimation.m in Sources */, - 3AADC39303BD29BD596DE002 /* IFTTTAnimatedPagingScrollViewController.m in Sources */, - 6EFF72CC40BEFE800F9BBD4D /* IFTTTAnimatedScrollViewController.m in Sources */, - B43490ED4F203534E12B11C8 /* IFTTTAnimation.m in Sources */, - BA53B965C5F1E57B915B11F0 /* IFTTTAnimator.m in Sources */, - 81FDC325FB9E1CEDD3823323 /* IFTTTColorAnimation.m in Sources */, - 499D8BFA4B7EC42D384C050F /* IFTTTConstraintConstantAnimation.m in Sources */, - 17E0B42AF301ABE8A77038BF /* IFTTTConstraintMultiplierAnimation.m in Sources */, - D0A5F8031C55764CDBD9A38B /* IFTTTCornerRadiusAnimation.m in Sources */, - 5434FAF7795BEA69BDF0EA20 /* IFTTTEasingFunction.m in Sources */, - 6853BEA14FE80D1723897AFD /* IFTTTFillColorAnimation.m in Sources */, - A2C05EB72A265E9BDFF7778B /* IFTTTFilmstrip.m in Sources */, - 4D546BCF4C9787C034C4F0D4 /* IFTTTFrameAnimation.m in Sources */, - 96253032625559D718AA3975 /* IFTTTHideAnimation.m in Sources */, - B2E78F7DBC43FFCD180AF457 /* IFTTTInterpolatable.m in Sources */, - 03DAAF757F23EDE7041E0704 /* IFTTTLabelAnimation.m in Sources */, - 32827D11EFAAE7685D4D1D43 /* IFTTTRotationAnimation.m in Sources */, - 2DDAC087C0452B02FBB84520 /* IFTTTScaleAnimation.m in Sources */, - C8397C4E0282C903A93C6D9C /* IFTTTScrollViewPageConstraintAnimation.m in Sources */, - E2E66ADCC45C81E249EF18A3 /* IFTTTShapeLayerAnimation.m in Sources */, - B761BC6A9276B24EC6ECE5E5 /* IFTTTStrokeEndAnimation.m in Sources */, - 211AB2C2210C9B0F3AFB6775 /* IFTTTStrokeStartAnimation.m in Sources */, - 23EABAFEFA75AB2DA796CE75 /* IFTTTTextColorAnimation.m in Sources */, - FB33704695B44330F8361BED /* IFTTTTransform3DAnimation.m in Sources */, - D934C211A218BE6C28E60653 /* IFTTTTranslationAnimation.m in Sources */, - F1AB773FC02731C1524F95B6 /* IFTTTViewAnimation.m in Sources */, - 93E823ADC7F3CDBBD7598D43 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */, - 76194E2B00CB012DE426FE5F /* UIView+IFTTTJazzHands.m in Sources */, + 4D25D63DE7DC16183585510B34DB080B /* MASCompositeConstraint.m in Sources */, + 65B963C3764B71427BED619C2E6BD83D /* MASConstraint.m in Sources */, + 29F5428EFBBB87682558D6F0EEC8F7BF /* MASConstraintMaker.m in Sources */, + 39341B5FBBE44CEDD539CF1DC51021C0 /* MASLayoutConstraint.m in Sources */, + 70E9C5B355EC19C65684DD7E408988B0 /* MASViewAttribute.m in Sources */, + C8EECF8767F5D406DF0C61F9179A4A70 /* MASViewConstraint.m in Sources */, + 5BFB60FB73F1A646C7F28D1FC7725B66 /* Masonry-dummy.m in Sources */, + FE692DF46C60F005EB616C27A826A80C /* NSArray+MASAdditions.m in Sources */, + 3C4A84AB0617B01E93FE3F7BC1EDFB6B /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, + 1BB935238FE80DF60822ECFF6E15223A /* View+MASAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C7757CCEFDADAFDA098C797C /* Sources */ = { + A136A2C24FD2E312B16295FA9E8E5F81 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C87707964F3C8CE1963DFDCE /* Pods-JazzHandsTests-Specta-dummy.m in Sources */, - 76EF2563C445E42217F796A1 /* SPTCallSite.m in Sources */, - 9653D35DA0072E0D848AF74B /* SPTCompiledExample.m in Sources */, - 45A23022C60E4D2F32C5A124 /* SPTExample.m in Sources */, - 88766996F27F2842A8A95F9E /* SPTExampleGroup.m in Sources */, - 5D453002F89499062E764E27 /* SPTSharedExampleGroups.m in Sources */, - 2BC1C453BA3E696C7D1CC449 /* SPTSpec.m in Sources */, - 05D6E1C242177E0C2E88C837 /* SPTTestSuite.m in Sources */, - F40CBA6730EC67DC7FBAA3EB /* SpectaDSL.m in Sources */, - 321FB4FC3104B87E191791F2 /* SpectaUtility.m in Sources */, - 4A6A2D1AEBA6905E43B4D61D /* XCTestCase+Specta.m in Sources */, + 6A10264CF63BB1F9BEFC42DA97797889 /* Pods-JazzHandsDemo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 643B5A1C84EEDD73C1E8320F /* PBXTargetDependency */ = { + 11E91F0B5766E492EC7A7A997A940D69 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsTests-Expecta"; - target = 8A6229949625CDF4302055FF /* Pods-JazzHandsTests-Expecta */; - targetProxy = 4E354E530F8651F5D5438CF3 /* PBXContainerItemProxy */; + name = Specta; + target = 6461F429FC34A261D9C5BC80A8A0168F /* Specta */; + targetProxy = 0880A072E891C027C22DD622A3D7544E /* PBXContainerItemProxy */; + }; + 2227C35C62B59D3D80043B21683B448F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Expecta; + target = 1081246B2B8BF16266BA13C525E4A3EA /* Expecta */; + targetProxy = 88C7DB72C9C964B30173FA576426A110 /* PBXContainerItemProxy */; + }; + 28331CBF012A5DFC4D3E711848A7AFC1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = JazzHands; + target = DE8D6055D1EB4125419E68F583AEDFEF /* JazzHands */; + targetProxy = 2EBA75BE8E777BA8BDE931CCBDAC1F3F /* PBXContainerItemProxy */; }; - C6317C0280A1A2F5C0F6B11B /* PBXTargetDependency */ = { + 6AA9201AE977C821D1A537E4F60D29BA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsTests-Specta"; - target = 1BAEE0F54A94BCCE9852BE79 /* Pods-JazzHandsTests-Specta */; - targetProxy = B0EAE5804BAF46B2BA7C2144 /* PBXContainerItemProxy */; + name = Masonry; + target = 384A9E45F2109FCBAFE63ED5C4C1DCCF /* Masonry */; + targetProxy = 7DD34B4E1CC724C8F80A5428BFFAF8A7 /* PBXContainerItemProxy */; }; - C8C103762E688957C3398E8D /* PBXTargetDependency */ = { + 710FE455CC00F7A31639DDF4D8071CC6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsDemo-JazzHands"; - target = 46C63F80AE25A44731A70808 /* Pods-JazzHandsDemo-JazzHands */; - targetProxy = E5A2AAF03741624768E7A5B4 /* PBXContainerItemProxy */; + name = JazzHands; + target = DE8D6055D1EB4125419E68F583AEDFEF /* JazzHands */; + targetProxy = D97FA108AD9F4FC9726AA2C690EE7CF7 /* PBXContainerItemProxy */; }; - EF7B2845BF38E1FCAF99F291 /* PBXTargetDependency */ = { + 74C6B3EA76F7FE8A47329F4A5D89FDBB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsTests-JazzHands"; - target = E76FB6F4D30B4EC07AEEA8A3 /* Pods-JazzHandsTests-JazzHands */; - targetProxy = E78F0C3D6506DD454282392D /* PBXContainerItemProxy */; + name = Masonry; + target = 384A9E45F2109FCBAFE63ED5C4C1DCCF /* Masonry */; + targetProxy = 333C8561CC099F5E68C2197A630CE4E4 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0189104BD5CFAAD8767775DA /* Debug */ = { + 09C8D2CEAC6852D4C1D13C6317B97A70 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EB30BAB5EC76B74CE45FB9E /* Pods-JazzHandsTests-Specta-Private.xcconfig */; + baseConfigurationReference = 72132E294331DD59F635FC1878F7D130 /* Specta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Specta/Specta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 0FE685C9986BFF1F2293A1C4 /* Release */ = { + 0B120158C1E8CE6AF7894883F65B85DC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1C6B72A5F6320F9CA082FB18 /* Pods-JazzHandsDemo.release.xcconfig */; + baseConfigurationReference = 6AD2AFDB66028B2AA2C77708F13E327B /* JazzHands-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/JazzHands/JazzHands-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; - 1EDA5BA9F7AFB8F11B6546B2 /* Release */ = { + 0EEAA2283EAE353883B1217FDFF1BFDA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 20514729334487DACCC75BEB /* Pods-JazzHandsTests.release.xcconfig */; + baseConfigurationReference = BE829408D0E583327D8A1549D1B583DF /* Pods-JazzHandsDemo.debug.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1360,9 +1378,57 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; + name = Debug; + }; + 1B1C6692628F9B81CA6DEA6B46BF49B7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 72132E294331DD59F635FC1878F7D130 /* Specta-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Specta/Specta-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 1FA9185559F83CFFEC4FAEC93629730C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 71731D6883D7514628863A0411588178 /* Expecta-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Expecta/Expecta-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; name = Release; }; - 25FDE6F700012285F991E3AC /* Debug */ = { + 31E1BCC82922C048E0858BB3CDB48D55 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6AD2AFDB66028B2AA2C77708F13E327B /* JazzHands-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/JazzHands/JazzHands-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 3523159348E1035C58EF859238BFEDB0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1401,39 +1467,39 @@ }; name = Debug; }; - 26D9E075C350F95642810B38 /* Debug */ = { + 3C9B4D830910A107C61066593E12B1FE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C875903EE48EE7513A5495A1 /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; + baseConfigurationReference = 448B92D42D7AFF18F07688B52592AF8D /* Pods-JazzHandsDemo.release.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 3109E11EFDEC4949565DC6FD /* Debug */ = { + 7D6369DB027FFD456259EF55B5D7B194 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 27D3203A4E720E7B7D3EE022 /* Pods-JazzHandsTests.debug.xcconfig */; + baseConfigurationReference = A06D2ED301A23E55AABE964BBF96609B /* Masonry-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 33665D99EC811FE84D3445BF /* Release */ = { + A88658A9552ACB0502744ED7A6EDBEFD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1467,57 +1533,41 @@ }; name = Release; }; - 4FCF95A9369AEF648201785D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 13D205C03F477DA8F4A99A14 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 61F0426BE02E96FF8E503CE2 /* Release */ = { + C4B53230D62D753A132C928BA25ED77C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9EB30BAB5EC76B74CE45FB9E /* Pods-JazzHandsTests-Specta-Private.xcconfig */; + baseConfigurationReference = A06D2ED301A23E55AABE964BBF96609B /* Masonry-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 6F7E30C92DDDFEB59D4F4BE7 /* Release */ = { + CD5AA787823A2AC1D64C71BAABB62A4F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C875903EE48EE7513A5495A1 /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; + baseConfigurationReference = 71731D6883D7514628863A0411588178 /* Expecta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Expecta/Expecta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 8538F39B345FA563DE30E987 /* Debug */ = { + E97863405261050C37845BFAC7EF2EA5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1319DDBF13541A4CECAF6F6C /* Pods-JazzHandsDemo.debug.xcconfig */; + baseConfigurationReference = 1B51AFFF317198196C9524ACD7651F28 /* Pods-JazzHandsTests.debug.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -1531,121 +1581,89 @@ }; name = Debug; }; - 9766AC9F5ACC40CE93BDFFEF /* Release */ = { + FD787C03F60DC73F1604AB341C09A6DA /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D0AEE595E08376FA3AECF837 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */; + baseConfigurationReference = 6B5985B109CE477C63944DCFC5A70E1E /* Pods-JazzHandsTests.release.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; - B38E987FEF5820B13AD474BA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D0AEE595E08376FA3AECF837 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - FB2CA13EBDA3BC33CCB381B7 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 13D205C03F477DA8F4A99A14 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; - name = Debug; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0877D39069543586EA853855 /* Build configuration list for PBXProject "Pods" */ = { + 27A356AABFAC6F8454D93DC675C56B44 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 25FDE6F700012285F991E3AC /* Debug */, - 33665D99EC811FE84D3445BF /* Release */, + 0EEAA2283EAE353883B1217FDFF1BFDA /* Debug */, + 3C9B4D830910A107C61066593E12B1FE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D25D4C3B00B0A2C93AA2DDF /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */ = { + 29BD7D5C0D60E75D70AEB3B3F7322D7A /* Build configuration list for PBXNativeTarget "Expecta" */ = { isa = XCConfigurationList; buildConfigurations = ( - 26D9E075C350F95642810B38 /* Debug */, - 6F7E30C92DDDFEB59D4F4BE7 /* Release */, + CD5AA787823A2AC1D64C71BAABB62A4F /* Debug */, + 1FA9185559F83CFFEC4FAEC93629730C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5D7D9139F1D38E851DD8447E /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8538F39B345FA563DE30E987 /* Debug */, - 0FE685C9986BFF1F2293A1C4 /* Release */, + 3523159348E1035C58EF859238BFEDB0 /* Debug */, + A88658A9552ACB0502744ED7A6EDBEFD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6618CF4272A74F84538E7390 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */ = { + 7996470AADAE3AD19EB5CB48FAA02B77 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3109E11EFDEC4949565DC6FD /* Debug */, - 1EDA5BA9F7AFB8F11B6546B2 /* Release */, + E97863405261050C37845BFAC7EF2EA5 /* Debug */, + FD787C03F60DC73F1604AB341C09A6DA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9270C3A61FABFB7EB40ED0C6 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Specta" */ = { + 7C738256F7193E1F82094B85A17EC88D /* Build configuration list for PBXNativeTarget "Specta" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0189104BD5CFAAD8767775DA /* Debug */, - 61F0426BE02E96FF8E503CE2 /* Release */, + 1B1C6692628F9B81CA6DEA6B46BF49B7 /* Debug */, + 09C8D2CEAC6852D4C1D13C6317B97A70 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B3C1FFFD497C3F883DD52720 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */ = { + 8A629825683195731F6F868BF6F1AEF4 /* Build configuration list for PBXNativeTarget "JazzHands" */ = { isa = XCConfigurationList; buildConfigurations = ( - FB2CA13EBDA3BC33CCB381B7 /* Debug */, - 4FCF95A9369AEF648201785D /* Release */, + 31E1BCC82922C048E0858BB3CDB48D55 /* Debug */, + 0B120158C1E8CE6AF7894883F65B85DC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DB992089F0CA60E24DE0888D /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Expecta" */ = { + 9720BDCBC9E2608F59F9FF6D38D0D7FD /* Build configuration list for PBXNativeTarget "Masonry" */ = { isa = XCConfigurationList; buildConfigurations = ( - B38E987FEF5820B13AD474BA /* Debug */, - 9766AC9F5ACC40CE93BDFFEF /* Release */, + C4B53230D62D753A132C928BA25ED77C /* Debug */, + 7D6369DB027FFD456259EF55B5D7B194 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = C16C44AFAEEB86A701910759 /* Project object */; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; } diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/JazzHands.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/JazzHands.xcscheme new file mode 100644 index 0000000..d1b3959 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/JazzHands.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme index d1f5fb7..9524263 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme index e463552..9a0b610 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Example/Pods/SnapKit/LICENSE b/Example/Pods/SnapKit/LICENSE new file mode 100644 index 0000000..a18ccfb --- /dev/null +++ b/Example/Pods/SnapKit/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Example/Pods/SnapKit/README.md b/Example/Pods/SnapKit/README.md new file mode 100644 index 0000000..bc66129 --- /dev/null +++ b/Example/Pods/SnapKit/README.md @@ -0,0 +1,36 @@ + + +SnapKit is a DSL to make Auto Layout easy on both iOS and OS X. + +[![Build Status](https://travis-ci.org/SnapKit/SnapKit.svg)](https://travis-ci.org/SnapKit/SnapKit) +[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/SnapKit.svg)](https://img.shields.io/cocoapods/v/SnapKit.svg) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +```swift +import SnapKit + +class MyViewController: UIViewController { + + lazy var box = UIView() + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.addSubview(box) + box.snp_makeConstraints { (make) -> Void in + make.width.height.equalTo(50) + make.center.equalTo(self.view) + } + } + +} +``` + +## Resources + +* [Documentation](http://snapkit.io/docs/) +* [F.A.Q.](http://snapkit.io/faq/) + +## License + +MIT license. See the `LICENSE` file for details. diff --git a/Example/Pods/SnapKit/Source/Constraint.swift b/Example/Pods/SnapKit/Source/Constraint.swift new file mode 100644 index 0000000..859e086 --- /dev/null +++ b/Example/Pods/SnapKit/Source/Constraint.swift @@ -0,0 +1,465 @@ +// +// SnapKit +// +// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to expose API's for a Constraint +*/ +public class Constraint { + + public func install() -> [LayoutConstraint] { fatalError("Must be implemented by Concrete subclass.") } + public func uninstall() -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func activate() -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func deactivate() -> Void { fatalError("Must be implemented by Concrete subclass.") } + + public func updateOffset(amount: Float) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: Double) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: CGFloat) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: Int) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: UInt) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: CGPoint) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: CGSize) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updateOffset(amount: EdgeInsets) -> Void { fatalError("Must be implemented by Concrete subclass.") } + + public func updateInsets(amount: EdgeInsets) -> Void { fatalError("Must be implemented by Concrete subclass.") } + + public func updatePriority(priority: Float) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriority(priority: Double) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriority(priority: CGFloat) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriority(priority: UInt) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriority(priority: Int) -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriorityRequired() -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriorityHigh() -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriorityMedium() -> Void { fatalError("Must be implemented by Concrete subclass.") } + public func updatePriorityLow() -> Void { fatalError("Must be implemented by Concrete subclass.") } + +} + +/** + Used internally to implement a ConcreteConstraint +*/ +internal class ConcreteConstraint: Constraint { + + internal override func updateOffset(amount: Float) -> Void { + self.constant = amount + } + internal override func updateOffset(amount: Double) -> Void { + self.updateOffset(Float(amount)) + } + internal override func updateOffset(amount: CGFloat) -> Void { + self.updateOffset(Float(amount)) + } + internal override func updateOffset(amount: Int) -> Void { + self.updateOffset(Float(amount)) + } + internal override func updateOffset(amount: UInt) -> Void { + self.updateOffset(Float(amount)) + } + internal override func updateOffset(amount: CGPoint) -> Void { + self.constant = amount + } + internal override func updateOffset(amount: CGSize) -> Void { + self.constant = amount + } + internal override func updateOffset(amount: EdgeInsets) -> Void { + self.constant = amount + } + + internal override func updateInsets(amount: EdgeInsets) -> Void { + self.constant = EdgeInsets(top: amount.top, left: amount.left, bottom: -amount.bottom, right: -amount.right) + } + + internal override func updatePriority(priority: Float) -> Void { + self.priority = priority + } + internal override func updatePriority(priority: Double) -> Void { + self.updatePriority(Float(priority)) + } + internal override func updatePriority(priority: CGFloat) -> Void { + self.updatePriority(Float(priority)) + } + internal override func updatePriority(priority: UInt) -> Void { + self.updatePriority(Float(priority)) + } + internal override func updatePriority(priority: Int) -> Void { + self.updatePriority(Float(priority)) + } + internal override func updatePriorityRequired() -> Void { + self.updatePriority(Float(1000.0)) + } + internal override func updatePriorityHigh() -> Void { + self.updatePriority(Float(750.0)) + } + internal override func updatePriorityMedium() -> Void { + #if os(iOS) + self.updatePriority(Float(500.0)) + #else + self.updatePriority(Float(501.0)) + #endif + } + internal override func updatePriorityLow() -> Void { + self.updatePriority(Float(250.0)) + } + + internal override func install() -> [LayoutConstraint] { + return self.installOnView(updateExisting: false) + } + + internal override func uninstall() -> Void { + self.uninstallFromView() + } + + internal override func activate() -> Void { + if NSLayoutConstraint.respondsToSelector("activateConstraints:") && self.installInfo != nil { + let layoutConstraints = self.installInfo!.layoutConstraints.allObjects as! [LayoutConstraint] + if layoutConstraints.count > 0 { + NSLayoutConstraint.activateConstraints(layoutConstraints) + } + } else { + self.install() + } + } + + internal override func deactivate() -> Void { + if NSLayoutConstraint.respondsToSelector("deactivateConstraints:") && self.installInfo != nil { + let layoutConstraints = self.installInfo!.layoutConstraints.allObjects as! [LayoutConstraint] + if layoutConstraints.count > 0 { + NSLayoutConstraint.deactivateConstraints(layoutConstraints) + } + } else { + self.uninstall() + } + } + + private let fromItem: ConstraintItem + private let toItem: ConstraintItem + private let relation: ConstraintRelation + private let multiplier: Float + private var constant: Any { + didSet { + if let installInfo = self.installInfo { + for layoutConstraint in installInfo.layoutConstraints.allObjects as! [LayoutConstraint] { + let attribute = (layoutConstraint.secondAttribute == .NotAnAttribute) ? layoutConstraint.firstAttribute : layoutConstraint.secondAttribute + layoutConstraint.constant = attribute.snp_constantForValue(self.constant) + } + } + } + } + private var priority: Float { + didSet { + if let installInfo = self.installInfo { + for layoutConstraint in installInfo.layoutConstraints.allObjects as! [LayoutConstraint] { + layoutConstraint.priority = self.priority + } + } + } + } + + private var installInfo: ConcreteConstraintInstallInfo? = nil + + internal init(fromItem: ConstraintItem, toItem: ConstraintItem, relation: ConstraintRelation, constant: Any, multiplier: Float, priority: Float) { + self.fromItem = fromItem + self.toItem = toItem + self.relation = relation + self.constant = constant + self.multiplier = multiplier + self.priority = priority + } + + internal func installOnView(updateExisting: Bool = false) -> [LayoutConstraint] { + var installOnView: View? = nil + if self.toItem.view != nil { + installOnView = closestCommonSuperviewBetween(self.fromItem.view, self.toItem.view) + if installOnView == nil { + NSException(name: "Cannot Install Constraint", reason: "No common superview between views", userInfo: nil).raise() + return [] + } + } else { + installOnView = self.fromItem.view?.superview + if installOnView == nil { + if self.fromItem.attributes == ConstraintAttributes.Width || self.fromItem.attributes == ConstraintAttributes.Height { + installOnView = self.fromItem.view + } + + if installOnView == nil { + NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise() + return [] + } + } + } + + if let installedOnView = self.installInfo?.view { + if installedOnView != installOnView { + NSException(name: "Cannot Install Constraint", reason: "Already installed on different view.", userInfo: nil).raise() + return [] + } + return self.installInfo?.layoutConstraints.allObjects as? [LayoutConstraint] ?? [] + } + + var newLayoutConstraints = [LayoutConstraint]() + let layoutFromAttributes = self.fromItem.attributes.layoutAttributes + let layoutToAttributes = self.toItem.attributes.layoutAttributes + + // get layout from + let layoutFrom: View? = self.fromItem.view + + // get layout relation + let layoutRelation: NSLayoutRelation = self.relation.layoutRelation + + for layoutFromAttribute in layoutFromAttributes { + // get layout to attribute + let layoutToAttribute = (layoutToAttributes.count > 0) ? layoutToAttributes[0] : layoutFromAttribute + + // get layout constant + var layoutConstant: CGFloat = layoutToAttribute.snp_constantForValue(self.constant) + + // get layout to + var layoutTo: View? = self.toItem.view + if layoutTo == nil && layoutToAttribute != .Width && layoutToAttribute != .Height { + layoutTo = installOnView + } + + // create layout constraint + let layoutConstraint = LayoutConstraint( + item: layoutFrom!, + attribute: layoutFromAttribute, + relatedBy: layoutRelation, + toItem: layoutTo, + attribute: layoutToAttribute, + multiplier: CGFloat(self.multiplier), + constant: layoutConstant) + + // set priority + layoutConstraint.priority = self.priority + + // set constraint + layoutConstraint.snp_constraint = self + + newLayoutConstraints.append(layoutConstraint) + } + + // special logic for updating + if updateExisting { + // get existing constraints for this view + let existingLayoutConstraints = reverse(layoutFrom!.snp_installedLayoutConstraints) + + // array that will contain only new layout constraints to keep + var newLayoutConstraintsToKeep = [LayoutConstraint]() + + // begin looping + for layoutConstraint in newLayoutConstraints { + // layout constraint that should be updated + var updateLayoutConstraint: LayoutConstraint? = nil + + // loop through existing and check for match + for existingLayoutConstraint in existingLayoutConstraints { + if existingLayoutConstraint == layoutConstraint { + updateLayoutConstraint = existingLayoutConstraint + break + } + } + + // if we have existing one lets just update the constant + if updateLayoutConstraint != nil { + updateLayoutConstraint!.constant = layoutConstraint.constant + } + // otherwise add this layout constraint to new keep list + else { + newLayoutConstraintsToKeep.append(layoutConstraint) + } + } + + // set constraints to only new ones + newLayoutConstraints = newLayoutConstraintsToKeep + } + + // add constraints + installOnView!.addConstraints(newLayoutConstraints) + + // set install info + self.installInfo = ConcreteConstraintInstallInfo(view: installOnView, layoutConstraints: NSHashTable.weakObjectsHashTable()) + + // store which layout constraints are installed for this constraint + for layoutConstraint in newLayoutConstraints { + self.installInfo!.layoutConstraints.addObject(layoutConstraint) + } + + // store the layout constraints against the layout from view + layoutFrom!.snp_installedLayoutConstraints += newLayoutConstraints + + // return the new constraints + return newLayoutConstraints + } + + internal func uninstallFromView() { + if let installInfo = self.installInfo, + let installedLayoutConstraints = installInfo.layoutConstraints.allObjects as? [LayoutConstraint] { + + if installedLayoutConstraints.count > 0 { + + if let installedOnView = installInfo.view { + // remove the constraints from the UIView's storage + installedOnView.removeConstraints(installedLayoutConstraints) + } + + // remove the constraints from the from item view + if let fromView = self.fromItem.view { + fromView.snp_installedLayoutConstraints = fromView.snp_installedLayoutConstraints.filter { + return !contains(installedLayoutConstraints, $0) + } + } + } + + } + self.installInfo = nil + } + +} + +private struct ConcreteConstraintInstallInfo { + + weak var view: View? = nil + let layoutConstraints: NSHashTable + +} + +private extension NSLayoutAttribute { + + private func snp_constantForValue(value: Any?) -> CGFloat { + // Float + if let float = value as? Float { + return CGFloat(float) + } + // Double + else if let double = value as? Double { + return CGFloat(double) + } + // UInt + else if let int = value as? Int { + return CGFloat(int) + } + // Int + else if let uint = value as? UInt { + return CGFloat(uint) + } + // CGFloat + else if let float = value as? CGFloat { + return float + } + // CGSize + else if let size = value as? CGSize { + if self == .Width { + return size.width + } else if self == .Height { + return size.height + } + } + // CGPoint + else if let point = value as? CGPoint { + #if os(iOS) + switch self { + case .Left, .CenterX, .LeftMargin, .CenterXWithinMargins: return point.x + case .Top, .CenterY, .TopMargin, .CenterYWithinMargins, .Baseline, .FirstBaseline: return point.y + case .Right, .RightMargin: return point.x + case .Bottom, .BottomMargin: return point.y + case .Leading, .LeadingMargin: return point.x + case .Trailing, .TrailingMargin: return point.x + case .Width, .Height, .NotAnAttribute: return CGFloat(0) + } + #else + switch self { + case .Left, .CenterX: return point.x + case .Top, .CenterY, .Baseline: return point.y + case .Right: return point.x + case .Bottom: return point.y + case .Leading: return point.x + case .Trailing: return point.x + case .Width, .Height, .NotAnAttribute: return CGFloat(0) + } + #endif + } + // EdgeInsets + else if let insets = value as? EdgeInsets { + #if os(iOS) + switch self { + case .Left, .CenterX, .LeftMargin, .CenterXWithinMargins: return insets.left + case .Top, .CenterY, .TopMargin, .CenterYWithinMargins, .Baseline, .FirstBaseline: return insets.top + case .Right, .RightMargin: return insets.right + case .Bottom, .BottomMargin: return insets.bottom + case .Leading, .LeadingMargin: return (Config.interfaceLayoutDirection == .LeftToRight) ? insets.left : -insets.right + case .Trailing, .TrailingMargin: return (Config.interfaceLayoutDirection == .LeftToRight) ? insets.right : -insets.left + case .Width, .Height, .NotAnAttribute: return CGFloat(0) + } + #else + switch self { + case .Left, .CenterX: return insets.left + case .Top, .CenterY, .Baseline: return insets.top + case .Right: return insets.right + case .Bottom: return insets.bottom + case .Leading: return (Config.interfaceLayoutDirection == .LeftToRight) ? insets.left : -insets.right + case .Trailing: return (Config.interfaceLayoutDirection == .LeftToRight) ? insets.right : -insets.left + case .Width, .Height, .NotAnAttribute: return CGFloat(0) + } + #endif + } + + return CGFloat(0); + } +} + +private func closestCommonSuperviewBetween(fromView: View?, toView: View?) -> View? { + var views = Set() + var fromView = fromView + var toView = toView + do { + if let view = toView { + if views.contains(view) { + return view + } + views.insert(view) + toView = view.superview + } + if let view = fromView { + if views.contains(view) { + return view + } + views.insert(view) + fromView = view.superview + } + } while (fromView != nil || toView != nil) + + return nil +} + +private func ==(left: ConcreteConstraint, right: ConcreteConstraint) -> Bool { + return (left.fromItem == right.fromItem && + left.toItem == right.toItem && + left.relation == right.relation && + left.multiplier == right.multiplier && + left.priority == right.priority) +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/ConstraintAttributes.swift b/Example/Pods/SnapKit/Source/ConstraintAttributes.swift new file mode 100644 index 0000000..d20cd95 --- /dev/null +++ b/Example/Pods/SnapKit/Source/ConstraintAttributes.swift @@ -0,0 +1,167 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to define `NSLayoutAttributes` in a more concise and composite manner +*/ +internal struct ConstraintAttributes: RawOptionSetType, BooleanType { + + internal init(rawValue: UInt) { + self.rawValue = rawValue + } + internal init(_ rawValue: UInt) { + self.init(rawValue: rawValue) + } + internal init(nilLiteral: ()) { + self.rawValue = 0 + } + + internal private(set) var rawValue: UInt + internal static var allZeros: ConstraintAttributes { return self(0) } + internal static func convertFromNilLiteral() -> ConstraintAttributes { return self(0) } + internal var boolValue: Bool { return self.rawValue != 0 } + + internal func toRaw() -> UInt { return self.rawValue } + internal static func fromRaw(raw: UInt) -> ConstraintAttributes? { return self(raw) } + internal static func fromMask(raw: UInt) -> ConstraintAttributes { return self(raw) } + + // normal + + internal static var None: ConstraintAttributes { return self(0) } + internal static var Left: ConstraintAttributes { return self(1) } + internal static var Top: ConstraintAttributes { return self(2) } + internal static var Right: ConstraintAttributes { return self(4) } + internal static var Bottom: ConstraintAttributes { return self(8) } + internal static var Leading: ConstraintAttributes { return self(16) } + internal static var Trailing: ConstraintAttributes { return self(32) } + internal static var Width: ConstraintAttributes { return self(64) } + internal static var Height: ConstraintAttributes { return self(128) } + internal static var CenterX: ConstraintAttributes { return self(256) } + internal static var CenterY: ConstraintAttributes { return self(512) } + internal static var Baseline: ConstraintAttributes { return self(1024) } + + #if os(iOS) + internal static var FirstBaseline: ConstraintAttributes { return self(2048) } + internal static var LeftMargin: ConstraintAttributes { return self(4096) } + internal static var RightMargin: ConstraintAttributes { return self(8192) } + internal static var TopMargin: ConstraintAttributes { return self(16384) } + internal static var BottomMargin: ConstraintAttributes { return self(32768) } + internal static var LeadingMargin: ConstraintAttributes { return self(65536) } + internal static var TrailingMargin: ConstraintAttributes { return self(131072) } + internal static var CenterXWithinMargins: ConstraintAttributes { return self(262144) } + internal static var CenterYWithinMargins: ConstraintAttributes { return self(524288) } + #endif + + // aggregates + + internal static var Edges: ConstraintAttributes { return self(15) } + internal static var Size: ConstraintAttributes { return self(192) } + internal static var Center: ConstraintAttributes { return self(768) } + + #if os(iOS) + internal static var Margins: ConstraintAttributes { return self(61440) } + internal static var CenterWithinMargins: ConstraintAttributes { return self(786432) } + #endif + + internal var layoutAttributes:[NSLayoutAttribute] { + var attrs = [NSLayoutAttribute]() + if (self & ConstraintAttributes.Left) { + attrs.append(.Left) + } + if (self & ConstraintAttributes.Top) { + attrs.append(.Top) + } + if (self & ConstraintAttributes.Right) { + attrs.append(.Right) + } + if (self & ConstraintAttributes.Bottom) { + attrs.append(.Bottom) + } + if (self & ConstraintAttributes.Leading) { + attrs.append(.Leading) + } + if (self & ConstraintAttributes.Trailing) { + attrs.append(.Trailing) + } + if (self & ConstraintAttributes.Width) { + attrs.append(.Width) + } + if (self & ConstraintAttributes.Height) { + attrs.append(.Height) + } + if (self & ConstraintAttributes.CenterX) { + attrs.append(.CenterX) + } + if (self & ConstraintAttributes.CenterY) { + attrs.append(.CenterY) + } + if (self & ConstraintAttributes.Baseline) { + attrs.append(.Baseline) + } + #if os(iOS) + if (self & ConstraintAttributes.FirstBaseline) { + attrs.append(.FirstBaseline) + } + if (self & ConstraintAttributes.LeftMargin) { + attrs.append(.LeftMargin) + } + if (self & ConstraintAttributes.RightMargin) { + attrs.append(.RightMargin) + } + if (self & ConstraintAttributes.TopMargin) { + attrs.append(.TopMargin) + } + if (self & ConstraintAttributes.BottomMargin) { + attrs.append(.BottomMargin) + } + if (self & ConstraintAttributes.LeadingMargin) { + attrs.append(.LeadingMargin) + } + if (self & ConstraintAttributes.TrailingMargin) { + attrs.append(.TrailingMargin) + } + if (self & ConstraintAttributes.CenterXWithinMargins) { + attrs.append(.CenterXWithinMargins) + } + if (self & ConstraintAttributes.CenterYWithinMargins) { + attrs.append(.CenterYWithinMargins) + } + #endif + return attrs + } +} +internal func +=(inout left: ConstraintAttributes, right: ConstraintAttributes) { + left = (left | right) +} +internal func -=(inout left: ConstraintAttributes, right: ConstraintAttributes) { + left = left & ~right +} +internal func ==(left: ConstraintAttributes, right: ConstraintAttributes) -> Bool { + return left.rawValue == right.rawValue +} diff --git a/Example/Pods/SnapKit/Source/ConstraintDescription.swift b/Example/Pods/SnapKit/Source/ConstraintDescription.swift new file mode 100644 index 0000000..ebbdb70 --- /dev/null +++ b/Example/Pods/SnapKit/Source/ConstraintDescription.swift @@ -0,0 +1,540 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to expose the final API of a `ConstraintDescription` which allows getting a constraint from it + */ +public protocol ConstraintDescriptionFinalizable: class { + + var constraint: Constraint { get } + +} + +/** + Used to expose priority APIs + */ +public protocol ConstraintDescriptionPriortizable: ConstraintDescriptionFinalizable { + + func priority(priority: Float) -> ConstraintDescriptionFinalizable + func priority(priority: Double) -> ConstraintDescriptionFinalizable + func priority(priority: CGFloat) -> ConstraintDescriptionFinalizable + func priority(priority: UInt) -> ConstraintDescriptionFinalizable + func priority(priority: Int) -> ConstraintDescriptionFinalizable + func priorityRequired() -> ConstraintDescriptionFinalizable + func priorityHigh() -> ConstraintDescriptionFinalizable + func priorityMedium() -> ConstraintDescriptionFinalizable + func priorityLow() -> ConstraintDescriptionFinalizable +} + +/** + Used to expose multiplier & constant APIs +*/ +public protocol ConstraintDescriptionEditable: ConstraintDescriptionPriortizable { + + func multipliedBy(amount: Float) -> ConstraintDescriptionEditable + func multipliedBy(amount: Double) -> ConstraintDescriptionEditable + func multipliedBy(amount: CGFloat) -> ConstraintDescriptionEditable + func multipliedBy(amount: Int) -> ConstraintDescriptionEditable + func multipliedBy(amount: UInt) -> ConstraintDescriptionEditable + + func dividedBy(amount: Float) -> ConstraintDescriptionEditable + func dividedBy(amount: Double) -> ConstraintDescriptionEditable + func dividedBy(amount: CGFloat) -> ConstraintDescriptionEditable + func dividedBy(amount: Int) -> ConstraintDescriptionEditable + func dividedBy(amount: UInt) -> ConstraintDescriptionEditable + + func offset(amount: Float) -> ConstraintDescriptionEditable + func offset(amount: Double) -> ConstraintDescriptionEditable + func offset(amount: CGFloat) -> ConstraintDescriptionEditable + func offset(amount: Int) -> ConstraintDescriptionEditable + func offset(amount: UInt) -> ConstraintDescriptionEditable + func offset(amount: CGPoint) -> ConstraintDescriptionEditable + func offset(amount: CGSize) -> ConstraintDescriptionEditable + func offset(amount: EdgeInsets) -> ConstraintDescriptionEditable + + func insets(amount: EdgeInsets) -> ConstraintDescriptionEditable +} + +/** + Used to expose relation APIs +*/ +public protocol ConstraintDescriptionRelatable: class { + + func equalTo(other: ConstraintItem) -> ConstraintDescriptionEditable + func equalTo(other: View) -> ConstraintDescriptionEditable + #if os(iOS) + func equalTo(other: UILayoutSupport) -> ConstraintDescriptionEditable + #endif + func equalTo(other: Float) -> ConstraintDescriptionEditable + func equalTo(other: Double) -> ConstraintDescriptionEditable + func equalTo(other: CGFloat) -> ConstraintDescriptionEditable + func equalTo(other: Int) -> ConstraintDescriptionEditable + func equalTo(other: UInt) -> ConstraintDescriptionEditable + func equalTo(other: CGSize) -> ConstraintDescriptionEditable + func equalTo(other: CGPoint) -> ConstraintDescriptionEditable + func equalTo(other: EdgeInsets) -> ConstraintDescriptionEditable + + func lessThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: View) -> ConstraintDescriptionEditable + #if os(iOS) + func lessThanOrEqualTo(other: UILayoutSupport) -> ConstraintDescriptionEditable + #endif + func lessThanOrEqualTo(other: Float) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: Double) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: CGFloat) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: Int) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: UInt) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable + + func greaterThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: View) -> ConstraintDescriptionEditable + #if os(iOS) + func greaterThanOrEqualTo(other: UILayoutSupport) -> ConstraintDescriptionEditable + #endif + func greaterThanOrEqualTo(other: Float) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: Double) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: CGFloat) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: Int) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: UInt) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable + +} + +/** + Used to expose chaining APIs +*/ +public protocol ConstraintDescriptionExtendable: ConstraintDescriptionRelatable { + + var left: ConstraintDescriptionExtendable { get } + var top: ConstraintDescriptionExtendable { get } + var bottom: ConstraintDescriptionExtendable { get } + var right: ConstraintDescriptionExtendable { get } + var leading: ConstraintDescriptionExtendable { get } + var trailing: ConstraintDescriptionExtendable { get } + var width: ConstraintDescriptionExtendable { get } + var height: ConstraintDescriptionExtendable { get } + var centerX: ConstraintDescriptionExtendable { get } + var centerY: ConstraintDescriptionExtendable { get } + var baseline: ConstraintDescriptionExtendable { get } + + #if os(iOS) + var firstBaseline: ConstraintDescriptionExtendable { get } + var leftMargin: ConstraintDescriptionExtendable { get } + var rightMargin: ConstraintDescriptionExtendable { get } + var topMargin: ConstraintDescriptionExtendable { get } + var bottomMargin: ConstraintDescriptionExtendable { get } + var leadingMargin: ConstraintDescriptionExtendable { get } + var trailingMargin: ConstraintDescriptionExtendable { get } + var centerXWithinMargins: ConstraintDescriptionExtendable { get } + var centerYWithinMargins: ConstraintDescriptionExtendable { get } + #endif +} + +/** + Used to internally manage building constraint + */ +internal class ConstraintDescription: ConstraintDescriptionExtendable, ConstraintDescriptionEditable, ConstraintDescriptionFinalizable { + + internal var left: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Left) } + internal var top: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Top) } + internal var right: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Right) } + internal var bottom: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Bottom) } + internal var leading: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Leading) } + internal var trailing: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Trailing) } + internal var width: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Width) } + internal var height: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Height) } + internal var centerX: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterX) } + internal var centerY: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterY) } + internal var baseline: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Baseline) } + + #if os(iOS) + internal var firstBaseline: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.FirstBaseline) } + internal var leftMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.LeftMargin) } + internal var rightMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.RightMargin) } + internal var topMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.TopMargin) } + internal var bottomMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.BottomMargin) } + internal var leadingMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.LeadingMargin) } + internal var trailingMargin: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.TrailingMargin) } + internal var centerXWithinMargins: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterXWithinMargins) } + internal var centerYWithinMargins: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterYWithinMargins) } + #endif + + // MARK: initializer + + init(fromItem: ConstraintItem) { + self.fromItem = fromItem + self.toItem = ConstraintItem(object: nil, attributes: ConstraintAttributes.None) + } + + // MARK: equalTo + + internal func equalTo(other: ConstraintItem) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + internal func equalTo(other: View) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + #if os(iOS) + internal func equalTo(other: UILayoutSupport) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + #endif + internal func equalTo(other: Float) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + internal func equalTo(other: Double) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .Equal) + } + internal func equalTo(other: CGFloat) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .Equal) + } + internal func equalTo(other: Int) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .Equal) + } + internal func equalTo(other: UInt) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .Equal) + } + internal func equalTo(other: CGSize) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + internal func equalTo(other: CGPoint) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + internal func equalTo(other: EdgeInsets) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .Equal) + } + + // MARK: lessThanOrEqualTo + + internal func lessThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: View) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + #if os(iOS) + internal func lessThanOrEqualTo(other: UILayoutSupport) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + #endif + internal func lessThanOrEqualTo(other: Float) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: Double) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: CGFloat) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: Int) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: UInt) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + internal func lessThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .LessThanOrEqualTo) + } + + // MARK: greaterThanOrEqualTo + + internal func greaterThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: View) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + #if os(iOS) + internal func greaterThanOrEqualTo(other: UILayoutSupport) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + #endif + internal func greaterThanOrEqualTo(other: Float) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: Double) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: CGFloat) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: Int) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: UInt) -> ConstraintDescriptionEditable { + return self.constrainTo(Float(other), relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + internal func greaterThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable { + return self.constrainTo(other, relation: .GreaterThanOrEqualTo) + } + + // MARK: multiplier + + internal func multipliedBy(amount: Float) -> ConstraintDescriptionEditable { + self.multiplier = amount + return self + } + internal func multipliedBy(amount: Double) -> ConstraintDescriptionEditable { + return self.multipliedBy(Float(amount)) + } + internal func multipliedBy(amount: CGFloat) -> ConstraintDescriptionEditable { + return self.multipliedBy(Float(amount)) + } + internal func multipliedBy(amount: Int) -> ConstraintDescriptionEditable { + return self.multipliedBy(Float(amount)) + } + internal func multipliedBy(amount: UInt) -> ConstraintDescriptionEditable { + return self.multipliedBy(Float(amount)) + } + + internal func dividedBy(amount: Float) -> ConstraintDescriptionEditable { + self.multiplier = 1.0 / amount; + return self + } + internal func dividedBy(amount: Double) -> ConstraintDescriptionEditable { + return self.dividedBy(Float(amount)) + } + internal func dividedBy(amount: CGFloat) -> ConstraintDescriptionEditable { + return self.dividedBy(Float(amount)) + } + internal func dividedBy(amount: Int) -> ConstraintDescriptionEditable { + return self.dividedBy(Float(amount)) + } + internal func dividedBy(amount: UInt) -> ConstraintDescriptionEditable { + return self.dividedBy(Float(amount)) + } + + // MARK: offset + + internal func offset(amount: Float) -> ConstraintDescriptionEditable { + self.constant = amount + return self + } + internal func offset(amount: Double) -> ConstraintDescriptionEditable { + return self.offset(Float(amount)) + } + internal func offset(amount: CGFloat) -> ConstraintDescriptionEditable { + return self.offset(Float(amount)) + } + internal func offset(amount: Int) -> ConstraintDescriptionEditable { + return self.offset(Float(amount)) + } + internal func offset(amount: UInt) -> ConstraintDescriptionEditable { + return self.offset(Float(amount)) + } + internal func offset(amount: CGPoint) -> ConstraintDescriptionEditable { + self.constant = amount + return self + } + internal func offset(amount: CGSize) -> ConstraintDescriptionEditable { + self.constant = amount + return self + } + internal func offset(amount: EdgeInsets) -> ConstraintDescriptionEditable { + self.constant = amount + return self + } + + // MARK: insets + + internal func insets(amount: EdgeInsets) -> ConstraintDescriptionEditable { + self.constant = EdgeInsets(top: amount.top, left: amount.left, bottom: -amount.bottom, right: -amount.right) + return self + } + + // MARK: priority + + internal func priority(priority: Float) -> ConstraintDescriptionFinalizable { + self.priority = priority + return self + } + internal func priority(priority: Double) -> ConstraintDescriptionFinalizable { + return self.priority(Float(priority)) + } + internal func priority(priority: CGFloat) -> ConstraintDescriptionFinalizable { + return self.priority(Float(priority)) + } + func priority(priority: UInt) -> ConstraintDescriptionFinalizable { + return self.priority(Float(priority)) + } + internal func priority(priority: Int) -> ConstraintDescriptionFinalizable { + return self.priority(Float(priority)) + } + internal func priorityRequired() -> ConstraintDescriptionFinalizable { + return self.priority(1000.0) + } + internal func priorityHigh() -> ConstraintDescriptionFinalizable { + return self.priority(750.0) + } + internal func priorityMedium() -> ConstraintDescriptionFinalizable { + #if os(iOS) + return self.priority(500.0) + #else + return self.priority(501.0) + #endif + } + internal func priorityLow() -> ConstraintDescriptionFinalizable { + return self.priority(250.0) + } + + // MARK: Constraint + + internal var constraint: Constraint { + if self.concreteConstraint == nil { + if self.relation == nil { + fatalError("Attempting to create a constraint from a ConstraintDescription before it has been fully chained.") + } + self.concreteConstraint = ConcreteConstraint( + fromItem: self.fromItem, + toItem: self.toItem, + relation: self.relation!, + constant: self.constant, + multiplier: self.multiplier, + priority: self.priority) + } + return self.concreteConstraint! + } + + // MARK: Private + + private let fromItem: ConstraintItem + private var toItem: ConstraintItem { + willSet { + if self.concreteConstraint != nil { + fatalError("Attempting to modify a ConstraintDescription after its constraint has been created.") + } + } + } + private var relation: ConstraintRelation? { + willSet { + if self.concreteConstraint != nil { + fatalError("Attempting to modify a ConstraintDescription after its constraint has been created.") + } + } + } + private var constant: Any = Float(0.0) { + willSet { + if self.concreteConstraint != nil { + fatalError("Attempting to modify a ConstraintDescription after its constraint has been created.") + } + } + } + private var multiplier: Float = 1.0 { + willSet { + if self.concreteConstraint != nil { + fatalError("Attempting to modify a ConstraintDescription after its constraint has been created.") + } + } + } + private var priority: Float = 1000.0 { + willSet { + if self.concreteConstraint != nil { + fatalError("Attempting to modify a ConstraintDescription after its constraint has been created.") + } + } + } + private var concreteConstraint: ConcreteConstraint? = nil + + private func addConstraint(attributes: ConstraintAttributes) -> ConstraintDescription { + if self.relation == nil { + self.fromItem.attributes += attributes + } + return self + } + + private func constrainTo(other: ConstraintItem, relation: ConstraintRelation) -> ConstraintDescription { + if other.attributes != ConstraintAttributes.None { + let toLayoutAttributes = other.attributes.layoutAttributes + if toLayoutAttributes.count > 1 { + let fromLayoutAttributes = self.fromItem.attributes.layoutAttributes + if toLayoutAttributes != fromLayoutAttributes { + NSException(name: "Invalid Constraint", reason: "Cannot constrain to multiple non identical attributes", userInfo: nil).raise() + return self + } + other.attributes = ConstraintAttributes.None + } + } + self.toItem = other + self.relation = relation + return self + } + + private func constrainTo(other: View, relation: ConstraintRelation) -> ConstraintDescription { + return constrainTo(ConstraintItem(object: other, attributes: ConstraintAttributes.None), relation: relation) + } + + #if os(iOS) + + private func constrainTo(other: UILayoutSupport, relation: ConstraintRelation) -> ConstraintDescription { + return constrainTo(ConstraintItem(object: other, attributes: ConstraintAttributes.None), relation: relation) + } + + #endif + + private func constrainTo(other: Float, relation: ConstraintRelation) -> ConstraintDescription { + self.constant = other + return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) + } + + private func constrainTo(other: Double, relation: ConstraintRelation) -> ConstraintDescription { + self.constant = other + return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) + } + + private func constrainTo(other: CGSize, relation: ConstraintRelation) -> ConstraintDescription { + self.constant = other + return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) + } + + private func constrainTo(other: CGPoint, relation: ConstraintRelation) -> ConstraintDescription { + self.constant = other + return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) + } + + private func constrainTo(other: EdgeInsets, relation: ConstraintRelation) -> ConstraintDescription { + self.constant = other + return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) + } +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/ConstraintItem.swift b/Example/Pods/SnapKit/Source/ConstraintItem.swift new file mode 100644 index 0000000..9dcfe11 --- /dev/null +++ b/Example/Pods/SnapKit/Source/ConstraintItem.swift @@ -0,0 +1,71 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to assist in building a constraint +*/ +public class ConstraintItem { + + internal init(object: AnyObject?, attributes: ConstraintAttributes) { + self.object = object + self.attributes = attributes + } + + internal weak var object: AnyObject? + internal var attributes: ConstraintAttributes + + internal var view: View? { + return self.object as? View + } + + #if os(iOS) + + internal var layoutSupport: UILayoutSupport? { + return self.object as? UILayoutSupport + } + + #endif +} + + +internal func ==(left: ConstraintItem, right: ConstraintItem) -> Bool { + if left.object == nil { + return false + } + if right.object == nil { + return false + } + if left.object !== right.object { + return false + } + if left.attributes != right.attributes { + return false + } + return true +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/ConstraintMaker.swift b/Example/Pods/SnapKit/Source/ConstraintMaker.swift new file mode 100644 index 0000000..746c49f --- /dev/null +++ b/Example/Pods/SnapKit/Source/ConstraintMaker.swift @@ -0,0 +1,190 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to make constraints +*/ +public class ConstraintMaker { + + /// left edge + public var left: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Left) } + + /// top edge + public var top: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Top) } + + /// right edge + public var right: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Right) } + + /// bottom edge + public var bottom: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Bottom) } + + /// leading edge + public var leading: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Leading) } + + /// trailing edge + public var trailing: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Trailing) } + + /// width dimension + public var width: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Width) } + + /// height dimension + public var height: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Height) } + + /// centerX dimension + public var centerX: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.CenterX) } + + /// centerY dimension + public var centerY: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.CenterY) } + + /// baseline position + public var baseline: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Baseline) } + + #if os(iOS) + + /// firse baseline position + public var firstBaseline: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.FirstBaseline) } + + /// left margin + public var leftMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.LeftMargin) } + + /// right margin + public var rightMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.RightMargin) } + + /// top margin + public var topMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.TopMargin) } + + /// bottom margin + public var bottomMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.BottomMargin) } + + /// leading margin + public var leadingMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.LeadingMargin) } + + /// trailing margin + public var trailingMargin: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.TrailingMargin) } + + /// centerX within margins + public var centerXWithinMargins: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.CenterXWithinMargins) } + + /// centerY within margins + public var centerYWithinMargins: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.CenterYWithinMargins) } + + #endif + + /// top + left + bottom + right edges + public var edges: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Edges) } + + /// width + height dimensions + public var size: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Size) } + + // centerX + centerY positions + public var center: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Center) } + + #if os(iOS) + + // top + left + bottom + right margins + public var margins: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.Margins) } + + // centerX + centerY within margins + public var centerWithinMargins: ConstraintDescriptionExtendable { return self.makeConstraintDescription(ConstraintAttributes.CenterWithinMargins) } + + #endif + + internal init(view: View) { + self.view = view + } + + internal let view: View + internal var constraintDescriptions = [ConstraintDescription]() + + internal func makeConstraintDescription(attributes: ConstraintAttributes) -> ConstraintDescription { + let item = ConstraintItem(object: self.view, attributes: attributes) + let constraintDescription = ConstraintDescription(fromItem: item) + self.constraintDescriptions.append(constraintDescription) + return constraintDescription + } + + internal class func prepareConstraints(view: View, @noescape closure: (make: ConstraintMaker) -> Void) -> [Constraint] { + let maker = ConstraintMaker(view: view) + closure(make: maker) + + return maker.constraintDescriptions.map { $0.constraint } + } + + internal class func makeConstraints(view: View, @noescape closure: (make: ConstraintMaker) -> Void) { + #if os(iOS) + view.setTranslatesAutoresizingMaskIntoConstraints(false) + #else + view.translatesAutoresizingMaskIntoConstraints = false + #endif + let maker = ConstraintMaker(view: view) + closure(make: maker) + + let constraints = maker.constraintDescriptions.map { $0.constraint as! ConcreteConstraint } + for constraint in constraints { + constraint.installOnView(updateExisting: false) + } + } + + internal class func remakeConstraints(view: View, @noescape closure: (make: ConstraintMaker) -> Void) { + #if os(iOS) + view.setTranslatesAutoresizingMaskIntoConstraints(false) + #else + view.translatesAutoresizingMaskIntoConstraints = false + #endif + let maker = ConstraintMaker(view: view) + closure(make: maker) + + self.removeConstraints(view) + let constraints = maker.constraintDescriptions.map { $0.constraint as! ConcreteConstraint } + for constraint in constraints { + constraint.installOnView(updateExisting: false) + } + } + + internal class func updateConstraints(view: View, @noescape closure: (make: ConstraintMaker) -> Void) { + #if os(iOS) + view.setTranslatesAutoresizingMaskIntoConstraints(false) + #else + view.translatesAutoresizingMaskIntoConstraints = false + #endif + let maker = ConstraintMaker(view: view) + closure(make: maker) + + let constraints = maker.constraintDescriptions.map { $0.constraint as! ConcreteConstraint} + for constraint in constraints { + constraint.installOnView(updateExisting: true) + } + } + + internal class func removeConstraints(view: View) { + for existingLayoutConstraint in view.snp_installedLayoutConstraints { + existingLayoutConstraint.snp_constraint?.uninstall() + } + } +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/ConstraintRelation.swift b/Example/Pods/SnapKit/Source/ConstraintRelation.swift new file mode 100644 index 0000000..0475e02 --- /dev/null +++ b/Example/Pods/SnapKit/Source/ConstraintRelation.swift @@ -0,0 +1,48 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to define `NSLayoutRelation` +*/ +internal enum ConstraintRelation: Int { + case Equal = 1, LessThanOrEqualTo, GreaterThanOrEqualTo + + internal var layoutRelation: NSLayoutRelation { + get { + switch(self) { + case .LessThanOrEqualTo: + return .LessThanOrEqual + case .GreaterThanOrEqualTo: + return .GreaterThanOrEqual + default: + return .Equal + } + } + } +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/Debugging.swift b/Example/Pods/SnapKit/Source/Debugging.swift new file mode 100644 index 0000000..8a96a74 --- /dev/null +++ b/Example/Pods/SnapKit/Source/Debugging.swift @@ -0,0 +1,175 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to allow adding a snp_label to a View for debugging purposes +*/ +public extension View { + + public var snp_label: String? { + get { + return objc_getAssociatedObject(self, &labelKey) as? String + } + set { + objc_setAssociatedObject(self, &labelKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_COPY_NONATOMIC)) + } + } + +} + +/** + Used to allow adding a snp_label to a LayoutConstraint for debugging purposes +*/ +public extension LayoutConstraint { + + public var snp_label: String? { + get { + return objc_getAssociatedObject(self, &labelKey) as? String + } + set { + objc_setAssociatedObject(self, &labelKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_COPY_NONATOMIC)) + } + } + + override public var description: String { + var description = "<" + + description += descriptionForObject(self) + + description += " \(descriptionForObject(self.firstItem))" + if self.firstAttribute != .NotAnAttribute { + description += ".\(self.firstAttribute.snp_description)" + } + + description += " \(self.relation.snp_description)" + + if let secondItem: AnyObject = self.secondItem { + description += " \(descriptionForObject(secondItem))" + } + + if self.secondAttribute != .NotAnAttribute { + description += ".\(self.secondAttribute.snp_description)" + } + + if self.multiplier != 1.0 { + description += " * \(self.multiplier)" + } + + if self.secondAttribute == .NotAnAttribute { + description += " \(self.constant)" + } else { + if self.constant > 0.0 { + description += " + \(self.constant)" + } else if self.constant < 0.0 { + description += " - \(CGFloat.abs(self.constant))" + } + } + + if self.priority != 1000.0 { + description += " ^\(self.priority)" + } + + description += ">" + + return description + } + +} + +private var labelKey = "" + +private func descriptionForObject(object: AnyObject) -> String { + let pointerDescription = NSString(format: "%p", [object]) + if let object = object as? View { + return "<\(object.dynamicType):\(object.snp_label ?? pointerDescription)>" + } else if let object = object as? LayoutConstraint { + return "<\(object.dynamicType):\(object.snp_label ?? pointerDescription)>" + } + return "<\(object.dynamicType):\(pointerDescription)>" +} + +private extension NSLayoutRelation { + + private var snp_description: String { + switch self { + case .Equal: return "==" + case .GreaterThanOrEqual: return ">=" + case .LessThanOrEqual: return "<=" + } + } + +} + +private extension NSLayoutAttribute { + + private var snp_description: String { + #if os(iOS) + switch self { + case .NotAnAttribute: return "notAnAttribute" + case .Top: return "top" + case .Left: return "left" + case .Bottom: return "bottom" + case .Right: return "right" + case .Leading: return "leading" + case .Trailing: return "trailing" + case .Width: return "width" + case .Height: return "height" + case .CenterX: return "centerX" + case .CenterY: return "centerY" + case .Baseline: return "baseline" + case .FirstBaseline: return "firstBaseline" + case .TopMargin: return "topMargin" + case .LeftMargin: return "leftMargin" + case .BottomMargin: return "bottomMargin" + case .RightMargin: return "rightMargin" + case .LeadingMargin: return "leadingMargin" + case .TrailingMargin: return "trailingMargin" + case .CenterXWithinMargins: return "centerXWithinMargins" + case .CenterYWithinMargins: return "centerYWithinMargins" + } + #else + switch self { + case .NotAnAttribute: return "notAnAttribute" + case .Top: return "top" + case .Left: return "left" + case .Bottom: return "bottom" + case .Right: return "right" + case .Leading: return "leading" + case .Trailing: return "trailing" + case .Width: return "width" + case .Height: return "height" + case .CenterX: return "centerX" + case .CenterY: return "centerY" + case .Baseline: return "baseline" + } + #endif + + } + +} diff --git a/Example/Pods/SnapKit/Source/EdgeInsets.swift b/Example/Pods/SnapKit/Source/EdgeInsets.swift new file mode 100644 index 0000000..cd446be --- /dev/null +++ b/Example/Pods/SnapKit/Source/EdgeInsets.swift @@ -0,0 +1,38 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +public typealias EdgeInsets = UIEdgeInsets +public func EdgeInsetsMake(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) -> EdgeInsets { + return EdgeInsets(top: top, left: left, bottom: bottom, right: right) +} +public let EdgeInsetsZero = EdgeInsets(top: 0, left: 0, bottom: 0, right: 0) +#else +import AppKit +public typealias EdgeInsets = NSEdgeInsets +public func EdgeInsetsMake(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) -> EdgeInsets { + return EdgeInsets(top: top, left: left, bottom: bottom, right: right) +} +public let EdgeInsetsZero = EdgeInsets(top: 0, left: 0, bottom: 0, right: 0) +#endif diff --git a/Example/Pods/SnapKit/Source/LayoutConstraint.swift b/Example/Pods/SnapKit/Source/LayoutConstraint.swift new file mode 100644 index 0000000..f6e3e20 --- /dev/null +++ b/Example/Pods/SnapKit/Source/LayoutConstraint.swift @@ -0,0 +1,63 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +#else +import AppKit +#endif + +/** + Used to add extra information to the actual `NSLayoutConstraint`'s that will UIKit/AppKit will utilize +*/ +public class LayoutConstraint: NSLayoutConstraint { + + internal var snp_constraint: Constraint? = nil + +} + +internal func ==(left: LayoutConstraint, right: LayoutConstraint) -> Bool { + if left.firstItem !== right.firstItem { + return false + } + if left.secondItem !== right.secondItem { + return false + } + if left.firstAttribute != right.firstAttribute { + return false + } + if left.secondAttribute != right.secondAttribute { + return false + } + if left.relation != right.relation { + return false + } + if left.priority != right.priority { + return false + } + if left.multiplier != right.multiplier { + return false + } + return true +} + diff --git a/Example/Pods/SnapKit/Source/SnapKit.swift b/Example/Pods/SnapKit/Source/SnapKit.swift new file mode 100644 index 0000000..cf573dc --- /dev/null +++ b/Example/Pods/SnapKit/Source/SnapKit.swift @@ -0,0 +1,40 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +public typealias InterfaceLayoutDirection = UIUserInterfaceLayoutDirection +#else +import AppKit +public typealias InterfaceLayoutDirection = NSUserInterfaceLayoutDirection +#endif + +/** + Used to configure different parts of SnapKit +*/ +public struct Config { + + /// The interface layout direction + public static var interfaceLayoutDirection = InterfaceLayoutDirection.LeftToRight + +} \ No newline at end of file diff --git a/Example/Pods/SnapKit/Source/View+SnapKit.swift b/Example/Pods/SnapKit/Source/View+SnapKit.swift new file mode 100644 index 0000000..5141879 --- /dev/null +++ b/Example/Pods/SnapKit/Source/View+SnapKit.swift @@ -0,0 +1,180 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +public typealias View = UIView +#else +import AppKit +public typealias View = NSView +#endif + +/** + Used to expose public API on views +*/ +public extension View { + + /// left edge + public var snp_left: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Left) } + + /// top edge + public var snp_top: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Top) } + + /// right edge + public var snp_right: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Right) } + + /// bottom edge + public var snp_bottom: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Bottom) } + + /// leading edge + public var snp_leading: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Leading) } + + /// trailing edge + public var snp_trailing: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Trailing) } + + /// width dimension + public var snp_width: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Width) } + + /// height dimension + public var snp_height: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Height) } + + /// centerX position + public var snp_centerX: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.CenterX) } + + /// centerY position + public var snp_centerY: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.CenterY) } + + /// baseline position + public var snp_baseline: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Baseline) } + + #if os(iOS) + + /// first baseline position + public var snp_firstBaseline: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.FirstBaseline) } + + /// left margin + public var snp_leftMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.LeftMargin) } + + /// right margin + public var snp_rightMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.RightMargin) } + + /// top margin + public var snp_topMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.TopMargin) } + + /// bottom margin + public var snp_bottomMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.BottomMargin) } + + /// leading margin + public var snp_leadingMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.LeadingMargin) } + + /// trailing margin + public var snp_trailingMargin: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.TrailingMargin) } + + /// centerX within margins + public var snp_centerXWithinMargins: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.CenterXWithinMargins) } + + /// centerY within margins + public var snp_centerYWithinMargins: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.CenterYWithinMargins) } + + #endif + + // top + left + bottom + right edges + public var snp_edges: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Edges) } + + // width + height dimensions + public var snp_size: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Size) } + + // centerX + centerY positions + public var snp_center: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Center) } + + #if os(iOS) + + // top + left + bottom + right margins + public var snp_margins: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.Margins) } + + // centerX + centerY within margins + public var snp_centerWithinMargins: ConstraintItem { return ConstraintItem(object: self, attributes: ConstraintAttributes.CenterWithinMargins) } + + #endif + + /** + Prepares constraints with a `ConstraintMaker` and returns the made constraints but does not install them. + + :param: closure that will be passed the `ConstraintMaker` to make the constraints with + + :returns: the constraints made + */ + public func snp_prepareConstraints(@noescape closure: (make: ConstraintMaker) -> Void) -> [Constraint] { + return ConstraintMaker.prepareConstraints(self, closure: closure) + } + + /** + Makes constraints with a `ConstraintMaker` and installs them along side any previous made constraints. + + :param: closure that will be passed the `ConstraintMaker` to make the constraints with + */ + public func snp_makeConstraints(@noescape closure: (make: ConstraintMaker) -> Void) -> Void { + ConstraintMaker.makeConstraints(self, closure: closure) + } + + /** + Updates constraints with a `ConstraintMaker` that will replace existing constraints that match and install new ones. + + For constraints to match only the constant can be updated. + + :param: closure that will be passed the `ConstraintMaker` to update the constraints with + */ + public func snp_updateConstraints(@noescape closure: (make: ConstraintMaker) -> Void) -> Void { + ConstraintMaker.updateConstraints(self, closure: closure) + } + + /** + Remakes constraints with a `ConstraintMaker` that will first remove all previously made constraints and make and install new ones. + + :param: closure that will be passed the `ConstraintMaker` to remake the constraints with + */ + public func snp_remakeConstraints(@noescape closure: (make: ConstraintMaker) -> Void) -> Void { + ConstraintMaker.remakeConstraints(self, closure: closure) + } + + /** + Removes all previously made constraints. + */ + public func snp_removeConstraints() { + ConstraintMaker.removeConstraints(self) + } + + internal var snp_installedLayoutConstraints: [LayoutConstraint] { + get { + if let constraints = objc_getAssociatedObject(self, &installedLayoutConstraintsKey) as? [LayoutConstraint] { + return constraints + } + return [] + } + set { + objc_setAssociatedObject(self, &installedLayoutConstraintsKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)) + } + } +} + +private var installedLayoutConstraintsKey = "" diff --git a/Example/Pods/SnapKit/Source/ViewController+SnapKit.swift b/Example/Pods/SnapKit/Source/ViewController+SnapKit.swift new file mode 100644 index 0000000..d7d2bef --- /dev/null +++ b/Example/Pods/SnapKit/Source/ViewController+SnapKit.swift @@ -0,0 +1,46 @@ +// +// SnapKit +// +// Copyright (c) 2011-2015 SnapKit Team - https://github.com/SnapKit +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if os(iOS) +import UIKit +public typealias ViewController = UIViewController + +/** + Used to expose public API on view controllers +*/ +public extension UIViewController { + + /// top layout guide top + public var snp_topLayoutGuideTop: ConstraintItem { return ConstraintItem(object: self.topLayoutGuide, attributes: ConstraintAttributes.Top) } + + /// top layout guide bottom + public var snp_topLayoutGuideBottom: ConstraintItem { return ConstraintItem(object: self.topLayoutGuide, attributes: ConstraintAttributes.Bottom) } + + /// bottom layout guide top + public var snp_bottomLayoutGuideTop: ConstraintItem { return ConstraintItem(object: self.bottomLayoutGuide, attributes: ConstraintAttributes.Top) } + + /// bottom layout guide bottom + public var snp_bottomLayoutGuideBottom: ConstraintItem { return ConstraintItem(object: self.bottomLayoutGuide, attributes: ConstraintAttributes.Bottom) } + +} +#endif diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig b/Example/Pods/Target Support Files/Expecta/Expecta-Private.xcconfig similarity index 51% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig rename to Example/Pods/Target Support Files/Expecta/Expecta-Private.xcconfig index 4a1961b..b3af4ff 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig +++ b/Example/Pods/Target Support Files/Expecta/Expecta-Private.xcconfig @@ -1,7 +1,7 @@ -#include "Pods-JazzHandsTests-Expecta.xcconfig" -FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_EXPECTA_FRAMEWORK_SEARCH_PATHS} +#include "Expecta.xcconfig" +FRAMEWORK_SEARCH_PATHS = ${EXPECTA_FRAMEWORK_SEARCH_PATHS} GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Expecta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_EXPECTA_OTHER_LDFLAGS} -ObjC +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Expecta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${EXPECTA_OTHER_LDFLAGS} PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Expecta/Expecta-dummy.m b/Example/Pods/Target Support Files/Expecta/Expecta-dummy.m new file mode 100644 index 0000000..c4c252a --- /dev/null +++ b/Example/Pods/Target Support Files/Expecta/Expecta-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Expecta : NSObject +@end +@implementation PodsDummy_Expecta +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch b/Example/Pods/Target Support Files/Expecta/Expecta-prefix.pch similarity index 52% rename from Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch rename to Example/Pods/Target Support Files/Expecta/Expecta-prefix.pch index 7f3adb4..aa992a4 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch +++ b/Example/Pods/Target Support Files/Expecta/Expecta-prefix.pch @@ -2,4 +2,3 @@ #import #endif -#import "Pods-JazzHandsDemo-environment.h" diff --git a/Example/Pods/Target Support Files/Expecta/Expecta.xcconfig b/Example/Pods/Target Support Files/Expecta/Expecta.xcconfig new file mode 100644 index 0000000..49dbb3e --- /dev/null +++ b/Example/Pods/Target Support Files/Expecta/Expecta.xcconfig @@ -0,0 +1,2 @@ +EXPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +EXPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig b/Example/Pods/Target Support Files/JazzHands/JazzHands-Private.xcconfig similarity index 59% rename from Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig rename to Example/Pods/Target Support Files/JazzHands/JazzHands-Private.xcconfig index 09ae130..faf9d67 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig +++ b/Example/Pods/Target Support Files/JazzHands/JazzHands-Private.xcconfig @@ -1,6 +1,6 @@ -#include "Pods-JazzHandsDemo-JazzHands.xcconfig" +#include "JazzHands.xcconfig" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = ${PODS_JAZZHANDSDEMO_JAZZHANDS_OTHER_LDFLAGS} -ObjC +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${JAZZHANDS_OTHER_LDFLAGS} PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/JazzHands/JazzHands-dummy.m b/Example/Pods/Target Support Files/JazzHands/JazzHands-dummy.m new file mode 100644 index 0000000..b9e0e1b --- /dev/null +++ b/Example/Pods/Target Support Files/JazzHands/JazzHands-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_JazzHands : NSObject +@end +@implementation PodsDummy_JazzHands +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch b/Example/Pods/Target Support Files/JazzHands/JazzHands-prefix.pch similarity index 52% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch rename to Example/Pods/Target Support Files/JazzHands/JazzHands-prefix.pch index 62ca51c..aa992a4 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch +++ b/Example/Pods/Target Support Files/JazzHands/JazzHands-prefix.pch @@ -2,4 +2,3 @@ #import #endif -#import "Pods-JazzHandsTests-environment.h" diff --git a/Example/Pods/Target Support Files/JazzHands/JazzHands.xcconfig b/Example/Pods/Target Support Files/JazzHands/JazzHands.xcconfig new file mode 100644 index 0000000..d976122 --- /dev/null +++ b/Example/Pods/Target Support Files/JazzHands/JazzHands.xcconfig @@ -0,0 +1 @@ +JAZZHANDS_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Masonry/Masonry-Private.xcconfig b/Example/Pods/Target Support Files/Masonry/Masonry-Private.xcconfig new file mode 100644 index 0000000..7c97ac9 --- /dev/null +++ b/Example/Pods/Target Support Files/Masonry/Masonry-Private.xcconfig @@ -0,0 +1,6 @@ +#include "Masonry.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Masonry" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${MASONRY_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Masonry/Masonry-dummy.m b/Example/Pods/Target Support Files/Masonry/Masonry-dummy.m new file mode 100644 index 0000000..04001b1 --- /dev/null +++ b/Example/Pods/Target Support Files/Masonry/Masonry-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Masonry : NSObject +@end +@implementation PodsDummy_Masonry +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch b/Example/Pods/Target Support Files/Masonry/Masonry-prefix.pch similarity index 52% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch rename to Example/Pods/Target Support Files/Masonry/Masonry-prefix.pch index 62ca51c..aa992a4 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch +++ b/Example/Pods/Target Support Files/Masonry/Masonry-prefix.pch @@ -2,4 +2,3 @@ #import #endif -#import "Pods-JazzHandsTests-environment.h" diff --git a/Example/Pods/Target Support Files/Masonry/Masonry.xcconfig b/Example/Pods/Target Support Files/Masonry/Masonry.xcconfig new file mode 100644 index 0000000..1dec668 --- /dev/null +++ b/Example/Pods/Target Support Files/Masonry/Masonry.xcconfig @@ -0,0 +1 @@ +MASONRY_OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-dummy.m deleted file mode 100644 index 26de6fd..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsDemo_JazzHands : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsDemo_JazzHands -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands.xcconfig deleted file mode 100644 index 3723825..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands.xcconfig +++ /dev/null @@ -1 +0,0 @@ -PODS_JAZZHANDSDEMO_JAZZHANDS_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.markdown index f835b56..c005a66 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.markdown @@ -24,4 +24,26 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## Masonry + +Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.plist index b6fdbe7..a12bb13 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-acknowledgements.plist @@ -40,6 +40,32 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Title + Masonry + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h deleted file mode 100644 index b058271..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h +++ /dev/null @@ -1,14 +0,0 @@ - -// To check if a library is compiled with CocoaPods you -// can use the `COCOAPODS` macro definition which is -// defined in the xcconfigs so it is available in -// headers also when they are imported in the client -// project. - - -// JazzHands -#define COCOAPODS_POD_AVAILABLE_JazzHands -#define COCOAPODS_VERSION_MAJOR_JazzHands 2 -#define COCOAPODS_VERSION_MINOR_JazzHands 0 -#define COCOAPODS_VERSION_PATCH_JazzHands 2 - diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig index 88216ea..744d05a 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig @@ -1,6 +1,5 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsDemo-JazzHands" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"JazzHands" -l"Masonry" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig index 88216ea..744d05a 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig @@ -1,6 +1,5 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsDemo-JazzHands" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"JazzHands" -l"Masonry" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m deleted file mode 100644 index 9e4819f..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsTests_Expecta : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsTests_Expecta -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig deleted file mode 100644 index 30e681d..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -PODS_JAZZHANDSTESTS_EXPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" -PODS_JAZZHANDSTESTS_EXPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig deleted file mode 100644 index a1d40b6..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -#include "Pods-JazzHandsTests-JazzHands.xcconfig" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_JAZZHANDS_OTHER_LDFLAGS} -ObjC -PODS_ROOT = ${SRCROOT} -SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m deleted file mode 100644 index 27b982a..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsTests_JazzHands : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsTests_JazzHands -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig deleted file mode 100644 index 21d9097..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig +++ /dev/null @@ -1 +0,0 @@ -PODS_JAZZHANDSTESTS_JAZZHANDS_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m deleted file mode 100644 index 69c8b1e..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsTests_Specta : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsTests_Specta -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig deleted file mode 100644 index 64b4636..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -PODS_JAZZHANDSTESTS_SPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" -PODS_JAZZHANDSTESTS_SPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown index 727efeb..3bf8263 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown @@ -1,9 +1,33 @@ # Acknowledgements This application makes use of the following third party libraries: -## Expecta +## JazzHands -Copyright (c) 2011-2015 Specta Team - https://github.com/specta +Copyright (c) 2015 IFTTT Inc + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +## Masonry + +Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23,29 +47,27 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## Expecta -## JazzHands - -Copyright (c) 2015 IFTTT Inc +Copyright (c) 2011-2015 Specta Team - https://github.com/specta -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ## Specta diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist index 75ed241..e5aa0ee 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist @@ -14,7 +14,35 @@ FooterText - Copyright (c) 2011-2015 Specta Team - https://github.com/specta + Copyright (c) 2015 IFTTT Inc + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Title + JazzHands + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32,38 +60,36 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - +THE SOFTWARE. Title - Expecta + Masonry Type PSGroupSpecifier FooterText - Copyright (c) 2015 IFTTT Inc + Copyright (c) 2011-2015 Specta Team - https://github.com/specta -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. Title - JazzHands + Expecta Type PSGroupSpecifier diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h deleted file mode 100644 index 7e5d1ed..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h +++ /dev/null @@ -1,26 +0,0 @@ - -// To check if a library is compiled with CocoaPods you -// can use the `COCOAPODS` macro definition which is -// defined in the xcconfigs so it is available in -// headers also when they are imported in the client -// project. - - -// Expecta -#define COCOAPODS_POD_AVAILABLE_Expecta -#define COCOAPODS_VERSION_MAJOR_Expecta 1 -#define COCOAPODS_VERSION_MINOR_Expecta 0 -#define COCOAPODS_VERSION_PATCH_Expecta 0 - -// JazzHands -#define COCOAPODS_POD_AVAILABLE_JazzHands -#define COCOAPODS_VERSION_MAJOR_JazzHands 2 -#define COCOAPODS_VERSION_MINOR_JazzHands 0 -#define COCOAPODS_VERSION_PATCH_JazzHands 2 - -// Specta -#define COCOAPODS_POD_AVAILABLE_Specta -#define COCOAPODS_VERSION_MAJOR_Specta 1 -#define COCOAPODS_VERSION_MINOR_Specta 0 -#define COCOAPODS_VERSION_PATCH_Specta 2 - diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig index 2d8d55f..4af31ee 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig @@ -1,7 +1,6 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-Expecta" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" -OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Expecta" -l"JazzHands" -l"Masonry" -l"Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig index 2d8d55f..4af31ee 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig @@ -1,7 +1,6 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-Expecta" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" -OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Expecta" -l"JazzHands" -l"Masonry" -l"Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig b/Example/Pods/Target Support Files/Specta/Specta-Private.xcconfig similarity index 51% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig rename to Example/Pods/Target Support Files/Specta/Specta-Private.xcconfig index bfffd07..20d5571 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig +++ b/Example/Pods/Target Support Files/Specta/Specta-Private.xcconfig @@ -1,7 +1,7 @@ -#include "Pods-JazzHandsTests-Specta.xcconfig" -FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_SPECTA_FRAMEWORK_SEARCH_PATHS} +#include "Specta.xcconfig" +FRAMEWORK_SEARCH_PATHS = ${SPECTA_FRAMEWORK_SEARCH_PATHS} GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Specta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" -OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_SPECTA_OTHER_LDFLAGS} -ObjC +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Specta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${SPECTA_OTHER_LDFLAGS} PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Specta/Specta-dummy.m b/Example/Pods/Target Support Files/Specta/Specta-dummy.m new file mode 100644 index 0000000..fdae423 --- /dev/null +++ b/Example/Pods/Target Support Files/Specta/Specta-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Specta : NSObject +@end +@implementation PodsDummy_Specta +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch b/Example/Pods/Target Support Files/Specta/Specta-prefix.pch similarity index 52% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch rename to Example/Pods/Target Support Files/Specta/Specta-prefix.pch index 62ca51c..aa992a4 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch +++ b/Example/Pods/Target Support Files/Specta/Specta-prefix.pch @@ -2,4 +2,3 @@ #import #endif -#import "Pods-JazzHandsTests-environment.h" diff --git a/Example/Pods/Target Support Files/Specta/Specta.xcconfig b/Example/Pods/Target Support Files/Specta/Specta.xcconfig new file mode 100644 index 0000000..3350c61 --- /dev/null +++ b/Example/Pods/Target Support Files/Specta/Specta.xcconfig @@ -0,0 +1,2 @@ +SPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +SPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/JazzHands.podspec b/JazzHands.podspec index 6ca57c9..8cf239f 100644 --- a/JazzHands.podspec +++ b/JazzHands.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'JazzHands' - s.version = '2.0.2' + s.version = '2.0.3' s.summary = 'Simple keyframe animations for scrolling intros.' s.homepage = 'https://github.com/IFTTT/JazzHands' s.author = { diff --git a/JazzHands/IFTTTAnimatedPagingScrollViewController.h b/JazzHands/IFTTTAnimatedPagingScrollViewController.h index 21addd2..4608c6a 100644 --- a/JazzHands/IFTTTAnimatedPagingScrollViewController.h +++ b/JazzHands/IFTTTAnimatedPagingScrollViewController.h @@ -7,6 +7,7 @@ // #import +#import "IFTTTScrollViewPageConstraintAnimation.h" @class IFTTTAnimator; @interface IFTTTAnimatedPagingScrollViewController : UIViewController @@ -14,16 +15,22 @@ @property (nonatomic, strong) IFTTTAnimator *animator; @property (nonatomic, strong) UIScrollView *scrollView; @property (nonatomic, strong) UIView *contentView; -@property (nonatomic, assign) NSUInteger numberOfPages; +- (NSUInteger)numberOfPages; - (CGFloat)pageWidth; - (CGFloat)pageOffset; - (void)animateCurrentFrame; - (CGFloat)centerXMultiplierForPage:(CGFloat)page; +- (CGFloat)leftMultiplierForPage:(CGFloat)page; +- (CGFloat)rightMultiplierForPage:(CGFloat)page; +- (CGFloat)multiplierForPage:(CGFloat)page withAttribute:(IFTTTHorizontalPositionAttribute)attribute; - (void)keepView:(UIView *)view onPage:(CGFloat)page; - (void)keepView:(UIView *)view onPages:(NSArray *)pages; - (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times; +- (void)keepView:(UIView *)view onPage:(CGFloat)page withAttribute:(IFTTTHorizontalPositionAttribute)attribute; +- (void)keepView:(UIView *)view onPages:(NSArray *)pages withAttribute:(IFTTTHorizontalPositionAttribute)attribute; +- (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times withAttribute:(IFTTTHorizontalPositionAttribute)attribute; @end diff --git a/JazzHands/IFTTTAnimatedPagingScrollViewController.m b/JazzHands/IFTTTAnimatedPagingScrollViewController.m index c0b26bc..68f27ac 100644 --- a/JazzHands/IFTTTAnimatedPagingScrollViewController.m +++ b/JazzHands/IFTTTAnimatedPagingScrollViewController.m @@ -48,7 +48,11 @@ - (void)commonInit _animator = [IFTTTAnimator new]; _scrollView = [UIScrollView new]; _contentView = [UIView new]; - _numberOfPages = 2; +} + +- (NSUInteger)numberOfPages +{ + return 2; } - (void)viewDidLoad @@ -92,6 +96,8 @@ - (void)viewDidAppear:(BOOL)animated - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + CGFloat newPageWidth = size.width; for (IFTTTScrollViewPageConstraintAnimation *animation in self.scrollViewPageConstraintAnimations) { @@ -165,22 +171,22 @@ - (CGFloat)pageOffset return currentOffset; } -- (CGFloat)centerXMultiplierForPage:(CGFloat)page -{ - return (1.f + (2.f * page)) / ((CGFloat)self.numberOfPages); -} - #pragma mark - Keep View On Page Animations - (void)keepView:(UIView *)view onPage:(CGFloat)page +{ + [self keepView:view onPage:page withAttribute:IFTTTHorizontalPositionAttributeCenterX]; +} + +- (void)keepView:(UIView *)view onPage:(CGFloat)page withAttribute:(IFTTTHorizontalPositionAttribute)attribute { view.translatesAutoresizingMaskIntoConstraints = NO; [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:view - attribute:NSLayoutAttributeCenterX + attribute:[self layoutAttributeFromPositionAttribute:attribute] relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterX - multiplier:[self centerXMultiplierForPage:page] + multiplier:[self multiplierForPage:page withAttribute:attribute] constant:0.f]]; } @@ -190,23 +196,34 @@ - (void)keepView:(UIView *)view onPages:(NSArray *)pages } - (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times +{ + [self keepView:view onPages:pages atTimes:times withAttribute:IFTTTHorizontalPositionAttributeCenterX]; +} + +- (void)keepView:(UIView *)view onPages:(NSArray *)pages withAttribute:(IFTTTHorizontalPositionAttribute)attribute +{ + [self keepView:view onPages:pages atTimes:pages withAttribute:attribute]; +} + +- (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times withAttribute:(IFTTTHorizontalPositionAttribute)attribute { NSAssert((pages.count == times.count), @"Make sure you set a time for each position."); view.translatesAutoresizingMaskIntoConstraints = NO; - + NSLayoutConstraint *xPositionConstraint = [NSLayoutConstraint constraintWithItem:view - attribute:NSLayoutAttributeCenterX + attribute:[self layoutAttributeFromPositionAttribute:attribute] relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeLeft multiplier:1.f constant:0.f]; [self.contentView addConstraint:xPositionConstraint]; - + // TODO: set constraint type for animation initializer IFTTTScrollViewPageConstraintAnimation *xPositionAnimation = [IFTTTScrollViewPageConstraintAnimation animationWithSuperview:self.contentView constraint:xPositionConstraint - pageWidth:self.pageWidth]; + pageWidth:self.pageWidth + attribute:attribute]; for (NSUInteger i = 0; i < pages.count; i++) { [xPositionAnimation addKeyframeForTime:(CGFloat)[(NSNumber *)times[i] floatValue] @@ -217,4 +234,55 @@ - (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)time [self.scrollViewPageConstraintAnimations addObject:xPositionAnimation]; } +- (CGFloat)centerXMultiplierForPage:(CGFloat)page +{ + return [self multiplierForPage:page withAttribute:IFTTTHorizontalPositionAttributeCenterX]; +} + +- (CGFloat)leftMultiplierForPage:(CGFloat)page +{ + return [self multiplierForPage:page withAttribute:IFTTTHorizontalPositionAttributeLeft]; +} + +- (CGFloat)rightMultiplierForPage:(CGFloat)page +{ + return [self multiplierForPage:page withAttribute:IFTTTHorizontalPositionAttributeRight]; +} + +- (CGFloat)multiplierForPage:(CGFloat)page withAttribute:(IFTTTHorizontalPositionAttribute)attribute +{ + CGFloat offset; + + switch (attribute) { + case IFTTTHorizontalPositionAttributeCenterX: + offset = 0.5; + break; + case IFTTTHorizontalPositionAttributeLeft: + offset = 0; + break; + case IFTTTHorizontalPositionAttributeRight: + offset = 1; + break; + } + + return 2.f * (offset + page) / self.numberOfPages; +} + +- (NSLayoutAttribute)layoutAttributeFromPositionAttribute:(IFTTTHorizontalPositionAttribute)attribute +{ + NSLayoutAttribute layoutAttribute; + switch (attribute) { + case IFTTTHorizontalPositionAttributeCenterX: + layoutAttribute = NSLayoutAttributeCenterX; + break; + case IFTTTHorizontalPositionAttributeLeft: + layoutAttribute = NSLayoutAttributeLeft; + break; + case IFTTTHorizontalPositionAttributeRight: + layoutAttribute = NSLayoutAttributeRight; + break; + } + return layoutAttribute; +} + @end diff --git a/JazzHands/IFTTTColorAnimation.h b/JazzHands/IFTTTBackgroundColorAnimation.h similarity index 74% rename from JazzHands/IFTTTColorAnimation.h rename to JazzHands/IFTTTBackgroundColorAnimation.h index 34533fd..14ff1e8 100644 --- a/JazzHands/IFTTTColorAnimation.h +++ b/JazzHands/IFTTTBackgroundColorAnimation.h @@ -1,5 +1,5 @@ // -// IFTTTColorAnimation.h +// IFTTTBackgroundColorAnimation.h // IFTTT // // Created by Max Meyers on 10/10/13. @@ -8,7 +8,7 @@ #import "IFTTTViewAnimation.h" -@interface IFTTTColorAnimation : IFTTTViewAnimation +@interface IFTTTBackgroundColorAnimation : IFTTTViewAnimation - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color; - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTColorAnimation.m b/JazzHands/IFTTTBackgroundColorAnimation.m similarity index 86% rename from JazzHands/IFTTTColorAnimation.m rename to JazzHands/IFTTTBackgroundColorAnimation.m index 62d69c4..4eadc74 100644 --- a/JazzHands/IFTTTColorAnimation.m +++ b/JazzHands/IFTTTBackgroundColorAnimation.m @@ -1,14 +1,14 @@ // -// IFTTTColorAnimation.m +// IFTTTBackgroundColorAnimation.m // IFTTT // // Created by Max Meyers on 10/10/13. // Copyright (c) 2013 IFTTT Inc. All rights reserved. // -#import "IFTTTColorAnimation.h" +#import "IFTTTBackgroundColorAnimation.h" -@implementation IFTTTColorAnimation +@implementation IFTTTBackgroundColorAnimation - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color { diff --git a/JazzHands/IFTTTConstraintConstantAnimation.h b/JazzHands/IFTTTConstraintConstantAnimation.h index d2d5e0f..688fbac 100644 --- a/JazzHands/IFTTTConstraintConstantAnimation.h +++ b/JazzHands/IFTTTConstraintConstantAnimation.h @@ -10,7 +10,7 @@ @interface IFTTTConstraintConstantAnimation : IFTTTAnimation -- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint; + (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint; - (void)addKeyframeForTime:(CGFloat)time constant:(CGFloat)constant; - (void)addKeyframeForTime:(CGFloat)time constant:(CGFloat)constant withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTConstraintMultiplierAnimation.h b/JazzHands/IFTTTConstraintMultiplierAnimation.h index ddf057c..5a7a4de 100644 --- a/JazzHands/IFTTTConstraintMultiplierAnimation.h +++ b/JazzHands/IFTTTConstraintMultiplierAnimation.h @@ -20,7 +20,7 @@ typedef NS_ENUM(NSUInteger, IFTTTLayoutAttribute) { @interface IFTTTConstraintMultiplierAnimation : IFTTTAnimation - (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint attribute:(IFTTTLayoutAttribute)attribute referenceView:(UIView *)referenceView; -- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint attribute:(IFTTTLayoutAttribute)attribute referenceView:(UIView *)referenceView constant:(CGFloat)constant NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint attribute:(IFTTTLayoutAttribute)attribute referenceView:(UIView *)referenceView constant:(CGFloat)constant; + (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint attribute:(IFTTTLayoutAttribute)attribute referenceView:(UIView *)referenceView; + (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint attribute:(IFTTTLayoutAttribute)attribute referenceView:(UIView *)referenceView constant:(CGFloat)constant; - (void)addKeyframeForTime:(CGFloat)time multiplier:(CGFloat)multiplier; diff --git a/JazzHands/IFTTTJazzHands.h b/JazzHands/IFTTTJazzHands.h index a27cfc4..1a0fb28 100644 --- a/JazzHands/IFTTTJazzHands.h +++ b/JazzHands/IFTTTJazzHands.h @@ -17,7 +17,6 @@ #import "IFTTTFilmstrip.h" #import "IFTTTViewAnimation.h" #import "IFTTTShapeLayerAnimation.h" -#import "IFTTTLabelAnimation.h" #import "IFTTTAnimatedScrollViewController.h" #import "IFTTTAnimatedPagingScrollViewController.h" @@ -26,14 +25,15 @@ #import "IFTTTCornerRadiusAnimation.h" #import "IFTTTFrameAnimation.h" #import "IFTTTHideAnimation.h" -#import "IFTTTColorAnimation.h" +#import "IFTTTBackgroundColorAnimation.h" #import "IFTTTRotationAnimation.h" #import "IFTTTScaleAnimation.h" #import "IFTTTTranslationAnimation.h" #import "IFTTTTransform3DAnimation.h" -#import "IFTTTStrokeStartAnimation.h" -#import "IFTTTStrokeEndAnimation.h" -#import "IFTTTFillColorAnimation.h" +#import "IFTTTLayerStrokeStartAnimation.h" +#import "IFTTTLayerStrokeEndAnimation.h" +#import "IFTTTLayerFillColorAnimation.h" +#import "IFTTTPathPositionAnimation.h" #import "IFTTTTextColorAnimation.h" #import "IFTTTConstraintConstantAnimation.h" #import "IFTTTScrollViewPageConstraintAnimation.h" diff --git a/JazzHands/IFTTTLabelAnimation.h b/JazzHands/IFTTTLabelAnimation.h deleted file mode 100644 index 7ec2ff4..0000000 --- a/JazzHands/IFTTTLabelAnimation.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// IFTTTLabelAnimation.h -// JazzHands -// -// Created by Laura Skelton on 6/18/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTAnimation.h" - -@interface IFTTTLabelAnimation : IFTTTAnimation - -@property (nonatomic, strong, readonly) UILabel *label; - -- (instancetype)initWithLabel:(UILabel *)label NS_DESIGNATED_INITIALIZER; -+ (instancetype)animationWithLabel:(UILabel *)label; - -@end diff --git a/JazzHands/IFTTTLabelAnimation.m b/JazzHands/IFTTTLabelAnimation.m deleted file mode 100644 index 3c13555..0000000 --- a/JazzHands/IFTTTLabelAnimation.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// IFTTTLabelAnimation.m -// JazzHands -// -// Created by Laura Skelton on 6/18/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTLabelAnimation.h" - -@interface IFTTTLabelAnimation () - -@property (nonatomic, strong, readwrite) UILabel *label; - -@end - -@implementation IFTTTLabelAnimation - -- (instancetype)initWithLabel:(UILabel *)label -{ - if ((self = [super init])) { - _label = label; - } - return self; -} - -+ (instancetype)animationWithLabel:(UILabel *)label -{ - return [[self alloc] initWithLabel:label]; -} - -@end diff --git a/JazzHands/IFTTTFillColorAnimation.h b/JazzHands/IFTTTLayerFillColorAnimation.h similarity index 74% rename from JazzHands/IFTTTFillColorAnimation.h rename to JazzHands/IFTTTLayerFillColorAnimation.h index 8b36890..b0585db 100644 --- a/JazzHands/IFTTTFillColorAnimation.h +++ b/JazzHands/IFTTTLayerFillColorAnimation.h @@ -1,5 +1,5 @@ // -// IFTTTFillColorAnimation.h +// IFTTTLayerFillColorAnimation.h // JazzHands // // Created by Pierluigi D'Andrea on 07/05/15. @@ -8,7 +8,7 @@ #import "IFTTTShapeLayerAnimation.h" -@interface IFTTTFillColorAnimation : IFTTTShapeLayerAnimation +@interface IFTTTLayerFillColorAnimation : IFTTTShapeLayerAnimation - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color; - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTFillColorAnimation.m b/JazzHands/IFTTTLayerFillColorAnimation.m similarity index 87% rename from JazzHands/IFTTTFillColorAnimation.m rename to JazzHands/IFTTTLayerFillColorAnimation.m index b0b8aaa..71485c0 100644 --- a/JazzHands/IFTTTFillColorAnimation.m +++ b/JazzHands/IFTTTLayerFillColorAnimation.m @@ -1,14 +1,14 @@ // -// IFTTTFillColorAnimation.m +// IFTTTLayerFillColorAnimation.m // JazzHands // // Created by Pierluigi D'Andrea on 07/05/15. // Copyright (c) 2015 IFTTT Inc. All rights reserved. // -#import "IFTTTFillColorAnimation.h" +#import "IFTTTLayerFillColorAnimation.h" -@implementation IFTTTFillColorAnimation +@implementation IFTTTLayerFillColorAnimation - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color { diff --git a/JazzHands/IFTTTStrokeEndAnimation.h b/JazzHands/IFTTTLayerStrokeEndAnimation.h similarity index 75% rename from JazzHands/IFTTTStrokeEndAnimation.h rename to JazzHands/IFTTTLayerStrokeEndAnimation.h index 10c2aad..340c411 100644 --- a/JazzHands/IFTTTStrokeEndAnimation.h +++ b/JazzHands/IFTTTLayerStrokeEndAnimation.h @@ -1,5 +1,5 @@ // -// IFTTTStrokeEndAnimation.h +// IFTTTLayerStrokeEndAnimation.h // JazzHands // // Created by Pierluigi D'Andrea on 06/05/15. @@ -8,7 +8,7 @@ #import "IFTTTShapeLayerAnimation.h" -@interface IFTTTStrokeEndAnimation : IFTTTShapeLayerAnimation +@interface IFTTTLayerStrokeEndAnimation : IFTTTShapeLayerAnimation - (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd; - (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTLayerStrokeEndAnimation.m b/JazzHands/IFTTTLayerStrokeEndAnimation.m new file mode 100644 index 0000000..d1f9868 --- /dev/null +++ b/JazzHands/IFTTTLayerStrokeEndAnimation.m @@ -0,0 +1,84 @@ +// +// IFTTTLayerStrokeEndAnimation.m +// JazzHands +// +// Created by Pierluigi D'Andrea on 06/05/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTLayerStrokeEndAnimation.h" + +@interface IFTTTLayerStrokeEndAnimation () + +@property (nonatomic, strong) NSString *animationKey; + +@end + +@implementation IFTTTLayerStrokeEndAnimation + +- (instancetype)initWithLayer:(CAShapeLayer *)layer +{ + if ((self = [super initWithLayer:layer])) { + _animationKey = @"RAZStrokeEnd"; + + [self createBasicAnimation]; + + // CAAnimations are lost when application enters the background, so re-add them + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(createBasicAnimation) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd +{ + if (![self validStrokeEnd:strokeEnd]) return; + [self addKeyframeForTime:time value:@(strokeEnd)]; +} + +- (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd withEasingFunction:(IFTTTEasingFunction)easingFunction +{ + if (![self validStrokeEnd:strokeEnd]) return; + [self addKeyframeForTime:time value:@(strokeEnd) withEasingFunction:easingFunction]; +} + +- (BOOL)validStrokeEnd:(CGFloat)strokeEnd +{ + NSAssert((strokeEnd >= 0.f) && (strokeEnd <= 1.f), @"Stroke End values must be between zero and one."); + if ((strokeEnd < 0.f) || (strokeEnd > 1.f)) return NO; + return YES; +} + +- (void)animate:(CGFloat)time +{ + if (!self.hasKeyframes) return; + self.layer.timeOffset = (CFTimeInterval)[(NSNumber *)[self valueAtTime:time] doubleValue]; +} + +- (void)createBasicAnimation +{ + // Set up CABasicAnimation to animate the stroke end + [self.layer addAnimation:[self strokeEndAnimation] forKey:self.animationKey]; + self.layer.speed = 0; + self.layer.timeOffset = 0; +} + +- (CABasicAnimation *)strokeEndAnimation +{ + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; + animation.duration = 1; + animation.fromValue = @0; + animation.toValue = @1; + animation.fillMode = kCAFillModeBoth; + animation.removedOnCompletion = false; + return animation; +} + +@end diff --git a/JazzHands/IFTTTStrokeStartAnimation.h b/JazzHands/IFTTTLayerStrokeStartAnimation.h similarity index 75% rename from JazzHands/IFTTTStrokeStartAnimation.h rename to JazzHands/IFTTTLayerStrokeStartAnimation.h index bc0424c..8409501 100644 --- a/JazzHands/IFTTTStrokeStartAnimation.h +++ b/JazzHands/IFTTTLayerStrokeStartAnimation.h @@ -1,5 +1,5 @@ // -// IFTTTStrokeStartAnimation.h +// IFTTTLayerStrokeStartAnimation.h // JazzHands // // Created by Pierluigi D'Andrea on 06/05/15. @@ -8,7 +8,7 @@ #import "IFTTTShapeLayerAnimation.h" -@interface IFTTTStrokeStartAnimation : IFTTTShapeLayerAnimation +@interface IFTTTLayerStrokeStartAnimation : IFTTTShapeLayerAnimation - (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart; - (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTLayerStrokeStartAnimation.m b/JazzHands/IFTTTLayerStrokeStartAnimation.m new file mode 100644 index 0000000..7107321 --- /dev/null +++ b/JazzHands/IFTTTLayerStrokeStartAnimation.m @@ -0,0 +1,84 @@ +// +// IFTTTLayerStrokeStartAnimation.m +// JazzHands +// +// Created by Pierluigi D'Andrea on 06/05/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTLayerStrokeStartAnimation.h" + +@interface IFTTTLayerStrokeStartAnimation () + +@property (nonatomic, strong) NSString *animationKey; + +@end + +@implementation IFTTTLayerStrokeStartAnimation + +- (instancetype)initWithLayer:(CAShapeLayer *)layer +{ + if ((self = [super initWithLayer:layer])) { + _animationKey = @"RAZStrokeStart"; + + [self createBasicAnimation]; + + // CAAnimations are lost when application enters the background, so re-add them + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(createBasicAnimation) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart +{ + if (![self validStrokeStart:strokeStart]) return; + [self addKeyframeForTime:time value:@(strokeStart)]; +} + +- (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart withEasingFunction:(IFTTTEasingFunction)easingFunction +{ + if (![self validStrokeStart:strokeStart]) return; + [self addKeyframeForTime:time value:@(strokeStart) withEasingFunction:easingFunction]; +} + +- (BOOL)validStrokeStart:(CGFloat)strokeStart +{ + NSAssert((strokeStart >= 0.f) && (strokeStart <= 1.f), @"Stroke Start values must be between zero and one."); + if ((strokeStart < 0.f) || (strokeStart > 1.f)) return NO; + return YES; +} + +- (void)animate:(CGFloat)time +{ + if (!self.hasKeyframes) return; + self.layer.timeOffset = (CFTimeInterval)[(NSNumber *)[self valueAtTime:time] doubleValue]; +} + +- (void)createBasicAnimation +{ + // Set up CABasicAnimation to animate the stroke start + [self.layer addAnimation:[self strokeStartAnimation] forKey:self.animationKey]; + self.layer.speed = 0; + self.layer.timeOffset = 0; +} + +- (CABasicAnimation *)strokeStartAnimation +{ + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeStart"]; + animation.duration = 1; + animation.fromValue = @0; + animation.toValue = @1; + animation.fillMode = kCAFillModeBoth; + animation.removedOnCompletion = false; + return animation; +} + +@end diff --git a/JazzHands/IFTTTPathPositionAnimation.h b/JazzHands/IFTTTPathPositionAnimation.h new file mode 100644 index 0000000..d0b329f --- /dev/null +++ b/JazzHands/IFTTTPathPositionAnimation.h @@ -0,0 +1,21 @@ +// +// IFTTTPathPositionAnimation.h +// JazzHands +// +// Created by Laura Skelton on 6/30/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTAnimation.h" + +@interface IFTTTPathPositionAnimation : IFTTTAnimation + +@property (nonatomic, strong) NSString *rotationMode; +@property (nonatomic, assign) CGPathRef path; + +- (instancetype)initWithView:(UIView *)view path:(CGPathRef)path; ++ (instancetype)animationWithView:(UIView *)view path:(CGPathRef)path; +- (void)addKeyframeForTime:(CGFloat)time animationProgress:(CGFloat)animationProgress; +- (void)addKeyframeForTime:(CGFloat)time animationProgress:(CGFloat)animationProgress withEasingFunction:(IFTTTEasingFunction)easingFunction; + +@end diff --git a/JazzHands/IFTTTPathPositionAnimation.m b/JazzHands/IFTTTPathPositionAnimation.m new file mode 100644 index 0000000..b0e4fca --- /dev/null +++ b/JazzHands/IFTTTPathPositionAnimation.m @@ -0,0 +1,112 @@ +// +// IFTTTPathPositionAnimation.m +// JazzHands +// +// Created by Laura Skelton on 6/30/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTPathPositionAnimation.h" + +@interface IFTTTPathPositionAnimation () + +@property (nonatomic, strong) UIView *view; +@property (nonatomic, strong) NSString *animationKey; + +@end + +@implementation IFTTTPathPositionAnimation + +- (instancetype)initWithView:(UIView *)view path:(CGPathRef)path +{ + if ((self = [super init])) { + _view = view; + _path = path; + _rotationMode = kCAAnimationRotateAuto; + _animationKey = @"RAZPathPosition"; + + [self createKeyframeAnimation]; + + // CAAnimations are lost when application enters the background, so re-add them + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(createKeyframeAnimation) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + ++ (instancetype)animationWithView:(UIView *)view path:(CGPathRef)path +{ + return [[self alloc] initWithView:view path:path]; +} + +- (void)addKeyframeForTime:(CGFloat)time animationProgress:(CGFloat)animationProgress +{ + if (![self validAnimationProgress:animationProgress]) return; + [self addKeyframeForTime:time value:@(animationProgress)]; +} + +- (void)addKeyframeForTime:(CGFloat)time animationProgress:(CGFloat)animationProgress withEasingFunction:(IFTTTEasingFunction)easingFunction +{ + if (![self validAnimationProgress:animationProgress]) return; + [self addKeyframeForTime:time value:@(animationProgress) withEasingFunction:easingFunction]; +} + +- (BOOL)validAnimationProgress:(CGFloat)animationProgress +{ + NSAssert((animationProgress >= 0.f) && (animationProgress <= 1.f), @"Animation progress values must be between zero and one."); + if ((animationProgress < 0.f) || (animationProgress > 1.f)) return NO; + return YES; +} + +- (void)animate:(CGFloat)time +{ + if (!self.hasKeyframes) return; + self.view.layer.timeOffset = (CFTimeInterval)[(NSNumber *)[self valueAtTime:time] doubleValue]; +} + +- (void)setRotationMode:(NSString *)rotationMode +{ + if (_rotationMode != rotationMode) { + _rotationMode = rotationMode; + [self createKeyframeAnimation]; + } +} + +- (void)setPath:(CGPathRef)path +{ + if (_path != path) { + _path = path; + [self createKeyframeAnimation]; + } +} + +- (void)createKeyframeAnimation +{ + // Set up a CAKeyframeAnimation to move the view along the path + [self.view.layer addAnimation:[self pathAnimation] forKey:self.animationKey]; + self.view.layer.speed = 0; + self.view.layer.timeOffset = 0; +} + +- (CAKeyframeAnimation *)pathAnimation +{ + CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animation.path = self.path; + animation.duration = 1; + animation.additive = YES; + animation.repeatCount = HUGE_VALF; + animation.calculationMode = kCAAnimationPaced; + animation.rotationMode = self.rotationMode; + animation.fillMode = kCAFillModeBoth; + animation.removedOnCompletion = NO; + return animation; +} + +@end diff --git a/JazzHands/IFTTTScrollViewPageConstraintAnimation.h b/JazzHands/IFTTTScrollViewPageConstraintAnimation.h index 6265a59..0716060 100644 --- a/JazzHands/IFTTTScrollViewPageConstraintAnimation.h +++ b/JazzHands/IFTTTScrollViewPageConstraintAnimation.h @@ -8,12 +8,18 @@ #import "IFTTTAnimation.h" +typedef NS_ENUM(NSUInteger, IFTTTHorizontalPositionAttribute) { + IFTTTHorizontalPositionAttributeCenterX, + IFTTTHorizontalPositionAttributeLeft, + IFTTTHorizontalPositionAttributeRight +}; + @interface IFTTTScrollViewPageConstraintAnimation : IFTTTAnimation @property (nonatomic, assign) CGFloat pageWidth; -- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth NS_DESIGNATED_INITIALIZER; -+ (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth; +- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth attribute:(IFTTTHorizontalPositionAttribute)attribute; ++ (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth attribute:(IFTTTHorizontalPositionAttribute)attribute; - (void)addKeyframeForTime:(CGFloat)time page:(CGFloat)page; - (void)addKeyframeForTime:(CGFloat)time page:(CGFloat)page withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTScrollViewPageConstraintAnimation.m b/JazzHands/IFTTTScrollViewPageConstraintAnimation.m index d6d4541..d17b99c 100644 --- a/JazzHands/IFTTTScrollViewPageConstraintAnimation.m +++ b/JazzHands/IFTTTScrollViewPageConstraintAnimation.m @@ -12,24 +12,26 @@ @interface IFTTTScrollViewPageConstraintAnimation () @property (nonatomic, strong) UIView *superview; @property (nonatomic, strong) NSLayoutConstraint *constraint; +@property (nonatomic, assign) IFTTTHorizontalPositionAttribute attribute; @end @implementation IFTTTScrollViewPageConstraintAnimation -- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth +- (instancetype)initWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth attribute:(IFTTTHorizontalPositionAttribute)attribute { if ((self = [super init])) { _superview = superview; _constraint = constraint; _pageWidth = pageWidth; + _attribute = attribute; } return self; } -+ (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth ++ (instancetype)animationWithSuperview:(UIView *)superview constraint:(NSLayoutConstraint *)constraint pageWidth:(CGFloat)pageWidth attribute:(IFTTTHorizontalPositionAttribute)attribute { - return [[self alloc] initWithSuperview:superview constraint:constraint pageWidth:pageWidth]; + return [[self alloc] initWithSuperview:superview constraint:constraint pageWidth:pageWidth attribute:attribute]; } - (void)addKeyframeForTime:(CGFloat)time page:(CGFloat)page @@ -46,7 +48,21 @@ - (void)animate:(CGFloat)time { if (!self.hasKeyframes) return; CGFloat page = (CGFloat)[(NSNumber *)[self valueAtTime:time] floatValue]; - self.constraint.constant = (0.5f + page) * self.pageWidth; + + CGFloat offset; + switch (self.attribute) { + case IFTTTHorizontalPositionAttributeCenterX: + offset = 0.5f; + break; + case IFTTTHorizontalPositionAttributeLeft: + offset = 0.f; + break; + case IFTTTHorizontalPositionAttributeRight: + offset = 1.f; + break; + } + + self.constraint.constant = (offset + page) * self.pageWidth; [self.superview layoutIfNeeded]; } diff --git a/JazzHands/IFTTTShapeLayerAnimation.h b/JazzHands/IFTTTShapeLayerAnimation.h index 742d06a..8aad59f 100644 --- a/JazzHands/IFTTTShapeLayerAnimation.h +++ b/JazzHands/IFTTTShapeLayerAnimation.h @@ -12,7 +12,7 @@ @property (nonatomic, strong, readonly) CAShapeLayer *layer; -- (instancetype)initWithLayer:(CAShapeLayer *)layer NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithLayer:(CAShapeLayer *)layer; + (instancetype)animationWithLayer:(CAShapeLayer *)layer; @end diff --git a/JazzHands/IFTTTStrokeEndAnimation.m b/JazzHands/IFTTTStrokeEndAnimation.m deleted file mode 100644 index 249288d..0000000 --- a/JazzHands/IFTTTStrokeEndAnimation.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// IFTTTStrokeEndAnimation.m -// JazzHands -// -// Created by Pierluigi D'Andrea on 06/05/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTStrokeEndAnimation.h" - -@implementation IFTTTStrokeEndAnimation - -- (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd -{ - if (![self isValidStrokeEnd:strokeEnd]) return; - [self addKeyframeForTime:time value:@(strokeEnd)]; -} - -- (void)addKeyframeForTime:(CGFloat)time strokeEnd:(CGFloat)strokeEnd withEasingFunction:(IFTTTEasingFunction)easingFunction -{ - if (![self isValidStrokeEnd:strokeEnd]) return; - [self addKeyframeForTime:time value:@(strokeEnd) withEasingFunction:easingFunction]; -} - -- (BOOL)isValidStrokeEnd:(CGFloat)strokeEnd -{ - NSAssert((strokeEnd >= 0.f) && (strokeEnd <= 1.f), @"Stroke End values must be between zero and one."); - if ((strokeEnd < 0.f) || (strokeEnd > 1.f)) return NO; - return YES; -} - -- (void)animate:(CGFloat)time -{ - if (!self.hasKeyframes) return; - self.layer.strokeEnd = (CGFloat)[(NSNumber *)[self valueAtTime:time] floatValue]; -} - -@end diff --git a/JazzHands/IFTTTStrokeStartAnimation.m b/JazzHands/IFTTTStrokeStartAnimation.m deleted file mode 100644 index f9fb0b1..0000000 --- a/JazzHands/IFTTTStrokeStartAnimation.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// IFTTTStrokeStartAnimation.m -// JazzHands -// -// Created by Pierluigi D'Andrea on 06/05/15. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTStrokeStartAnimation.h" - -@implementation IFTTTStrokeStartAnimation - -- (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart -{ - if (![self isValidStrokeStart:strokeStart]) return; - [self addKeyframeForTime:time value:@(strokeStart)]; -} - -- (void)addKeyframeForTime:(CGFloat)time strokeStart:(CGFloat)strokeStart withEasingFunction:(IFTTTEasingFunction)easingFunction -{ - if (![self isValidStrokeStart:strokeStart]) return; - [self addKeyframeForTime:time value:@(strokeStart) withEasingFunction:easingFunction]; -} - -- (BOOL)isValidStrokeStart:(CGFloat)strokeStart -{ - NSAssert((strokeStart >= 0.f) && (strokeStart <= 1.f), @"Stroke Start values must be between zero and one."); - if ((strokeStart < 0.f) || (strokeStart > 1.f)) return NO; - return YES; -} - -- (void)animate:(CGFloat)time -{ - if (!self.hasKeyframes) return; - self.layer.strokeStart = (CGFloat)[(NSNumber *)[self valueAtTime:time] floatValue]; -} - -@end diff --git a/JazzHands/IFTTTTextColorAnimation.h b/JazzHands/IFTTTTextColorAnimation.h index 2c107e1..6760e9b 100644 --- a/JazzHands/IFTTTTextColorAnimation.h +++ b/JazzHands/IFTTTTextColorAnimation.h @@ -6,10 +6,12 @@ // Copyright (c) 2015 IFTTT Inc. All rights reserved. // -#import "IFTTTLabelAnimation.h" +#import "IFTTTAnimation.h" -@interface IFTTTTextColorAnimation : IFTTTLabelAnimation +@interface IFTTTTextColorAnimation : IFTTTAnimation +- (instancetype)initWithLabel:(UILabel *)label; ++ (instancetype)animationWithLabel:(UILabel *)label; - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color; - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color withEasingFunction:(IFTTTEasingFunction)easingFunction; diff --git a/JazzHands/IFTTTTextColorAnimation.m b/JazzHands/IFTTTTextColorAnimation.m index 541945e..b1fd813 100644 --- a/JazzHands/IFTTTTextColorAnimation.m +++ b/JazzHands/IFTTTTextColorAnimation.m @@ -8,8 +8,27 @@ #import "IFTTTTextColorAnimation.h" +@interface IFTTTTextColorAnimation () + +@property (nonatomic, strong) UILabel *label; + +@end + @implementation IFTTTTextColorAnimation +- (instancetype)initWithLabel:(UILabel *)label +{ + if ((self = [super init])) { + _label = label; + } + return self; +} + ++ (instancetype)animationWithLabel:(UILabel *)label +{ + return [[self alloc] initWithLabel:label]; +} + - (void)addKeyframeForTime:(CGFloat)time color:(UIColor *)color { if (![self validColor:color]) return; diff --git a/JazzHands/IFTTTViewAnimation.h b/JazzHands/IFTTTViewAnimation.h index 4385a35..3b826b0 100644 --- a/JazzHands/IFTTTViewAnimation.h +++ b/JazzHands/IFTTTViewAnimation.h @@ -12,7 +12,7 @@ @property (nonatomic, strong, readonly) UIView *view; -- (instancetype)initWithView:(UIView *)view NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithView:(UIView *)view; + (instancetype)animationWithView:(UIView *)view; @end diff --git a/README.md b/README.md index b3586ca..bad195e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# Jazz Hands +![Jazz Hands](./Example/Docs/jazzhands_banner.jpg) [![Build Status](https://travis-ci.org/IFTTT/JazzHands.svg?branch=master)](https://travis-ci.org/IFTTT/JazzHands) [![Coverage Status](https://coveralls.io/repos/IFTTT/JazzHands/badge.svg)](https://coveralls.io/r/IFTTT/JazzHands) Jazz Hands is a simple keyframe-based animation framework for UIKit. Animations can be controlled via gestures, scroll views, KVO, or ReactiveCocoa. -Jazz Hands is used extensively in [IF and DO by IFTTT for iPhone and iPad](https://ifttt.com/products), most famously in the app intro: +![Jazz Hands](./Example/Docs/jazzhands-demo.gif) -![Jazz Hands](./Example/Docs/if-intro.gif) +Jazz Hands is used extensively in [IF and DO by IFTTT for iPhone and iPad](https://ifttt.com/products), most famously in the app intro. ##Demo App @@ -90,8 +90,9 @@ Jazz Hands supports several types of animations: + **IFTTTTransform3DAnimation** animates the `layer.transform` property _(for 3D transforms)_. + **IFTTTTextColorAnimation** animates the `textColor` property of a `UILabel`. + **IFTTTFillColorAnimation** animates the `fillColor` property of a `CAShapeLayer`. -+ **IFTTTStrokeStartAnimation** animates the `strokeStart` property of a `CAShapeLayer`. -+ **IFTTTStrokeEndAnimation** animates the `strokeEnd` property of a `CAShapeLayer`. ++ **IFTTTStrokeStartAnimation** animates the `strokeStart` property of a `CAShapeLayer` _(does not work with IFTTTStrokeEndAnimation)_. ++ **IFTTTStrokeEndAnimation** animates the `strokeEnd` property of a `CAShapeLayer` _(does not work with IFTTTStrokeStartAnimation)_. ++ **IFTTTPathPositionAnimation** animates the `layer.position` property of a `UIView`. + **IFTTTConstraintConstantAnimation** animates an `AutoLayout` constraint constant. + **IFTTTConstraintMultiplierAnimation** animates an `AutoLayout` constraint constant as a multiple of an attribute of another view _(to offset or resize views based on another view's size)_ + **IFTTTScrollViewPageConstraintAnimation** animates an `AutoLayout` constraint constant to place a view on a scroll view page _(to position views on a scrollView using AutoLayout)_