From bb19fe0f7d4399433509cef4024dcaaf14474d0e Mon Sep 17 00:00:00 2001 From: Giuseppe Nucifora Date: Mon, 3 Aug 2015 12:52:31 +0200 Subject: [PATCH] Release 0.1.0 --- .../contents.xcworkspacedata | 10 + Example/Podfile | 1 - Example/Podfile.lock | 21 + .../Categories/UIImage+Compare.h | 37 + .../Categories/UIImage+Compare.m | 134 +++ .../Categories/UIImage+Diff.h | 37 + .../Categories/UIImage+Diff.m | 56 + .../Categories/UIImage+Snapshot.h | 24 + .../Categories/UIImage+Snapshot.m | 62 + .../FBSnapshotTestCase/FBSnapshotTestCase.h | 141 +++ .../FBSnapshotTestCase/FBSnapshotTestCase.m | 99 ++ .../FBSnapshotTestCasePlatform.h | 36 + .../FBSnapshotTestCasePlatform.m | 31 + .../FBSnapshotTestController.h | 145 +++ .../FBSnapshotTestController.m | 348 ++++++ .../FBSnapshotTestCase/SwiftSupport.swift | 58 + Example/Pods/FBSnapshotTestCase/LICENSE | 29 + Example/Pods/FBSnapshotTestCase/README.md | 98 ++ .../FBSnapshotTestCase/FBSnapshotTestCase.h | 1 + .../FBSnapshotTestCasePlatform.h | 1 + .../FBSnapshotTestController.h | 1 + .../FBSnapshotTestCase/UIImage+Compare.h | 1 + .../Private/FBSnapshotTestCase/UIImage+Diff.h | 1 + .../FBSnapshotTestCase/UIImage+Snapshot.h | 1 + .../HamburgerButton.podspec.json | 25 + Example/Pods/Manifest.lock | 21 + Example/Pods/Pods.xcodeproj/project.pbxproj | 1019 +++++++++++++++++ .../xcschemes/HamburgerButton.xcscheme | 62 + .../FBSnapshotTestCase-Private.xcconfig | 8 + .../FBSnapshotTestCase-dummy.m | 5 + .../FBSnapshotTestCase-prefix.pch | 4 + .../FBSnapshotTestCase-umbrella.h | 14 + .../FBSnapshotTestCase.modulemap | 8 + .../FBSnapshotTestCase.xcconfig | 2 + .../FBSnapshotTestCase/Info.plist | 26 + .../HamburgerButton-Private.xcconfig | 5 + .../HamburgerButton/HamburgerButton-dummy.m | 5 + .../HamburgerButton-prefix.pch | 4 + .../HamburgerButton-umbrella.h | 6 + .../HamburgerButton/HamburgerButton.modulemap | 6 + .../HamburgerButton/HamburgerButton.xcconfig | 0 .../HamburgerButton/Info.plist | 26 + .../Pods-HamburgerButton_Example/Info.plist | 26 + ...erButton_Example-acknowledgements.markdown | 26 + ...urgerButton_Example-acknowledgements.plist | 56 + .../Pods-HamburgerButton_Example-dummy.m | 5 + ...Pods-HamburgerButton_Example-frameworks.sh | 59 + .../Pods-HamburgerButton_Example-resources.sh | 95 ++ .../Pods-HamburgerButton_Example-umbrella.h | 6 + ...ods-HamburgerButton_Example.debug.xcconfig | 6 + .../Pods-HamburgerButton_Example.modulemap | 6 + ...s-HamburgerButton_Example.release.xcconfig | 6 + .../Pods-HamburgerButton_Tests/Info.plist | 26 + ...rgerButton_Tests-acknowledgements.markdown | 59 + ...mburgerButton_Tests-acknowledgements.plist | 93 ++ .../Pods-HamburgerButton_Tests-dummy.m | 5 + .../Pods-HamburgerButton_Tests-frameworks.sh | 61 + .../Pods-HamburgerButton_Tests-resources.sh | 95 ++ .../Pods-HamburgerButton_Tests-umbrella.h | 6 + .../Pods-HamburgerButton_Tests.debug.xcconfig | 7 + .../Pods-HamburgerButton_Tests.modulemap | 6 + ...ods-HamburgerButton_Tests.release.xcconfig | 7 + HamburgerButton.podspec | 16 +- Pod/Classes/LBHamburgerButton.h | 156 +++ Pod/Classes/LBHamburgerButton.m | 274 +++++ README.md | 65 +- 66 files changed, 3772 insertions(+), 14 deletions(-) create mode 100644 Example/HamburgerButton.xcworkspace/contents.xcworkspacedata create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift create mode 100644 Example/Pods/FBSnapshotTestCase/LICENSE create mode 100644 Example/Pods/FBSnapshotTestCase/README.md create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h create mode 100644 Example/Pods/Local Podspecs/HamburgerButton.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/HamburgerButton.xcscheme create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Private.xcconfig create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist create mode 100644 Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-Private.xcconfig create mode 100644 Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-dummy.m create mode 100644 Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-prefix.pch create mode 100644 Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-umbrella.h create mode 100644 Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.modulemap rename Pod/Classes/ReplaceMe.m => Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.xcconfig (100%) create mode 100644 Example/Pods/Target Support Files/HamburgerButton/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.release.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.release.xcconfig create mode 100644 Pod/Classes/LBHamburgerButton.h create mode 100644 Pod/Classes/LBHamburgerButton.m diff --git a/Example/HamburgerButton.xcworkspace/contents.xcworkspacedata b/Example/HamburgerButton.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9df1763 --- /dev/null +++ b/Example/HamburgerButton.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/Podfile b/Example/Podfile index 49b887f..80c454b 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -8,5 +8,4 @@ end target 'HamburgerButton_Tests', :exclusive => true do pod "HamburgerButton", :path => "../" - pod 'FBSnapshotTestCase' end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..0cd44e9 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,21 @@ +PODS: + - FBSnapshotTestCase (2.0.3): + - FBSnapshotTestCase/SwiftSupport (= 2.0.3) + - FBSnapshotTestCase/Core (2.0.3) + - FBSnapshotTestCase/SwiftSupport (2.0.3): + - FBSnapshotTestCase/Core + - HamburgerButton (0.1.0) + +DEPENDENCIES: + - FBSnapshotTestCase + - HamburgerButton (from `../`) + +EXTERNAL SOURCES: + HamburgerButton: + :path: ../ + +SPEC CHECKSUMS: + FBSnapshotTestCase: d0eeca6bf87958e088b254396ae66873f971cfb1 + HamburgerButton: 7c98f3258cc3b794872532fe825da3ef797adbb3 + +COCOAPODS: 0.38.2 diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h new file mode 100644 index 0000000..9091d62 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h @@ -0,0 +1,37 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@interface UIImage (Compare) + +- (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m new file mode 100644 index 0000000..4a1fd35 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m @@ -0,0 +1,134 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +// This makes debugging much more fun +typedef union { + uint32_t raw; + unsigned char bytes[4]; + struct { + char red; + char green; + char blue; + char alpha; + } __attribute__ ((packed)) pixels; +} FBComparePixel; + +@implementation UIImage (Compare) + +- (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance +{ + NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size."); + + CGSize referenceImageSize = CGSizeMake(CGImageGetWidth(self.CGImage), CGImageGetHeight(self.CGImage)); + CGSize imageSize = CGSizeMake(CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage)); + + // The images have the equal size, so we could use the smallest amount of bytes because of byte padding + size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage)); + size_t referenceImageSizeBytes = referenceImageSize.height * minBytesPerRow; + void *referenceImagePixels = calloc(1, referenceImageSizeBytes); + void *imagePixels = calloc(1, referenceImageSizeBytes); + + if (!referenceImagePixels || !imagePixels) { + free(referenceImagePixels); + free(imagePixels); + return NO; + } + + CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels, + referenceImageSize.width, + referenceImageSize.height, + CGImageGetBitsPerComponent(self.CGImage), + minBytesPerRow, + CGImageGetColorSpace(self.CGImage), + (CGBitmapInfo)kCGImageAlphaPremultipliedLast + ); + CGContextRef imageContext = CGBitmapContextCreate(imagePixels, + imageSize.width, + imageSize.height, + CGImageGetBitsPerComponent(image.CGImage), + minBytesPerRow, + CGImageGetColorSpace(image.CGImage), + (CGBitmapInfo)kCGImageAlphaPremultipliedLast + ); + + if (!referenceImageContext || !imageContext) { + CGContextRelease(referenceImageContext); + CGContextRelease(imageContext); + free(referenceImagePixels); + free(imagePixels); + return NO; + } + + CGContextDrawImage(referenceImageContext, CGRectMake(0, 0, referenceImageSize.width, referenceImageSize.height), self.CGImage); + CGContextDrawImage(imageContext, CGRectMake(0, 0, imageSize.width, imageSize.height), image.CGImage); + + CGContextRelease(referenceImageContext); + CGContextRelease(imageContext); + + BOOL imageEqual = YES; + + // Do a fast compare if we can + if (tolerance == 0) { + imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0); + } else { + // Go through each pixel in turn and see if it is different + const NSInteger pixelCount = self.size.width * self.size.height; + + FBComparePixel *p1 = referenceImagePixels; + FBComparePixel *p2 = imagePixels; + + NSInteger numDiffPixels = 0; + for (int n = 0; n < pixelCount; ++n) { + // If this pixel is different, increment the pixel diff count and see + // if we have hit our limit. + if (p1->raw != p2->raw) { + numDiffPixels ++; + + CGFloat percent = (CGFloat)numDiffPixels / pixelCount; + if (percent > tolerance) { + imageEqual = NO; + break; + } + } + + p1++; + p2++; + } + } + + free(referenceImagePixels); + free(imagePixels); + + return imageEqual; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h new file mode 100644 index 0000000..a0863f3 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h @@ -0,0 +1,37 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@interface UIImage (Diff) + +- (UIImage *)fb_diffWithImage:(UIImage *)image; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m new file mode 100644 index 0000000..ebb72fe --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m @@ -0,0 +1,56 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@implementation UIImage (Diff) + +- (UIImage *)fb_diffWithImage:(UIImage *)image +{ + if (!image) { + return nil; + } + CGSize imageSize = CGSizeMake(MAX(self.size.width, image.size.width), MAX(self.size.height, image.size.height)); + UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0); + CGContextRef context = UIGraphicsGetCurrentContext(); + [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; + CGContextSetAlpha(context, 0.5); + CGContextBeginTransparencyLayer(context, NULL); + [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; + CGContextSetBlendMode(context, kCGBlendModeDifference); + CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor); + CGContextFillRect(context, CGRectMake(0, 0, self.size.width, self.size.height)); + CGContextEndTransparencyLayer(context); + UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return returnImage; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h new file mode 100644 index 0000000..b0d5b26 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@interface UIImage (Snapshot) + +/// Uses renderInContext: to get a snapshot of the layer. ++ (UIImage *)fb_imageForLayer:(CALayer *)layer; + +/// Uses renderInContext: to get a snapshot of the view layer. ++ (UIImage *)fb_imageForViewLayer:(UIView *)view; + +/// Uses drawViewHierarchyInRect: to get a snapshot of the view and adds the view into a window if needed. ++ (UIImage *)fb_imageForView:(UIView *)view; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m new file mode 100644 index 0000000..c792077 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@implementation UIImage (Snapshot) + ++ (UIImage *)fb_imageForLayer:(CALayer *)layer +{ + CGRect bounds = layer.bounds; + NSAssert1(CGRectGetWidth(bounds), @"Zero width for layer %@", layer); + NSAssert1(CGRectGetHeight(bounds), @"Zero height for layer %@", layer); + + UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); + CGContextRef context = UIGraphicsGetCurrentContext(); + NSAssert1(context, @"Could not generate context for layer %@", layer); + CGContextSaveGState(context); + [layer layoutIfNeeded]; + [layer renderInContext:context]; + CGContextRestoreGState(context); + + UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return snapshot; +} + ++ (UIImage *)fb_imageForViewLayer:(UIView *)view +{ + [view layoutIfNeeded]; + return [self fb_imageForLayer:view.layer]; +} + ++ (UIImage *)fb_imageForView:(UIView *)view +{ + CGRect bounds = view.bounds; + NSAssert1(CGRectGetWidth(bounds), @"Zero width for view %@", view); + NSAssert1(CGRectGetHeight(bounds), @"Zero height for view %@", view); + + UIWindow *window = view.window; + if (window == nil) { + window = [[UIWindow alloc] initWithFrame:bounds]; + [window addSubview:view]; + [window makeKeyAndVisible]; + } + + UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); + [view layoutIfNeeded]; + [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; + + UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return snapshot; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h new file mode 100644 index 0000000..5a59bf0 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +#import + +#import + +/** + Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. + @param view The view to snapshot + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param suffixes An NSOrderedSet of strings for the different suffixes + @param tolerance The percentage of pixels that can differ and still count as an 'identical' view + */ +#define FBSnapshotVerifyViewWithOptions(view__, identifier__, suffixes__, tolerance__) \ +{ \ +NSString *envReferenceImageDirectory = [NSProcessInfo processInfo].environment[@"FB_REFERENCE_IMAGE_DIR"]; \ +NSError *error__ = nil; \ +BOOL comparisonSuccess__; \ +XCTAssertTrue((suffixes__.count > 0), @"Suffixes set cannot be empty %@", suffixes__); \ +XCTAssertNotNil(envReferenceImageDirectory, @"Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.");\ +for (NSString *suffix__ in suffixes__) { \ +NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%@%@", envReferenceImageDirectory, suffix__]; \ +comparisonSuccess__ = [self compareSnapshotOfView:(view__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) tolerance:(tolerance__) error:&error__]; \ +if (comparisonSuccess__ || self.recordMode) break; \ +} \ +XCTAssertTrue(comparisonSuccess__, @"Snapshot comparison failed: %@", error__); \ +XCTAssertFalse(self.recordMode, @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"); \ +} + +#define FBSnapshotVerifyView(view__, identifier__) \ +{ \ +FBSnapshotVerifyViewWithOptions(view__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0); \ +} + +/** + Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. + @param layer The layer to snapshot + @param identifier An optional identifier, used is there are multiple snapshot tests in a given -test method. + @param suffixes An NSOrderedSet of strings for the different suffixes + @param tolerance The percentage of pixels that can differ and still count as an 'identical' layer + */ +#define FBSnapshotVerifyLayerWithOptions(layer__, identifier__, suffixes__, tolerance__) \ +{ \ +NSString *envReferenceImageDirectory = [NSProcessInfo processInfo].environment[@"FB_REFERENCE_IMAGE_DIR"]; \ +NSError *error__ = nil; \ +BOOL comparisonSuccess__; \ +XCTAssertTrue((suffixes__.count > 0), @"Suffixes set cannot be empty %@", suffixes__); \ +XCTAssertNotNil(envReferenceImageDirectory, @"Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.");\ +for (NSString *suffix__ in suffixes__) { \ +NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%@%@", envReferenceImageDirectory, suffix__]; \ +comparisonSuccess__ = [self compareSnapshotOfLayer:(layer__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) tolerance:(tolerance__) error:&error__]; \ +if (comparisonSuccess__ || self.recordMode) break; \ +} \ +XCTAssertTrue(comparisonSuccess__, @"Snapshot comparison failed: %@", error__); \ +XCTAssertFalse(self.recordMode, @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"); \ +} + +#define FBSnapshotVerifyLayer(layer__, identifier__) \ +{ \ +FBSnapshotVerifyLayerWithOptions(layer__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0); \ +} + +/** + The base class of view snapshotting tests. If you have small UI component, it's often easier to configure it in a test + and compare an image of the view to a reference image that write lots of complex layout-code tests. + + In order to flip the tests in your subclass to record the reference images set @c recordMode to @c YES. + + For example: + @code + - (void)setUp + { + [super setUp]; + self.recordMode = YES; + } + @endcode + */ +@interface FBSnapshotTestCase : XCTestCase + +/** + When YES, the test macros will save reference images, rather than performing an actual test. + */ +@property (readwrite, nonatomic, assign) BOOL recordMode; + +/** + When YES, renders a snapshot of the complete view hierarchy as visible onscreen. + There are several things that do not work if renderInContext: is used. + - UIVisualEffect #70 + - UIAppearance #91 + - Size Classes #92 + + @attention If the view does't belong to a UIWindow, it will create one and add the view as a subview. + */ +@property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; + +- (void)setUp NS_REQUIRES_SUPER; +- (void)tearDown NS_REQUIRES_SUPER; + +/** + Performs the comparison or records a snapshot of the layer if recordMode is YES. + @param layer The Layer to snapshot + @param referenceImagesDirectory The directory in which reference images are stored. + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Performs the comparison or records a snapshot of the view if recordMode is YES. + @param view The view to snapshot + @param referenceImagesDirectory The directory in which reference images are stored. + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfView:(UIView *)view + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m new file mode 100644 index 0000000..cc6a3e7 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +@implementation FBSnapshotTestCase +{ + FBSnapshotTestController *_snapshotController; +} + +#pragma mark - Overrides + +- (void)setUp +{ + [super setUp]; + _snapshotController = [[FBSnapshotTestController alloc] initWithTestName:NSStringFromClass([self class])]; +} + +- (void)tearDown +{ + _snapshotController = nil; + [super tearDown]; +} + +- (BOOL)recordMode +{ + return _snapshotController.recordMode; +} + +- (void)setRecordMode:(BOOL)recordMode +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.recordMode = recordMode; +} + +- (BOOL)usesDrawViewHierarchyInRect +{ + return _snapshotController.usesDrawViewHierarchyInRect; +} + +- (void)setUsesDrawViewHierarchyInRect:(BOOL)usesDrawViewHierarchyInRect +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.usesDrawViewHierarchyInRect = usesDrawViewHierarchyInRect; +} + +#pragma mark - Public API + +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + return [self _compareSnapshotOfViewOrLayer:layer + referenceImagesDirectory:referenceImagesDirectory + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfView:(UIView *)view + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + return [self _compareSnapshotOfViewOrLayer:view + referenceImagesDirectory:referenceImagesDirectory + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +#pragma mark - Private API + +- (BOOL)_compareSnapshotOfViewOrLayer:(id)viewOrLayer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + _snapshotController.referenceImagesDirectory = referenceImagesDirectory; + return [_snapshotController compareSnapshotOfViewOrLayer:viewOrLayer + selector:self.invocation.selector + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h new file mode 100644 index 0000000..99f6480 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Returns a Boolean value that indicates whether the snapshot test is running in 64Bit. + This method is a convenience for creating the suffixes set based on the architecture + that the test is running. + + @returns @c YES if the test is running in 64bit, otherwise @c NO. + */ +BOOL FBSnapshotTestCaseIs64Bit(void); + +/** + Returns a default set of strings that is used to append a suffix based on the architectures. + @warning Do not modify this function, you can create your own and use it with @c FBSnapshotVerifyViewWithOptions() + + @returns An @c NSOrderedSet object containing strings that are appended to the reference images directory. + */ +NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void); + +#ifdef __cplusplus +} +#endif diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m new file mode 100644 index 0000000..95746c8 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +BOOL FBSnapshotTestCaseIs64Bit(void) +{ +#if __LP64__ + return YES; +#else + return NO; +#endif +} + +NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void) +{ + NSMutableOrderedSet *suffixesSet = [[NSMutableOrderedSet alloc] init]; + [suffixesSet addObject:@"_32"]; + [suffixesSet addObject:@"_64"]; + if (FBSnapshotTestCaseIs64Bit()) { + return [suffixesSet reversedOrderedSet]; + } + return [suffixesSet copy]; +} diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h new file mode 100644 index 0000000..7ee01ee --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { + FBSnapshotTestControllerErrorCodeUnknown, + FBSnapshotTestControllerErrorCodeNeedsRecord, + FBSnapshotTestControllerErrorCodePNGCreationFailed, + FBSnapshotTestControllerErrorCodeImagesDifferentSizes, + FBSnapshotTestControllerErrorCodeImagesDifferent, +}; +/** + Errors returned by the methods of FBSnapshotTestController use this domain. + */ +extern NSString *const FBSnapshotTestControllerErrorDomain; + +/** + Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. + */ +extern NSString *const FBReferenceImageFilePathKey; + +/** + Provides the heavy-lifting for FBSnapshotTestCase. It loads and saves images, along with performing the actual pixel- + by-pixel comparison of images. + Instances are initialized with the test class, and directories to read and write to. + */ +@interface FBSnapshotTestController : NSObject + +/** + Record snapshots. + */ +@property (readwrite, nonatomic, assign) BOOL recordMode; + +/** + Uses drawViewHierarchyInRect:afterScreenUpdates: to draw the image instead of renderInContext: + */ +@property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; + +/** + The directory in which referfence images are stored. + */ +@property (readwrite, nonatomic, copy) NSString *referenceImagesDirectory; + +/** + @param testClass The subclass of FBSnapshotTestCase that is using this controller. + @returns An instance of FBSnapshotTestController. + */ +- (instancetype)initWithTestClass:(Class)testClass; + +/** + Designated initializer. + @param testName The name of the tests. + @returns An instance of FBSnapshotTestController. + */ +- (instancetype)initWithTestName:(NSString *)testName; + +/** + Performs the comparison of the layer. + @param layer The Layer to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs the comparison of the view. + @param view The view to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfView:(UIView *)view + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs the comparison of a view or layer. + @param view The view or layer to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param tolerance The percentage of pixels that can differ and still be considered 'identical' + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Loads a reference image. + @param selector The test method being run. + @param identifier The optional identifier, used when multiple images are tested in a single -test method. + @param errorPtr An error, if this methods returns nil, the error will be something useful. + @returns An image. + */ +- (UIImage *)referenceImageForSelector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs a pixel-by-pixel comparison of the two images with an allowable margin of error. + @param referenceImage The reference (correct) image. + @param image The image to test against the reference. + @param tolerance The percentage of pixels that can differ and still be considered 'identical' + @param errorPtr An error that indicates why the comparison failed if it does. + @returns YES if the comparison succeeded and the images are the same(ish). + */ +- (BOOL)compareReferenceImage:(UIImage *)referenceImage + toImage:(UIImage *)image + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Saves the reference image and the test image to `failedOutputDirectory`. + @param referenceImage The reference (correct) image. + @param testImage The image to test against the reference. + @param selector The test method being run. + @param identifier The optional identifier, used when multiple images are tested in a single -test method. + @param errorPtr An error that indicates why the comparison failed if it does. + @returns YES if the save succeeded. + */ +- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage + testImage:(UIImage *)testImage + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m new file mode 100644 index 0000000..ef2c7c3 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import +#import +#import + +#import + +NSString *const FBSnapshotTestControllerErrorDomain = @"FBSnapshotTestControllerErrorDomain"; +NSString *const FBReferenceImageFilePathKey = @"FBReferenceImageFilePathKey"; + +typedef NS_ENUM(NSUInteger, FBTestSnapshotFileNameType) { + FBTestSnapshotFileNameTypeReference, + FBTestSnapshotFileNameTypeFailedReference, + FBTestSnapshotFileNameTypeFailedTest, + FBTestSnapshotFileNameTypeFailedTestDiff, +}; + +@implementation FBSnapshotTestController +{ + NSString *_testName; + NSFileManager *_fileManager; +} + +#pragma mark - Initializers + +- (instancetype)initWithTestClass:(Class)testClass; +{ + return [self initWithTestName:NSStringFromClass(testClass)]; +} + +- (instancetype)initWithTestName:(NSString *)testName +{ + if (self = [super init]) { + _testName = [testName copy]; + _fileManager = [[NSFileManager alloc] init]; + } + return self; +} + +#pragma mark - Overrides + +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@ %@", [super description], _referenceImagesDirectory]; +} + +#pragma mark - Public API + +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + return [self compareSnapshotOfViewOrLayer:layer + selector:selector + identifier:identifier + tolerance:0 + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfView:(UIView *)view + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + return [self compareSnapshotOfViewOrLayer:view + selector:selector + identifier:identifier + tolerance:0 + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + if (self.recordMode) { + return [self _recordSnapshotOfViewOrLayer:viewOrLayer selector:selector identifier:identifier error:errorPtr]; + } else { + return [self _performPixelComparisonWithViewOrLayer:viewOrLayer selector:selector identifier:identifier tolerance:tolerance error:errorPtr]; + } +} + +- (UIImage *)referenceImageForSelector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; + UIImage *image = [UIImage imageWithContentsOfFile:filePath]; + if (nil == image && NULL != errorPtr) { + BOOL exists = [_fileManager fileExistsAtPath:filePath]; + if (!exists) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeNeedsRecord + userInfo:@{ + FBReferenceImageFilePathKey: filePath, + NSLocalizedDescriptionKey: @"Unable to load reference image.", + NSLocalizedFailureReasonErrorKey: @"Reference image not found. You need to run the test in record mode", + }]; + } else { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeUnknown + userInfo:nil]; + } + } + return image; +} + +- (BOOL)compareReferenceImage:(UIImage *)referenceImage + toImage:(UIImage *)image + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + if (CGSizeEqualToSize(referenceImage.size, image.size)) { + BOOL imagesEqual = [referenceImage fb_compareWithImage:image tolerance:tolerance]; + if (NULL != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeImagesDifferent + userInfo:@{ + NSLocalizedDescriptionKey: @"Images different", + }]; + } + return imagesEqual; + } + if (NULL != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeImagesDifferentSizes + userInfo:@{ + NSLocalizedDescriptionKey: @"Images different sizes", + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"referenceImage:%@, image:%@", + NSStringFromCGSize(referenceImage.size), + NSStringFromCGSize(image.size)], + }]; + } + return NO; +} + +- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage + testImage:(UIImage *)testImage + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + NSData *referencePNGData = UIImagePNGRepresentation(referenceImage); + NSData *testPNGData = UIImagePNGRepresentation(testImage); + + NSString *referencePath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedReference]; + + NSError *creationError = nil; + BOOL didCreateDir = [_fileManager createDirectoryAtPath:[referencePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:&creationError]; + if (!didCreateDir) { + if (NULL != errorPtr) { + *errorPtr = creationError; + } + return NO; + } + + if (![referencePNGData writeToFile:referencePath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSString *testPath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedTest]; + + if (![testPNGData writeToFile:testPath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSString *diffPath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedTestDiff]; + + UIImage *diffImage = [referenceImage fb_diffWithImage:testImage]; + NSData *diffImageData = UIImagePNGRepresentation(diffImage); + + if (![diffImageData writeToFile:diffPath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSLog(@"If you have Kaleidoscope installed you can run this command to see an image diff:\n" + @"ksdiff \"%@\" \"%@\"", referencePath, testPath); + + return YES; +} + +#pragma mark - Private API + +- (NSString *)_fileNameForSelector:(SEL)selector + identifier:(NSString *)identifier + fileNameType:(FBTestSnapshotFileNameType)fileNameType +{ + NSString *fileName = nil; + switch (fileNameType) { + case FBTestSnapshotFileNameTypeFailedReference: + fileName = @"reference_"; + break; + case FBTestSnapshotFileNameTypeFailedTest: + fileName = @"failed_"; + break; + case FBTestSnapshotFileNameTypeFailedTestDiff: + fileName = @"diff_"; + break; + default: + fileName = @""; + break; + } + fileName = [fileName stringByAppendingString:NSStringFromSelector(selector)]; + if (0 < identifier.length) { + fileName = [fileName stringByAppendingFormat:@"_%@", identifier]; + } + if ([[UIScreen mainScreen] scale] > 1) { + fileName = [fileName stringByAppendingFormat:@"@%.fx", [[UIScreen mainScreen] scale]]; + } + fileName = [fileName stringByAppendingPathExtension:@"png"]; + return fileName; +} + +- (NSString *)_referenceFilePathForSelector:(SEL)selector + identifier:(NSString *)identifier +{ + NSString *fileName = [self _fileNameForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeReference]; + NSString *filePath = [_referenceImagesDirectory stringByAppendingPathComponent:_testName]; + filePath = [filePath stringByAppendingPathComponent:fileName]; + return filePath; +} + +- (NSString *)_failedFilePathForSelector:(SEL)selector + identifier:(NSString *)identifier + fileNameType:(FBTestSnapshotFileNameType)fileNameType +{ + NSString *fileName = [self _fileNameForSelector:selector + identifier:identifier + fileNameType:fileNameType]; + NSString *folderPath = NSTemporaryDirectory(); + if (getenv("IMAGE_DIFF_DIR")) { + folderPath = @(getenv("IMAGE_DIFF_DIR")); + } + NSString *filePath = [folderPath stringByAppendingPathComponent:_testName]; + filePath = [filePath stringByAppendingPathComponent:fileName]; + return filePath; +} + +- (BOOL)_performPixelComparisonWithViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + UIImage *referenceImage = [self referenceImageForSelector:selector identifier:identifier error:errorPtr]; + if (nil != referenceImage) { + UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; + BOOL imagesSame = [self compareReferenceImage:referenceImage toImage:snapshot tolerance:tolerance error:errorPtr]; + if (!imagesSame) { + [self saveFailedReferenceImage:referenceImage + testImage:snapshot + selector:selector + identifier:identifier + error:errorPtr]; + } + return imagesSame; + } + return NO; +} + +- (BOOL)_recordSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; + return [self _saveReferenceImage:snapshot selector:selector identifier:identifier error:errorPtr]; +} + +- (BOOL)_saveReferenceImage:(UIImage *)image + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + BOOL didWrite = NO; + if (nil != image) { + NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; + NSData *pngData = UIImagePNGRepresentation(image); + if (nil != pngData) { + NSError *creationError = nil; + BOOL didCreateDir = [_fileManager createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:&creationError]; + if (!didCreateDir) { + if (NULL != errorPtr) { + *errorPtr = creationError; + } + return NO; + } + didWrite = [pngData writeToFile:filePath options:NSDataWritingAtomic error:errorPtr]; + if (didWrite) { + NSLog(@"Reference image save at: %@", filePath); + } + } else { + if (nil != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodePNGCreationFailed + userInfo:@{ + FBReferenceImageFilePathKey: filePath, + }]; + } + } + } + return didWrite; +} + +- (UIImage *)_imageForViewOrLayer:(id)viewOrLayer +{ + if ([viewOrLayer isKindOfClass:[UIView class]]) { + if (_usesDrawViewHierarchyInRect) { + return [UIImage fb_imageForView:viewOrLayer]; + } else { + return [UIImage fb_imageForViewLayer:viewOrLayer]; + } + } else if ([viewOrLayer isKindOfClass:[CALayer class]]) { + return [UIImage fb_imageForLayer:viewOrLayer]; + } else { + [NSException raise:@"Only UIView and CALayer classes can be snapshotted" format:@"%@", viewOrLayer]; + } + return nil; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift new file mode 100644 index 0000000..e1b2a4f --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2015, Facebook, Inc. +* All rights reserved. +* +* This source code is licensed under the BSD-style license found in the +* LICENSE file in the root directory of this source tree. An additional grant +* of patent rights can be found in the PATENTS file in the same directory. +* +*/ + +public extension FBSnapshotTestCase { + public func FBSnapshotVerifyView(view: UIView, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), file: String = __FILE__, line: UInt = __LINE__) { + let envReferenceImageDirectory = NSProcessInfo.processInfo().environment["FB_REFERENCE_IMAGE_DIR"] as? String + var error: NSError? + + if let envReferenceImageDirectory = envReferenceImageDirectory { + for suffix in suffixes { + let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" + let comparisonSuccess = compareSnapshotOfView(view, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: 0, error: &error) + if comparisonSuccess || recordMode { + break + } + + assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) + assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) + } + } else { + assert(false, message: "Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.", file: file, line: line) + } + } + + public func FBSnapshotVerifyLayer(layer: CALayer, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), file: String = __FILE__, line: UInt = __LINE__) { + let envReferenceImageDirectory = NSProcessInfo.processInfo().environment["FB_REFERENCE_IMAGE_DIR"] as? String + var error: NSError? + var comparisonSuccess = false + + if let envReferenceImageDirectory = envReferenceImageDirectory { + for suffix in suffixes { + let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" + comparisonSuccess = compareSnapshotOfLayer(layer, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: 0, error: &error) + if comparisonSuccess || recordMode { + break + } + + assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) + assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) + } + } else { + XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") + } + } + + func assert(assertion: Bool, message: String, file: String, line: UInt) { + if !assertion { + XCTFail(message, file: file, line: line) + } + } +} diff --git a/Example/Pods/FBSnapshotTestCase/LICENSE b/Example/Pods/FBSnapshotTestCase/LICENSE new file mode 100644 index 0000000..2dd780c --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/LICENSE @@ -0,0 +1,29 @@ +BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Example/Pods/FBSnapshotTestCase/README.md b/Example/Pods/FBSnapshotTestCase/README.md new file mode 100644 index 0000000..c53ac2f --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/README.md @@ -0,0 +1,98 @@ +FBSnapshotTestCase +====================== + +[![Build Status](https://travis-ci.org/facebook/ios-snapshot-test-case.svg)](https://travis-ci.org/facebook/ios-snapshot-test-case) [![Cocoa Pod Version](https://cocoapod-badges.herokuapp.com/v/FBSnapshotTestCase/badge.svg)](http://cocoadocs.org/docsets/FBSnapshotTestCase/) + +What it does +------------ + +A "snapshot test case" takes a configured `UIView` or `CALayer` and uses the +`renderInContext:` method to get an image snapshot of its contents. It +compares this snapshot to a "reference image" stored in your source code +repository and fails the test if the two images don't match. + +Why? +---- + +At Facebook we write a lot of UI code. As you might imagine, each type of +feed story is rendered using a subclass of `UIView`. There are a lot of edge +cases that we want to handle correctly: + +- What if there is more text than can fit in the space available? +- What if an image doesn't match the size of an image view? +- What should the highlighted state look like? + +It's straightforward to test logic code, but less obvious how you should test +views. You can do a lot of rectangle asserts, but these are hard to understand +or visualize. Looking at an image diff shows you exactly what changed and how +it will look to users. + +We developed `FBSnapshotTestCase` to make snapshot tests easy. + +Installation with CocoaPods +--------------------------- + +1. Add the following lines to your Podfile: + + ``` + target "Tests" do + pod 'FBSnapshotTestCase' + end + ``` + + If you support iOS 7 use `FBSnapshotTestCase/Core` instead, which doesn't contain Swift support. + + Replace "Tests" with the name of your test project. + +2. Define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should + point to the directory where you want reference images to be stored. At Facebook, + we normally use this: + +|Name|Value| +|:---|:----| +|`FB_REFERENCE_IMAGE_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages`| + + +![](FBSnapshotTestCaseDemo/Scheme_FB_REFERENCE_IMAGE_DIR.png) + +Creating a snapshot test +------------------------ + +1. Subclass `FBSnapshotTestCase` instead of `XCTestCase`. +2. From within your test, use `FBSnapshotVerifyView`. +3. Run the test once with `self.recordMode = YES;` in the test's `-setUp` + method. (This creates the reference images on disk.) +4. Remove the line enabling record mode and run the test. + +Features +-------- + +- Automatically names reference images on disk according to test class and + selector. +- Prints a descriptive error message to the console on failure. (Bonus: + failure message includes a one-line command to see an image diff if + you have [Kaleidoscope](http://www.kaleidoscopeapp.com) installed.) +- Supply an optional "identifier" if you want to perform multiple snapshots + in a single test method. +- Support for `CALayer` via `FBSnapshotVerifyLayer`. +- `usesDrawViewHierarchyInRect` to handle cases like `UIVisualEffect`, `UIAppearance` and Size Classes. + +Notes +----- + +Your unit test must be an "application test", not a "logic test." (That is, it +must be run within the Simulator so that it has access to UIKit.) In Xcode 5 +and later new projects only offer application tests, but older projects will +have separate targets for the two types. + +Authors +------- + +`FBSnapshotTestCase` was written at Facebook by +[Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by +[Todd Krabach](https://facebook.com/toddkrabach). + +License +------- + +`FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h new file mode 120000 index 0000000..2925eab --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h new file mode 120000 index 0000000..6127a30 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h new file mode 120000 index 0000000..4a7dea1 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h new file mode 120000 index 0000000..2fd266d --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h new file mode 120000 index 0000000..2ecee67 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h new file mode 120000 index 0000000..577a4cb --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/HamburgerButton.podspec.json b/Example/Pods/Local Podspecs/HamburgerButton.podspec.json new file mode 100644 index 0000000..659cee7 --- /dev/null +++ b/Example/Pods/Local Podspecs/HamburgerButton.podspec.json @@ -0,0 +1,25 @@ +{ + "name": "HamburgerButton", + "version": "0.1.0", + "summary": "A short description of HamburgerButton.", + "description": "An optional longer description of HamburgerButton\n\n* Markdown format.\n* Don't worry about the indent, we strip it!", + "homepage": "https://github.com//HamburgerButton", + "license": "MIT", + "authors": { + "Giuseppe Nucifora": "me@giuseppenucifora.com" + }, + "source": { + "git": "https://github.com//HamburgerButton.git", + "tag": "0.1.0" + }, + "platforms": { + "ios": "7.0" + }, + "requires_arc": true, + "source_files": "Pod/Classes/**/*", + "resource_bundles": { + "HamburgerButton": [ + "Pod/Assets/*.png" + ] + } +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000..0cd44e9 --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,21 @@ +PODS: + - FBSnapshotTestCase (2.0.3): + - FBSnapshotTestCase/SwiftSupport (= 2.0.3) + - FBSnapshotTestCase/Core (2.0.3) + - FBSnapshotTestCase/SwiftSupport (2.0.3): + - FBSnapshotTestCase/Core + - HamburgerButton (0.1.0) + +DEPENDENCIES: + - FBSnapshotTestCase + - HamburgerButton (from `../`) + +EXTERNAL SOURCES: + HamburgerButton: + :path: ../ + +SPEC CHECKSUMS: + FBSnapshotTestCase: d0eeca6bf87958e088b254396ae66873f971cfb1 + HamburgerButton: 7c98f3258cc3b794872532fe825da3ef797adbb3 + +COCOAPODS: 0.38.2 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cbf230e --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1019 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00C5ED9602D45B2B9AB3A61AD6085BD4 /* Pods-HamburgerButton_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F12C8BD763B2658352EF9AF2E657CC6 /* Pods-HamburgerButton_Example-dummy.m */; }; + 0B7F951B9C84228107DCF5FE532990C7 /* HamburgerButton.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B018B99C96DEFBF4E2115361CBFDA031 /* HamburgerButton.bundle */; }; + 122066F54AB32EC9C70FF010078E2BFC /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F468BFA5D26D1C563E9F8087AE7FDBD5 /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 17FF1BF851F42CCE7CEA1A3573781AF4 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF425CDB60D53E7418590A03B490F634 /* SwiftSupport.swift */; }; + 3A4DCDBEEBAB580D56C69715680B9F62 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EE2B5000D752EF3F63A134C2C1960C4 /* Foundation.framework */; }; + 427DB164362AB28B424EDBD75CE6B114 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EE2B5000D752EF3F63A134C2C1960C4 /* Foundation.framework */; }; + 515E48BEDF072BF53F877B9D209C08A2 /* Pods-HamburgerButton_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCDBB94ED71F92D65F506A60ED28FCC /* Pods-HamburgerButton_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58BCF607F3A15B367DEAFDDD24430249 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EE2B5000D752EF3F63A134C2C1960C4 /* Foundation.framework */; }; + 5A77C5F8806CD8AB6551AA900C5B903D /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = EFE04F01AB5AFE6DB969F3254FCA23AC /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68A040D61B6F79F400F5A8C9 /* LBHamburgerButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 68A040D41B6F79F400F5A8C9 /* LBHamburgerButton.m */; }; + 68A040D91B6F7A1100F5A8C9 /* LBHamburgerButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 68A040D81B6F7A1100F5A8C9 /* LBHamburgerButton.h */; }; + 705635138A2651EC4E1DDA39EB49F7E5 /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E23C46F71076CF4B5EACD488322C34 /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 70AF9768A079CE1332666E1F4DED6B90 /* HamburgerButton-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 05B5ECBFF76124646668783FA77197F6 /* HamburgerButton-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7163D6C2D4E42DE2E0030D74736DEA86 /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F81BFFCB8C34D40F36B2C468207F69 /* FBSnapshotTestCasePlatform.m */; }; + 71F86F7C428FF4AA7A059F25EC87B033 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EE2B5000D752EF3F63A134C2C1960C4 /* Foundation.framework */; }; + 779EEFAADC9462CC073AC24DF06C579E /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A8F43B5A8C25FE501B3085B04E59978 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 77D493B12A413B4971E66AEBD2DF7384 /* Pods-HamburgerButton_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 811B47B130BD9A62E09567FE8FCB0796 /* Pods-HamburgerButton_Tests-dummy.m */; }; + 7BC6D15A2C4F2757D7164D9973F56BBD /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = BA47052B645BFA4E9EA2C1091C1B8C0B /* UIImage+Diff.m */; }; + 8058472FCDFCD7BC08B86B402703D764 /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = 08CA195396AAF16773B02157E6038191 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 859A75A6F732CA92DDDAF17F8BD36EC3 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = FF7CE48EFAD9A3CEA07D7F2958DC224F /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8CB94E6CEB3C70DA9A522B69D44377C6 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = C73CA62074D1BF9D22D7E47F3F05F04C /* UIImage+Compare.m */; }; + 90E1FD3A190769CEA0B63504D88C7DDF /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F666C5D7446DD6572AB1616F1E30AA /* FBSnapshotTestCase.m */; }; + A18AB0E0A6B41F384C48365498A7B99F /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AD10D07B64816335D075D437A535566 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A512A0FDCBA1411FFF43641017B586A2 /* Pods-HamburgerButton_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 972947897347EFEE474238C017C40BD4 /* Pods-HamburgerButton_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BBCB339B6876210CB81CDC8C2AEF8708 /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E19E3632FEF9B104B04B6B00253851C /* UIImage+Snapshot.m */; }; + C0B7165ADF9662081DE5A260FC9C6824 /* HamburgerButton-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CDFDB417FCEBB965575338A496A1AAD4 /* HamburgerButton-dummy.m */; }; + CF04850F3DF1E9B1C22F59F9A881CA92 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F1AA8D42F800A1B996AF97D8B9FFE5B /* XCTest.framework */; }; + D8916754747FBAF3A987C07826AA8FA8 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 106F0533C6623B74EDB227C8FC027B8E /* FBSnapshotTestCase-dummy.m */; }; + FF4A2B692DF2C6B70CFCC181FAFD42A8 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = B427624CBD5B62469F66AC43A5D82C7D /* FBSnapshotTestController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5DF05D6F9EB5D29D19D96CD8E09D73F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A5E3C8454E430B57F66B650B070436F8; + remoteInfo = FBSnapshotTestCase; + }; + 80E80952A2808DFD37A99A68D92A6FCB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E8A2E331B17AB8F4B78978C1A9170187; + remoteInfo = HamburgerButton; + }; + 896664CAA6BBF4886DA07AF20DD2A5A8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E8A2E331B17AB8F4B78978C1A9170187; + remoteInfo = HamburgerButton; + }; + BCED431185E74B90B6ED5A0FD8752218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B38D24EE87757ECA2870EA6F2B1714AD; + remoteInfo = "HamburgerButton-HamburgerButton"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 05B5ECBFF76124646668783FA77197F6 /* HamburgerButton-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HamburgerButton-umbrella.h"; sourceTree = ""; }; + 08CA195396AAF16773B02157E6038191 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; + 106F0533C6623B74EDB227C8FC027B8E /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; + 13F9DB71C70CA0E85A5F0547A3597E3C /* Pods_HamburgerButton_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HamburgerButton_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 14824E604F439019DACCD607B0CA660E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1DE8E61523E195B79AF379E1E7AF0D53 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 257154AF1EC32B1CFF664D8EC2FDB636 /* Pods-HamburgerButton_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-HamburgerButton_Tests.modulemap"; sourceTree = ""; }; + 2F1AA8D42F800A1B996AF97D8B9FFE5B /* 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; }; + 413DF9CB4DCDFF1505BAFA009CF49F27 /* HamburgerButton.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = HamburgerButton.modulemap; sourceTree = ""; }; + 469D88E90A130481766EEE004A0925FD /* Pods-HamburgerButton_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-HamburgerButton_Tests.debug.xcconfig"; sourceTree = ""; }; + 4BD2D026071D7FD2BE689CCD1D3B9EF6 /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; + 4C9DB4DA9DBEBDA43C5436275C4311D7 /* FBSnapshotTestCase-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "FBSnapshotTestCase-Private.xcconfig"; sourceTree = ""; }; + 4EE2B5000D752EF3F63A134C2C1960C4 /* 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; }; + 5A8F43B5A8C25FE501B3085B04E59978 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; + 5D95B12EE01FCD41FA1A4E2EE9EBCF9F /* Pods-HamburgerButton_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-HamburgerButton_Example.release.xcconfig"; sourceTree = ""; }; + 5F12C8BD763B2658352EF9AF2E657CC6 /* Pods-HamburgerButton_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-HamburgerButton_Example-dummy.m"; sourceTree = ""; }; + 62047B34C8834B6FEF7C1CFDF302EF07 /* Pods-HamburgerButton_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-HamburgerButton_Tests-acknowledgements.plist"; sourceTree = ""; }; + 62ED241CD5B3D0C857D0D4547192F2A7 /* Pods-HamburgerButton_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-HamburgerButton_Example-frameworks.sh"; sourceTree = ""; }; + 65F666C5D7446DD6572AB1616F1E30AA /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; + 68A040D41B6F79F400F5A8C9 /* LBHamburgerButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LBHamburgerButton.m; sourceTree = ""; }; + 68A040D81B6F7A1100F5A8C9 /* LBHamburgerButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LBHamburgerButton.h; sourceTree = ""; }; + 6AD10D07B64816335D075D437A535566 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; + 6EDB3F182EE21701574EACF70E15271B /* Pods-HamburgerButton_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-HamburgerButton_Example.modulemap"; sourceTree = ""; }; + 714626102659630456832C4A58C340DD /* Pods-HamburgerButton_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-HamburgerButton_Example-acknowledgements.markdown"; sourceTree = ""; }; + 731545587BE276FB10A5586389E9CAF2 /* Pods-HamburgerButton_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-HamburgerButton_Tests.release.xcconfig"; sourceTree = ""; }; + 76F81BFFCB8C34D40F36B2C468207F69 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; + 77E23C46F71076CF4B5EACD488322C34 /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; + 811B47B130BD9A62E09567FE8FCB0796 /* Pods-HamburgerButton_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-HamburgerButton_Tests-dummy.m"; sourceTree = ""; }; + 8B1CF639B3C3F3624FA206999B56B0F6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9008155BDFCCA40E8323C0B32BD6C36B /* HamburgerButton.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HamburgerButton.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 947EDA8B98AB434928FAFC655DB528D6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 972947897347EFEE474238C017C40BD4 /* Pods-HamburgerButton_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-HamburgerButton_Tests-umbrella.h"; sourceTree = ""; }; + 9E19E3632FEF9B104B04B6B00253851C /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; + 9FCDBB94ED71F92D65F506A60ED28FCC /* Pods-HamburgerButton_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-HamburgerButton_Example-umbrella.h"; sourceTree = ""; }; + A48AFAE54A63F3C0079D07FF3DA2DA1C /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + A86F994476C37044187A36076E71009B /* Pods-HamburgerButton_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-HamburgerButton_Tests-frameworks.sh"; sourceTree = ""; }; + ABBFB30F05A4EB2FE4F22CB71B966513 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AF425CDB60D53E7418590A03B490F634 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; + B018B99C96DEFBF4E2115361CBFDA031 /* HamburgerButton.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HamburgerButton.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + B427624CBD5B62469F66AC43A5D82C7D /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; + B6EE77B3672BAEABAA1B4DB3744A1B06 /* Pods_HamburgerButton_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HamburgerButton_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BA47052B645BFA4E9EA2C1091C1B8C0B /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BB24C554084930B91B11848797894844 /* HamburgerButton-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HamburgerButton-prefix.pch"; sourceTree = ""; }; + C0412153695F6CE8364A34919B830ABF /* Pods-HamburgerButton_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-HamburgerButton_Tests-resources.sh"; sourceTree = ""; }; + C73CA62074D1BF9D22D7E47F3F05F04C /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; + CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "HamburgerButton-Private.xcconfig"; sourceTree = ""; }; + CDFDB417FCEBB965575338A496A1AAD4 /* HamburgerButton-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HamburgerButton-dummy.m"; sourceTree = ""; }; + D5941B99E2DCD9F3DF38C30ED76BA164 /* HamburgerButton.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HamburgerButton.xcconfig; sourceTree = ""; }; + E248B6CF37B39A927724C986E981F7D8 /* Pods-HamburgerButton_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-HamburgerButton_Tests-acknowledgements.markdown"; sourceTree = ""; }; + E3F6C51A8C61821D51FB13B8CA1A6567 /* Pods-HamburgerButton_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-HamburgerButton_Example.debug.xcconfig"; sourceTree = ""; }; + E49543E9FC8F1146CEAFD27D68DB0A01 /* Pods-HamburgerButton_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-HamburgerButton_Example-acknowledgements.plist"; sourceTree = ""; }; + E6AEF9CC1794C216962A1A9DE2B1B8BF /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; + EE231B86E665BE7FAA63E753D06321D4 /* Pods-HamburgerButton_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-HamburgerButton_Example-resources.sh"; sourceTree = ""; }; + EFE04F01AB5AFE6DB969F3254FCA23AC /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; + F468BFA5D26D1C563E9F8087AE7FDBD5 /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = ""; }; + FF7CE48EFAD9A3CEA07D7F2958DC224F /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1B54F50D61A801D84473A578EAA23648 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3A4DCDBEEBAB580D56C69715680B9F62 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2856E64C9B205FF009D405E755612CDF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 58BCF607F3A15B367DEAFDDD24430249 /* Foundation.framework in Frameworks */, + CF04850F3DF1E9B1C22F59F9A881CA92 /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 564319DA63E0C4968134500131A020FE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 427DB164362AB28B424EDBD75CE6B114 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5E705B70C45F13D3FE5FB652BB8BDD85 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 71F86F7C428FF4AA7A059F25EC87B033 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A6F04AF4E596D897E56105B7BB0A2CAF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3A8CC87DDEE0ADE5BD022FDF57E1A253 /* Pods-HamburgerButton_Tests */ = { + isa = PBXGroup; + children = ( + 14824E604F439019DACCD607B0CA660E /* Info.plist */, + 257154AF1EC32B1CFF664D8EC2FDB636 /* Pods-HamburgerButton_Tests.modulemap */, + E248B6CF37B39A927724C986E981F7D8 /* Pods-HamburgerButton_Tests-acknowledgements.markdown */, + 62047B34C8834B6FEF7C1CFDF302EF07 /* Pods-HamburgerButton_Tests-acknowledgements.plist */, + 811B47B130BD9A62E09567FE8FCB0796 /* Pods-HamburgerButton_Tests-dummy.m */, + A86F994476C37044187A36076E71009B /* Pods-HamburgerButton_Tests-frameworks.sh */, + C0412153695F6CE8364A34919B830ABF /* Pods-HamburgerButton_Tests-resources.sh */, + 972947897347EFEE474238C017C40BD4 /* Pods-HamburgerButton_Tests-umbrella.h */, + 469D88E90A130481766EEE004A0925FD /* Pods-HamburgerButton_Tests.debug.xcconfig */, + 731545587BE276FB10A5586389E9CAF2 /* Pods-HamburgerButton_Tests.release.xcconfig */, + ); + name = "Pods-HamburgerButton_Tests"; + path = "Target Support Files/Pods-HamburgerButton_Tests"; + sourceTree = ""; + }; + 40BE61F5DE3FFCAEFFC65F28BCCD5CA3 /* Pod */ = { + isa = PBXGroup; + children = ( + BBD2ED9DD364515FF55A35B0F3C39A1A /* Classes */, + ); + path = Pod; + sourceTree = ""; + }; + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 672D1320B537524AB3A5A6B59F3A0AB5 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 52AE899D8B5E82245C5406997506EDFD /* FBSnapshotTestCase */ = { + isa = PBXGroup; + children = ( + 78B8B06429C9DADE35340BE6C4B7C020 /* Core */, + ECB35126A6E5AC04DA6E5CFD5988508A /* Support Files */, + C0D3A88223D43E2EE28E545D73C4CC1C /* SwiftSupport */, + ); + path = FBSnapshotTestCase; + sourceTree = ""; + }; + 65A731238945A624B79D67A6022DFD6A /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + E5BF7210C5519DA2AE7674A5C182273C /* Pods-HamburgerButton_Example */, + 3A8CC87DDEE0ADE5BD022FDF57E1A253 /* Pods-HamburgerButton_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 672D1320B537524AB3A5A6B59F3A0AB5 /* iOS */ = { + isa = PBXGroup; + children = ( + 4EE2B5000D752EF3F63A134C2C1960C4 /* Foundation.framework */, + 2F1AA8D42F800A1B996AF97D8B9FFE5B /* XCTest.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 78B8B06429C9DADE35340BE6C4B7C020 /* Core */ = { + isa = PBXGroup; + children = ( + 6AD10D07B64816335D075D437A535566 /* FBSnapshotTestCase.h */, + 65F666C5D7446DD6572AB1616F1E30AA /* FBSnapshotTestCase.m */, + EFE04F01AB5AFE6DB969F3254FCA23AC /* FBSnapshotTestCasePlatform.h */, + 76F81BFFCB8C34D40F36B2C468207F69 /* FBSnapshotTestCasePlatform.m */, + 08CA195396AAF16773B02157E6038191 /* FBSnapshotTestController.h */, + B427624CBD5B62469F66AC43A5D82C7D /* FBSnapshotTestController.m */, + 77E23C46F71076CF4B5EACD488322C34 /* UIImage+Compare.h */, + C73CA62074D1BF9D22D7E47F3F05F04C /* UIImage+Compare.m */, + FF7CE48EFAD9A3CEA07D7F2958DC224F /* UIImage+Diff.h */, + BA47052B645BFA4E9EA2C1091C1B8C0B /* UIImage+Diff.m */, + 5A8F43B5A8C25FE501B3085B04E59978 /* UIImage+Snapshot.h */, + 9E19E3632FEF9B104B04B6B00253851C /* UIImage+Snapshot.m */, + ); + name = Core; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + DC8592AFE0A804EE0A7BE013E9E40E49 /* Development Pods */, + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, + FBD2D672921284E66F309CA3462F84D6 /* Pods */, + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, + 65A731238945A624B79D67A6022DFD6A /* Targets Support Files */, + ); + sourceTree = ""; + }; + A5D66CFA44F253AA421AEF649AC84EBD /* HamburgerButton */ = { + isa = PBXGroup; + children = ( + 40BE61F5DE3FFCAEFFC65F28BCCD5CA3 /* Pod */, + B379CA72A7AB83E27136BD2BFE073B6C /* Support Files */, + ); + name = HamburgerButton; + path = ../..; + sourceTree = ""; + }; + B379CA72A7AB83E27136BD2BFE073B6C /* Support Files */ = { + isa = PBXGroup; + children = ( + 413DF9CB4DCDFF1505BAFA009CF49F27 /* HamburgerButton.modulemap */, + D5941B99E2DCD9F3DF38C30ED76BA164 /* HamburgerButton.xcconfig */, + CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */, + CDFDB417FCEBB965575338A496A1AAD4 /* HamburgerButton-dummy.m */, + BB24C554084930B91B11848797894844 /* HamburgerButton-prefix.pch */, + 05B5ECBFF76124646668783FA77197F6 /* HamburgerButton-umbrella.h */, + 947EDA8B98AB434928FAFC655DB528D6 /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/HamburgerButton"; + sourceTree = ""; + }; + BBD2ED9DD364515FF55A35B0F3C39A1A /* Classes */ = { + isa = PBXGroup; + children = ( + 68A040D81B6F7A1100F5A8C9 /* LBHamburgerButton.h */, + 68A040D41B6F79F400F5A8C9 /* LBHamburgerButton.m */, + ); + path = Classes; + sourceTree = ""; + }; + C0D3A88223D43E2EE28E545D73C4CC1C /* SwiftSupport */ = { + isa = PBXGroup; + children = ( + AF425CDB60D53E7418590A03B490F634 /* SwiftSupport.swift */, + ); + name = SwiftSupport; + sourceTree = ""; + }; + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { + isa = PBXGroup; + children = ( + 1DE8E61523E195B79AF379E1E7AF0D53 /* FBSnapshotTestCase.framework */, + B018B99C96DEFBF4E2115361CBFDA031 /* HamburgerButton.bundle */, + 9008155BDFCCA40E8323C0B32BD6C36B /* HamburgerButton.framework */, + 13F9DB71C70CA0E85A5F0547A3597E3C /* Pods_HamburgerButton_Example.framework */, + B6EE77B3672BAEABAA1B4DB3744A1B06 /* Pods_HamburgerButton_Tests.framework */, + ); + name = Products; + sourceTree = ""; + }; + DC8592AFE0A804EE0A7BE013E9E40E49 /* Development Pods */ = { + isa = PBXGroup; + children = ( + A5D66CFA44F253AA421AEF649AC84EBD /* HamburgerButton */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + E5BF7210C5519DA2AE7674A5C182273C /* Pods-HamburgerButton_Example */ = { + isa = PBXGroup; + children = ( + 8B1CF639B3C3F3624FA206999B56B0F6 /* Info.plist */, + 6EDB3F182EE21701574EACF70E15271B /* Pods-HamburgerButton_Example.modulemap */, + 714626102659630456832C4A58C340DD /* Pods-HamburgerButton_Example-acknowledgements.markdown */, + E49543E9FC8F1146CEAFD27D68DB0A01 /* Pods-HamburgerButton_Example-acknowledgements.plist */, + 5F12C8BD763B2658352EF9AF2E657CC6 /* Pods-HamburgerButton_Example-dummy.m */, + 62ED241CD5B3D0C857D0D4547192F2A7 /* Pods-HamburgerButton_Example-frameworks.sh */, + EE231B86E665BE7FAA63E753D06321D4 /* Pods-HamburgerButton_Example-resources.sh */, + 9FCDBB94ED71F92D65F506A60ED28FCC /* Pods-HamburgerButton_Example-umbrella.h */, + E3F6C51A8C61821D51FB13B8CA1A6567 /* Pods-HamburgerButton_Example.debug.xcconfig */, + 5D95B12EE01FCD41FA1A4E2EE9EBCF9F /* Pods-HamburgerButton_Example.release.xcconfig */, + ); + name = "Pods-HamburgerButton_Example"; + path = "Target Support Files/Pods-HamburgerButton_Example"; + sourceTree = ""; + }; + ECB35126A6E5AC04DA6E5CFD5988508A /* Support Files */ = { + isa = PBXGroup; + children = ( + 4BD2D026071D7FD2BE689CCD1D3B9EF6 /* FBSnapshotTestCase.modulemap */, + E6AEF9CC1794C216962A1A9DE2B1B8BF /* FBSnapshotTestCase.xcconfig */, + 4C9DB4DA9DBEBDA43C5436275C4311D7 /* FBSnapshotTestCase-Private.xcconfig */, + 106F0533C6623B74EDB227C8FC027B8E /* FBSnapshotTestCase-dummy.m */, + A48AFAE54A63F3C0079D07FF3DA2DA1C /* FBSnapshotTestCase-prefix.pch */, + F468BFA5D26D1C563E9F8087AE7FDBD5 /* FBSnapshotTestCase-umbrella.h */, + ABBFB30F05A4EB2FE4F22CB71B966513 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FBSnapshotTestCase"; + sourceTree = ""; + }; + FBD2D672921284E66F309CA3462F84D6 /* Pods */ = { + isa = PBXGroup; + children = ( + 52AE899D8B5E82245C5406997506EDFD /* FBSnapshotTestCase */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2C8E797A4F24E32F97D3A0C66B53CE9B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 515E48BEDF072BF53F877B9D209C08A2 /* Pods-HamburgerButton_Example-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 406D8A5FA8E3D8ABA1A9CBCA1E325B3B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 122066F54AB32EC9C70FF010078E2BFC /* FBSnapshotTestCase-umbrella.h in Headers */, + A18AB0E0A6B41F384C48365498A7B99F /* FBSnapshotTestCase.h in Headers */, + 5A77C5F8806CD8AB6551AA900C5B903D /* FBSnapshotTestCasePlatform.h in Headers */, + 8058472FCDFCD7BC08B86B402703D764 /* FBSnapshotTestController.h in Headers */, + 705635138A2651EC4E1DDA39EB49F7E5 /* UIImage+Compare.h in Headers */, + 859A75A6F732CA92DDDAF17F8BD36EC3 /* UIImage+Diff.h in Headers */, + 779EEFAADC9462CC073AC24DF06C579E /* UIImage+Snapshot.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CF9BE5761ED9379693735214E191A342 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 68A040D91B6F7A1100F5A8C9 /* LBHamburgerButton.h in Headers */, + 70AF9768A079CE1332666E1F4DED6B90 /* HamburgerButton-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D389A034AB72F55BCA55C0CDB401A7A6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A512A0FDCBA1411FFF43641017B586A2 /* Pods-HamburgerButton_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1894885213A4F562D91EF8E37E3E2F5E /* Pods-HamburgerButton_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 779076A281C41549230F89FBD1BB68C9 /* Build configuration list for PBXNativeTarget "Pods-HamburgerButton_Tests" */; + buildPhases = ( + AC9854AC23BDD87634B62D5204F1C4D1 /* Sources */, + 5E705B70C45F13D3FE5FB652BB8BDD85 /* Frameworks */, + D389A034AB72F55BCA55C0CDB401A7A6 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 73690DAF65B31502BF0B5C24C45D9D37 /* PBXTargetDependency */, + B8B9E8D7823A879FE5350903C4B8042F /* PBXTargetDependency */, + ); + name = "Pods-HamburgerButton_Tests"; + productName = "Pods-HamburgerButton_Tests"; + productReference = B6EE77B3672BAEABAA1B4DB3744A1B06 /* Pods_HamburgerButton_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; + 835CA8410E338A12179CE4AE3052A2B2 /* Pods-HamburgerButton_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = E31DCCDD46AA5BFFB60F517865EC7152 /* Build configuration list for PBXNativeTarget "Pods-HamburgerButton_Example" */; + buildPhases = ( + 14BD130DED634CD187FD09647F6F8277 /* Sources */, + 564319DA63E0C4968134500131A020FE /* Frameworks */, + 2C8E797A4F24E32F97D3A0C66B53CE9B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + CD8759343A5133AF92F78B1CB6946272 /* PBXTargetDependency */, + ); + name = "Pods-HamburgerButton_Example"; + productName = "Pods-HamburgerButton_Example"; + productReference = 13F9DB71C70CA0E85A5F0547A3597E3C /* Pods_HamburgerButton_Example.framework */; + productType = "com.apple.product-type.framework"; + }; + A5E3C8454E430B57F66B650B070436F8 /* FBSnapshotTestCase */ = { + isa = PBXNativeTarget; + buildConfigurationList = 402DF0CF18F8F970679E91754B3ADAA9 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; + buildPhases = ( + 39972E59A680967AA2AF46CFDF9339D4 /* Sources */, + 2856E64C9B205FF009D405E755612CDF /* Frameworks */, + 406D8A5FA8E3D8ABA1A9CBCA1E325B3B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FBSnapshotTestCase; + productName = FBSnapshotTestCase; + productReference = 1DE8E61523E195B79AF379E1E7AF0D53 /* FBSnapshotTestCase.framework */; + productType = "com.apple.product-type.framework"; + }; + B38D24EE87757ECA2870EA6F2B1714AD /* HamburgerButton-HamburgerButton */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1839BAC4FC28918A9A881273CB516A92 /* Build configuration list for PBXNativeTarget "HamburgerButton-HamburgerButton" */; + buildPhases = ( + E383DCCB69DA7D629DA43096D05C68E9 /* Sources */, + A6F04AF4E596D897E56105B7BB0A2CAF /* Frameworks */, + CE0472F3FD7D06F1A1EF619A53C1BBFE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "HamburgerButton-HamburgerButton"; + productName = "HamburgerButton-HamburgerButton"; + productReference = B018B99C96DEFBF4E2115361CBFDA031 /* HamburgerButton.bundle */; + productType = "com.apple.product-type.bundle"; + }; + E8A2E331B17AB8F4B78978C1A9170187 /* HamburgerButton */ = { + isa = PBXNativeTarget; + buildConfigurationList = A5886673B63068CE7318380CA4706C05 /* Build configuration list for PBXNativeTarget "HamburgerButton" */; + buildPhases = ( + CB425D55471D032B5CDC0A2C3CEB2068 /* Sources */, + 1B54F50D61A801D84473A578EAA23648 /* Frameworks */, + CD6E0D3A855D1C059FF5FB40EC530547 /* Resources */, + CF9BE5761ED9379693735214E191A342 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + B1EF3BE72F15D0F792823CCE6B179AA9 /* PBXTargetDependency */, + ); + name = HamburgerButton; + productName = HamburgerButton; + productReference = 9008155BDFCCA40E8323C0B32BD6C36B /* HamburgerButton.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = CCA510CFBEA2D207524CDA0D73C3B561 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A5E3C8454E430B57F66B650B070436F8 /* FBSnapshotTestCase */, + E8A2E331B17AB8F4B78978C1A9170187 /* HamburgerButton */, + B38D24EE87757ECA2870EA6F2B1714AD /* HamburgerButton-HamburgerButton */, + 835CA8410E338A12179CE4AE3052A2B2 /* Pods-HamburgerButton_Example */, + 1894885213A4F562D91EF8E37E3E2F5E /* Pods-HamburgerButton_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CD6E0D3A855D1C059FF5FB40EC530547 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B7F951B9C84228107DCF5FE532990C7 /* HamburgerButton.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CE0472F3FD7D06F1A1EF619A53C1BBFE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 14BD130DED634CD187FD09647F6F8277 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00C5ED9602D45B2B9AB3A61AD6085BD4 /* Pods-HamburgerButton_Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39972E59A680967AA2AF46CFDF9339D4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D8916754747FBAF3A987C07826AA8FA8 /* FBSnapshotTestCase-dummy.m in Sources */, + 90E1FD3A190769CEA0B63504D88C7DDF /* FBSnapshotTestCase.m in Sources */, + 7163D6C2D4E42DE2E0030D74736DEA86 /* FBSnapshotTestCasePlatform.m in Sources */, + FF4A2B692DF2C6B70CFCC181FAFD42A8 /* FBSnapshotTestController.m in Sources */, + 17FF1BF851F42CCE7CEA1A3573781AF4 /* SwiftSupport.swift in Sources */, + 8CB94E6CEB3C70DA9A522B69D44377C6 /* UIImage+Compare.m in Sources */, + 7BC6D15A2C4F2757D7164D9973F56BBD /* UIImage+Diff.m in Sources */, + BBCB339B6876210CB81CDC8C2AEF8708 /* UIImage+Snapshot.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AC9854AC23BDD87634B62D5204F1C4D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 77D493B12A413B4971E66AEBD2DF7384 /* Pods-HamburgerButton_Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB425D55471D032B5CDC0A2C3CEB2068 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C0B7165ADF9662081DE5A260FC9C6824 /* HamburgerButton-dummy.m in Sources */, + 68A040D61B6F79F400F5A8C9 /* LBHamburgerButton.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E383DCCB69DA7D629DA43096D05C68E9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 73690DAF65B31502BF0B5C24C45D9D37 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FBSnapshotTestCase; + target = A5E3C8454E430B57F66B650B070436F8 /* FBSnapshotTestCase */; + targetProxy = 5DF05D6F9EB5D29D19D96CD8E09D73F8 /* PBXContainerItemProxy */; + }; + B1EF3BE72F15D0F792823CCE6B179AA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "HamburgerButton-HamburgerButton"; + target = B38D24EE87757ECA2870EA6F2B1714AD /* HamburgerButton-HamburgerButton */; + targetProxy = BCED431185E74B90B6ED5A0FD8752218 /* PBXContainerItemProxy */; + }; + B8B9E8D7823A879FE5350903C4B8042F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = HamburgerButton; + target = E8A2E331B17AB8F4B78978C1A9170187 /* HamburgerButton */; + targetProxy = 80E80952A2808DFD37A99A68D92A6FCB /* PBXContainerItemProxy */; + }; + CD8759343A5133AF92F78B1CB6946272 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = HamburgerButton; + target = E8A2E331B17AB8F4B78978C1A9170187 /* HamburgerButton */; + targetProxy = 896664CAA6BBF4886DA07AF20DD2A5A8 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 03CA91998D6773EC5D02B3DB87B8353E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 0B57334D6C23DADAA4F7D802A5760EB2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 1E73431A253C332B71E004A30EBF9224 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E3F6C51A8C61821D51FB13B8CA1A6567 /* Pods-HamburgerButton_Example.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-HamburgerButton_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_HamburgerButton_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 52B566C968256DA4F6E14D86623FF392 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 469D88E90A130481766EEE004A0925FD /* Pods-HamburgerButton_Tests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-HamburgerButton_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_HamburgerButton_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 541CF04F57DBC0A4C56518DECACC621A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 731545587BE276FB10A5586389E9CAF2 /* Pods-HamburgerButton_Tests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-HamburgerButton_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_HamburgerButton_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 62B0A04D8B13C57BE6E5204F9BFCD976 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.1.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.1.0; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/HamburgerButton/HamburgerButton-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/HamburgerButton/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/HamburgerButton/HamburgerButton.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = HamburgerButton; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7ED677F20E4DD731C8698E44C60C7BDA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = HamburgerButton; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 7FC9F47C973C41C10CBBAB8624EA1025 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.1.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.1.0; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/HamburgerButton/HamburgerButton-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/HamburgerButton/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/HamburgerButton/HamburgerButton.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = HamburgerButton; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 92CFA2F50A90ECA8CB3DDEE37FED101D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4C9DB4DA9DBEBDA43C5436275C4311D7 /* FBSnapshotTestCase-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.0.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = FBSnapshotTestCase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 9DAC6577D0C56D618DE1F8F282AD6FC9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4C9DB4DA9DBEBDA43C5436275C4311D7 /* FBSnapshotTestCase-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.0.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = FBSnapshotTestCase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B8B02B951F2A5DAD755F9E690DCFAFEF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5D95B12EE01FCD41FA1A4E2EE9EBCF9F /* Pods-HamburgerButton_Example.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-HamburgerButton_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_HamburgerButton_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + EB403428C48336B397FF764ECA6AF4AF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CD2E0510976255F0AEA88974A5B7E8F8 /* HamburgerButton-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = HamburgerButton; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1839BAC4FC28918A9A881273CB516A92 /* Build configuration list for PBXNativeTarget "HamburgerButton-HamburgerButton" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7ED677F20E4DD731C8698E44C60C7BDA /* Debug */, + EB403428C48336B397FF764ECA6AF4AF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0B57334D6C23DADAA4F7D802A5760EB2 /* Debug */, + 03CA91998D6773EC5D02B3DB87B8353E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 402DF0CF18F8F970679E91754B3ADAA9 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9DAC6577D0C56D618DE1F8F282AD6FC9 /* Debug */, + 92CFA2F50A90ECA8CB3DDEE37FED101D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 779076A281C41549230F89FBD1BB68C9 /* Build configuration list for PBXNativeTarget "Pods-HamburgerButton_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 52B566C968256DA4F6E14D86623FF392 /* Debug */, + 541CF04F57DBC0A4C56518DECACC621A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A5886673B63068CE7318380CA4706C05 /* Build configuration list for PBXNativeTarget "HamburgerButton" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7FC9F47C973C41C10CBBAB8624EA1025 /* Debug */, + 62B0A04D8B13C57BE6E5204F9BFCD976 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E31DCCDD46AA5BFFB60F517865EC7152 /* Build configuration list for PBXNativeTarget "Pods-HamburgerButton_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1E73431A253C332B71E004A30EBF9224 /* Debug */, + B8B02B951F2A5DAD755F9E690DCFAFEF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/HamburgerButton.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/HamburgerButton.xcscheme new file mode 100644 index 0000000..9719dff --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/HamburgerButton.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Private.xcconfig b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Private.xcconfig new file mode 100644 index 0000000..ee5af94 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Private.xcconfig @@ -0,0 +1,8 @@ +#include "FBSnapshotTestCase.xcconfig" +FRAMEWORK_SEARCH_PATHS = ${FBSNAPSHOTTESTCASE_FRAMEWORK_SEARCH_PATHS} +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${FBSNAPSHOTTESTCASE_OTHER_LDFLAGS} +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m new file mode 100644 index 0000000..fb0c8fe --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FBSnapshotTestCase : NSObject +@end +@implementation PodsDummy_FBSnapshotTestCase +@end diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h new file mode 100644 index 0000000..be5b7d7 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-umbrella.h @@ -0,0 +1,14 @@ +#import + +#import "FBSnapshotTestCase.h" +#import "FBSnapshotTestCasePlatform.h" +#import "UIImage+Compare.h" +#import "UIImage+Diff.h" +#import "UIImage+Snapshot.h" +#import "FBSnapshotTestCase.h" +#import "FBSnapshotTestCasePlatform.h" +#import "FBSnapshotTestController.h" + +FOUNDATION_EXPORT double FBSnapshotTestCaseVersionNumber; +FOUNDATION_EXPORT const unsigned char FBSnapshotTestCaseVersionString[]; + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap new file mode 100644 index 0000000..3acac2d --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap @@ -0,0 +1,8 @@ +framework module FBSnapshotTestCase { + umbrella header "FBSnapshotTestCase-umbrella.h" + + export * + module * { export * } + + private header "FBSnapshotTestController.h" +} diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig new file mode 100644 index 0000000..3906fc0 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig @@ -0,0 +1,2 @@ +FBSNAPSHOTTESTCASE_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" +FBSNAPSHOTTESTCASE_OTHER_LDFLAGS = -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist b/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist new file mode 100644 index 0000000..1151db3 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.0.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-Private.xcconfig b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-Private.xcconfig new file mode 100644 index 0000000..3557e69 --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-Private.xcconfig @@ -0,0 +1,5 @@ +#include "HamburgerButton.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/HamburgerButton" "${PODS_ROOT}/Headers/Public" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-dummy.m b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-dummy.m new file mode 100644 index 0000000..a3319d1 --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_HamburgerButton : NSObject +@end +@implementation PodsDummy_HamburgerButton +@end diff --git a/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-prefix.pch b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-umbrella.h b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-umbrella.h new file mode 100644 index 0000000..2748ac6 --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double HamburgerButtonVersionNumber; +FOUNDATION_EXPORT const unsigned char HamburgerButtonVersionString[]; + diff --git a/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.modulemap b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.modulemap new file mode 100644 index 0000000..3d5ab7e --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.modulemap @@ -0,0 +1,6 @@ +framework module HamburgerButton { + umbrella header "HamburgerButton-umbrella.h" + + export * + module * { export * } +} diff --git a/Pod/Classes/ReplaceMe.m b/Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.xcconfig similarity index 100% rename from Pod/Classes/ReplaceMe.m rename to Example/Pods/Target Support Files/HamburgerButton/HamburgerButton.xcconfig diff --git a/Example/Pods/Target Support Files/HamburgerButton/Info.plist b/Example/Pods/Target Support Files/HamburgerButton/Info.plist new file mode 100644 index 0000000..4ba5fa2 --- /dev/null +++ b/Example/Pods/Target Support Files/HamburgerButton/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Info.plist b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.markdown new file mode 100644 index 0000000..638fc8e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.markdown @@ -0,0 +1,26 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## HamburgerButton + +Copyright (c) 2015 Giuseppe Nucifora + +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-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.plist new file mode 100644 index 0000000..3738df1 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-acknowledgements.plist @@ -0,0 +1,56 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015 Giuseppe Nucifora <me@giuseppenucifora.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +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 + HamburgerButton + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-dummy.m b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-dummy.m new file mode 100644 index 0000000..72986bf --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_HamburgerButton_Example : NSObject +@end +@implementation PodsDummy_Pods_HamburgerButton_Example +@end diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-frameworks.sh new file mode 100755 index 0000000..3faca6a --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-frameworks.sh @@ -0,0 +1,59 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + else + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries + local basename + basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'Pods-HamburgerButton_Example/HamburgerButton.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'Pods-HamburgerButton_Example/HamburgerButton.framework' +fi diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-resources.sh b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-resources.sh new file mode 100755 index 0000000..ea685a2 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-umbrella.h new file mode 100644 index 0000000..35bf7b5 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_HamburgerButton_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_HamburgerButton_ExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.debug.xcconfig new file mode 100644 index 0000000..8dca83a --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/HamburgerButton.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "HamburgerButton" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-HamburgerButton_Example +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap new file mode 100644 index 0000000..b35a90a --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_HamburgerButton_Example { + umbrella header "Pods-HamburgerButton_Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.release.xcconfig new file mode 100644 index 0000000..8dca83a --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Example/Pods-HamburgerButton_Example.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/HamburgerButton.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "HamburgerButton" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-HamburgerButton_Example +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.markdown new file mode 100644 index 0000000..3d1ef54 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.markdown @@ -0,0 +1,59 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## HamburgerButton + +Copyright (c) 2015 Giuseppe Nucifora + +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. + + +## FBSnapshotTestCase + +BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.plist new file mode 100644 index 0000000..34ffd19 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-acknowledgements.plist @@ -0,0 +1,93 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015 Giuseppe Nucifora <me@giuseppenucifora.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +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 + HamburgerButton + Type + PSGroupSpecifier + + + FooterText + BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Title + FBSnapshotTestCase + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-dummy.m new file mode 100644 index 0000000..edee3ba --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_HamburgerButton_Tests : NSObject +@end +@implementation PodsDummy_Pods_HamburgerButton_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-frameworks.sh new file mode 100755 index 0000000..2c4a9eb --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-frameworks.sh @@ -0,0 +1,61 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + else + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries + local basename + basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'Pods-HamburgerButton_Tests/HamburgerButton.framework' + install_framework 'Pods-HamburgerButton_Tests/FBSnapshotTestCase.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'Pods-HamburgerButton_Tests/HamburgerButton.framework' + install_framework 'Pods-HamburgerButton_Tests/FBSnapshotTestCase.framework' +fi diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-resources.sh new file mode 100755 index 0000000..ea685a2 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-umbrella.h new file mode 100644 index 0000000..314552f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_HamburgerButton_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_HamburgerButton_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.debug.xcconfig new file mode 100644 index 0000000..b648f45 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.debug.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FBSnapshotTestCase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/HamburgerButton.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "HamburgerButton" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-HamburgerButton_Tests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap new file mode 100644 index 0000000..1f0dfdd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_HamburgerButton_Tests { + umbrella header "Pods-HamburgerButton_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.release.xcconfig new file mode 100644 index 0000000..b648f45 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-HamburgerButton_Tests/Pods-HamburgerButton_Tests.release.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FBSnapshotTestCase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/HamburgerButton.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "HamburgerButton" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-HamburgerButton_Tests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/HamburgerButton.podspec b/HamburgerButton.podspec index da7ca33..026cbfa 100644 --- a/HamburgerButton.podspec +++ b/HamburgerButton.podspec @@ -10,18 +10,14 @@ Pod::Spec.new do |s| s.name = "HamburgerButton" s.version = "0.1.0" - s.summary = "A short description of HamburgerButton." - s.description = <<-DESC - An optional longer description of HamburgerButton + s.summary = "Is a fork of original repository https://github.com/luongbang152/HamburgerButton with Pod support" +s.description = "LBHamburgerButton is an iOS control that displays 3 lines (hamburger) and other icon (back, close...) without using image. It has a beautiful, clean and smooth transition between 2 state like Google Material Design or \"close button\" of Paper app." - * Markdown format. - * Don't worry about the indent, we strip it! - DESC - s.homepage = "https://github.com//HamburgerButton" + s.homepage = "https://github.com/giuseppenucifora/HamburgerButton" # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" s.license = 'MIT' - s.author = { "Giuseppe Nucifora" => "me@giuseppenucifora.com" } - s.source = { :git => "https://github.com//HamburgerButton.git", :tag => s.version.to_s } + s.author = { "Giuseppe Nucifora" => "Giuseppe Nucifora" } + s.source = { :git => "https://github.com/giuseppenucifora/HamburgerButton.git", :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/' s.platform = :ios, '7.0' @@ -33,6 +29,6 @@ Pod::Spec.new do |s| } # s.public_header_files = 'Pod/Classes/**/*.h' - # s.frameworks = 'UIKit', 'MapKit' + s.frameworks = 'QuartzCore' # s.dependency 'AFNetworking', '~> 2.3' end diff --git a/Pod/Classes/LBHamburgerButton.h b/Pod/Classes/LBHamburgerButton.h new file mode 100644 index 0000000..6dd2004 --- /dev/null +++ b/Pod/Classes/LBHamburgerButton.h @@ -0,0 +1,156 @@ +// +// LBHamburgerButton.h +// Version 1.0 +// +// Created by Bang Nguyen on 26/07/2014. +// + +// This code is distributed under the terms and conditions of the MIT license. + +// Copyright (c) 2014 Bang Nguyen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +typedef enum { + /** Show back (<-) button after switch state/animate. */ + LBHamburgerButtonTypeBackButton = 0, + /** Show close (X) button after switch state/animate. */ + LBHamburgerButtonTypeCloseButton + + // other type + +} LBHamburgerButtonType; + +typedef enum { + /** Initialize state, with 3 lines (hamburger). */ + LBHamburgerButtonStateHamburger = 0, + /** State happened after animate. */ + LBHamburgerButtonStateNotHamburger +} LBHamburgerButtonState; + +/** + * LBHamburgerButton is a sub-class of UIButton, displays a hamburger button + * and other state button without using image + * + * This is a simple button with 2 state. At initialization, it has state "Hamburger" + * which means 3 lines. After switch state, it has state "Not hamburger" and + * displays a back button/a close button. + * + * This button support 2 type: + * - LBHamburgerButtonTypeBackButton - display <- after switch state + * - LBHamburgerButtonTypeCloseButton - display X after switch state + * + * Those type can be setted when initialization or manually at any time/any event. + * + */ +@interface LBHamburgerButton : UIButton + +/** + * Current state of hamburger button. + */ +@property (readonly) LBHamburgerButtonState hamburgerState; + +/** + * Type of hamburger button. + */ +@property LBHamburgerButtonType hamburgerType; + +/** + * Time for animation. Default is 0.5f. + */ +@property CFTimeInterval hamburgerAnimationDuration; + +/** + * Full contructor that initializes the button with default state. + * + * @param frame Frame of the button in superview. + * @param type Type of button, Back or Close or etc. + * @param lineWidth Width of each line in hamburger. + * @param lineHeight Height of each line in hamburger. + * @param lineSpacing Distance between lines. + * @param lineCenter Position of 2nd line in hamburger (which means center of group of 3) + * @param color Color of lines. + * + */ +- (instancetype)initWithFrame:(CGRect)frame + withHamburgerType:(LBHamburgerButtonType)type + lineWidth:(CGFloat)lineWidth + lineHeight:(CGFloat)lineHeight + lineSpacing:(CGFloat)lineSpacing + lineCenter:(CGPoint)lineCenter + color:(UIColor*)color; + +/** + * Set up default state of button which has 3 lines. + * + * @param type Type of button, Back or Close or etc. + * @param lineWidth Width of each line in hamburger. + * @param lineHeight Height of each line in hamburger. + * @param lineSpacing Distance between lines. + * @param lineCenter Position of 2nd line in hamburger (which means center of group of 3) + * @param color Color of lines. + * + */ +- (void)setUpHamburgerWithType:(LBHamburgerButtonType)type + lineWidth:(CGFloat)lineWidth + lineHeight:(CGFloat)lineHeight + lineSpacing:(CGFloat)lineSpacing + lineCenter:(CGPoint)lineCenter + color:(UIColor*)color; + +/** + * Animate from current state to other state. + */ +- (void)switchState; + +/** + * Animate from current state to specfied state. + */ +- (void)setState:(LBHamburgerButtonState)state; + +@end + +/** + * Supporting category of CALayer + */ +@interface CALayer (LBAddAnimationAndValue) + +/** + * Add both animation and its end value to CALayer + */ +- (void)addAnimation:(CAAnimation *)anim andValue:(NSValue*)value forKeyPath:(NSString *)keyPath; + +@end + +/** + * Supporting category of UIBezierPath + * Helps creating a curve path for animation + */ +@interface UIBezierPath (LBAnimateBezierPath) + +/** + * Create a curve path with ease + */ ++ (UIBezierPath*)animateBezierPathFrom:(CGPoint)startPoint toPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint; + +@end + diff --git a/Pod/Classes/LBHamburgerButton.m b/Pod/Classes/LBHamburgerButton.m new file mode 100644 index 0000000..173fd76 --- /dev/null +++ b/Pod/Classes/LBHamburgerButton.m @@ -0,0 +1,274 @@ +// +// LBHamburgerButton.m +// HamburgerButton +// +// Created by Bang Nguyen on 26/07/2014. +// Copyright (c) Năm 2014 Bang Nguyen. All rights reserved. +// + +#import "LBHamburgerButton.h" + +@interface LBHamburgerButton () { + + CGFloat _lineHeight, _lineWidth, _lineSpacing; + CGPoint _lineCenter; + NSArray* _lineArray; + BOOL _lineCreated; + +} + +@end + +@implementation LBHamburgerButton + +#pragma mark - +#pragma mark - Public functions + +- (instancetype)initWithFrame:(CGRect)frame withHamburgerType:(LBHamburgerButtonType)type lineWidth:(CGFloat)lineWidth lineHeight:(CGFloat)lineHeight lineSpacing:(CGFloat)lineSpacing lineCenter:(CGPoint)lineCenter color:(UIColor *)color { + + if (self = [super initWithFrame:frame]) { + + _hamburgerAnimationDuration = 0.5; + _hamburgerState = LBHamburgerButtonStateHamburger; + + [self setUpHamburgerWithType:type + lineWidth:lineWidth + lineHeight:lineHeight + lineSpacing:lineSpacing + lineCenter:lineCenter + color:color]; + } + return self; +} + +- (void)setUpHamburgerWithType:(LBHamburgerButtonType)type lineWidth:(CGFloat)lineWidth lineHeight:(CGFloat)lineHeight lineSpacing:(CGFloat)lineSpacing lineCenter:(CGPoint)lineCenter color:(UIColor *)color { + + if (_lineCreated) { + // Lines have been created, do nothing. + return; + } + + _hamburgerType = type; + _lineWidth = lineWidth; + _lineHeight = lineHeight; + _lineSpacing = lineSpacing; + _lineCenter = lineCenter; + + CAShapeLayer* topLine = [self createLayerWithFrame:CGRectMake(0, 0, lineWidth, lineHeight) andColor:color atPosition:CGPointMake(lineCenter.x, lineCenter.y - lineHeight - lineSpacing)]; + CAShapeLayer* middleLine = [self createLayerWithFrame:CGRectMake(0, 0, lineWidth, lineHeight) andColor:color atPosition:lineCenter]; + CAShapeLayer* bottomLine = [self createLayerWithFrame:CGRectMake(0, 0, lineWidth, lineHeight) andColor:color atPosition:CGPointMake(lineCenter.x, lineCenter.y + lineHeight + lineSpacing)]; + + _lineArray = @[ topLine, middleLine, bottomLine ]; + for (CAShapeLayer* layer in _lineArray) { + [self.layer addSublayer:layer]; + } + _lineCreated = YES; +} + +- (void)switchState { + [self animateButtonForward:(_hamburgerState == LBHamburgerButtonStateHamburger)]; + _hamburgerState = (_hamburgerState == LBHamburgerButtonStateHamburger) ? LBHamburgerButtonStateNotHamburger : LBHamburgerButtonStateHamburger; +} + +-(void)setState:(LBHamburgerButtonState)state +{ + if(_hamburgerState == state) + return; + else + [self switchState]; +} + +#pragma mark - +#pragma mark - Private functions + +- (void)animateButtonForward:(BOOL)forward { + + NSArray* anims = @[ [self keyframeAnimationsOfLineIndex:0 forward:forward], + [self keyframeAnimationsOfLineIndex:1 forward:forward], + [self keyframeAnimationsOfLineIndex:2 forward:forward] ]; + + [CATransaction begin]; + [CATransaction setAnimationDuration:_hamburgerAnimationDuration]; + [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.4 :0.0 :0.2 :1.0]]; + + for (NSArray* animations in anims) { + NSInteger index = [anims indexOfObject:animations]; + for (CAKeyframeAnimation* anim in animations) { + CAShapeLayer* layer = _lineArray[index]; + if (!anim.removedOnCompletion) { + [layer addAnimation:anim forKey:anim.keyPath]; + } else { + [layer addAnimation:anim andValue:anim.values.lastObject forKeyPath:anim.keyPath]; + } + } + } + + [CATransaction commit]; +} + +- (NSArray*)keyframeAnimationsOfLineIndex:(NSInteger)index forward:(BOOL)forward { + + switch (_hamburgerType) { + case LBHamburgerButtonTypeBackButton: + { + switch (index) { + case 0: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(M_PI*5/4) ] : @[ @(M_PI*5/4), @0]; + animRotate.calculationMode = kCAAnimationCubic; + animRotate.keyTimes = @[ @0, @0.33, @0.73, @1.0]; + + CGPoint startPoint = forward ? CGPointMake(_lineCenter.x, _lineCenter.y - _lineHeight - _lineSpacing) : CGPointMake(_lineCenter.x - [self scale:10], _lineCenter.y + _lineHeight + [self scale:7.2]); + CGPoint endPoint = forward ? CGPointMake(_lineCenter.x - [self scale:10], _lineCenter.y + _lineHeight + [self scale:7.2]) : CGPointMake(_lineCenter.x, _lineCenter.y - _lineHeight - _lineSpacing); + CGPoint controlPoint = CGPointMake(_lineCenter.x + [self scale:15], _lineCenter.y); + + CAKeyframeAnimation* animPosition = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animPosition.path = [UIBezierPath animateBezierPathFrom:startPoint toPoint:endPoint controlPoint:controlPoint].CGPath; + animPosition.removedOnCompletion = NO; + animPosition.fillMode = kCAFillModeForwards; + + return @[ animRotate, animPosition ]; + } + case 1: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(M_PI) ] : @[ @(M_PI), @0]; + + return @[ animRotate ]; + } + case 2: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(-M_PI*5/4) ] : @[ @(-M_PI*5/4), @0]; + animRotate.calculationMode = kCAAnimationCubic; + animRotate.keyTimes = @[ @0, @0.33, @0.73, @1.0]; + + CGPoint startPoint = forward ? CGPointMake(_lineCenter.x, _lineCenter.y + _lineHeight + _lineSpacing) : CGPointMake(_lineCenter.x - [self scale:10], _lineCenter.y - _lineHeight - [self scale:7.2]); + CGPoint endPoint = forward ? CGPointMake(_lineCenter.x - [self scale:10], _lineCenter.y - _lineHeight - [self scale:7.2]) : CGPointMake(_lineCenter.x, _lineCenter.y + _lineHeight + _lineSpacing); + CGPoint controlPoint = CGPointMake(_lineCenter.x + [self scale:15], _lineCenter.y); + + CAKeyframeAnimation* animPosition = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animPosition.path = [UIBezierPath animateBezierPathFrom:startPoint toPoint:endPoint controlPoint:controlPoint].CGPath; + animPosition.removedOnCompletion = NO; + animPosition.fillMode = kCAFillModeForwards; + + return @[ animRotate, animPosition ]; + } + default: + break; + } + break; + } + case LBHamburgerButtonTypeCloseButton: + { + switch (index) { + case 0: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(-M_PI*5/4) ] : @[ @(-M_PI*5/4), @0]; + animRotate.calculationMode = kCAAnimationCubic; + animRotate.keyTimes = @[ @0, @0.33, @0.73, @1.0]; + + CGPoint startPoint = forward ? CGPointMake(_lineCenter.x, _lineCenter.y - _lineHeight - _lineSpacing) : _lineCenter; + CGPoint endPoint = forward ? _lineCenter : CGPointMake(_lineCenter.x, _lineCenter.y - _lineHeight - _lineSpacing); + CGPoint controlPoint = CGPointMake(_lineCenter.x + [self scale:20], _lineCenter.y - _lineHeight - [self scale:5]); + + CAKeyframeAnimation* animPosition = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animPosition.path = [UIBezierPath animateBezierPathFrom:startPoint toPoint:endPoint controlPoint:controlPoint].CGPath; + animPosition.removedOnCompletion = NO; + animPosition.fillMode = kCAFillModeForwards; + + return @[ animRotate, animPosition ]; + } + case 1: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(M_PI) ] : @[ @(M_PI), @0]; + + CAKeyframeAnimation* animScale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.x"]; + animScale.values = forward ? @[ @1, @0.1 ] : @[ @0.1, @1 ]; + + return @[ animRotate, animScale ]; + } + case 2: + { + CAKeyframeAnimation* animRotate = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; + animRotate.values = forward ? @[ @0, @(M_PI*5/4) ] : @[ @(M_PI*5/4), @0]; + animRotate.calculationMode = kCAAnimationCubic; + animRotate.keyTimes = @[ @0, @0.33, @0.73, @1.0]; + + CGPoint startPoint = forward ? CGPointMake(_lineCenter.x, _lineCenter.y + _lineHeight + _lineSpacing) : _lineCenter; + CGPoint endPoint = forward ? _lineCenter : CGPointMake(_lineCenter.x, _lineCenter.y + _lineHeight + _lineSpacing); + CGPoint controlPoint = CGPointMake(_lineCenter.x - [self scale:20], _lineCenter.y + _lineHeight + [self scale:5]); + + CAKeyframeAnimation* animPosition = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animPosition.path = [UIBezierPath animateBezierPathFrom:startPoint toPoint:endPoint controlPoint:controlPoint].CGPath; + animPosition.removedOnCompletion = NO; + animPosition.fillMode = kCAFillModeForwards; + + return @[ animRotate, animPosition ]; + } + default: + break; + } + break; + } + default: + break; + } + return nil; +} + +- (CAShapeLayer*)createLayerWithFrame:(CGRect)frame andColor:(UIColor*)color atPosition:(CGPoint)point { + + CAShapeLayer* layer = [CAShapeLayer new]; + + UIBezierPath* path = [UIBezierPath new]; + [path moveToPoint:CGPointMake(0, 0)]; + [path addLineToPoint:CGPointMake(frame.size.width, 0)]; + + layer.path = path.CGPath; + layer.lineWidth = frame.size.height; + layer.strokeColor = color.CGColor; + + CGPathRef bound = CGPathCreateCopyByStrokingPath(layer.path, nil, layer.lineWidth, kCGLineCapButt, kCGLineJoinMiter, layer.miterLimit); + layer.bounds = CGPathGetBoundingBox(bound); + + layer.position = point; + + return layer; +} + +- (CGFloat)scale:(CGFloat)value { + return value/(50/_lineWidth); +} + +@end + +#pragma mark - +#pragma mark - Supporting Category +#pragma mark - CALayer + +@implementation CALayer (LBAddAnimationAndValue) + +- (void)addAnimation:(CAAnimation *)anim andValue:(NSValue *)value forKeyPath:(NSString *)keyPath { + [self addAnimation:anim forKey:keyPath]; + [self setValue:value forKeyPath:keyPath]; +} + +@end + +#pragma mark - UIBezierPath + +@implementation UIBezierPath (LBAnimateBezierPath) + ++ (UIBezierPath*)animateBezierPathFrom:(CGPoint)startPoint toPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint { + + UIBezierPath* path = [UIBezierPath new]; + [path moveToPoint:startPoint]; + [path addQuadCurveToPoint:endPoint controlPoint:controlPoint]; + return path; +} + +@end diff --git a/README.md b/README.md index 728620b..cc8297c 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,68 @@ [![License](https://img.shields.io/cocoapods/l/HamburgerButton.svg?style=flat)](http://cocoapods.org/pods/HamburgerButton) [![Platform](https://img.shields.io/cocoapods/p/HamburgerButton.svg?style=flat)](http://cocoapods.org/pods/HamburgerButton) -## Usage +## Overview ## -To run the example project, clone the repo, and run `pod install` from the Example directory first. +LBHamburgerButton is an iOS control that displays 3 lines (hamburger) and other icon (back, close...) without using image. It has a beautiful, clean and smooth transition between 2 state like Google Material Design or "close button" of Paper app. -## Requirements +## Requirement ## + +LBHamburgerButton use QuartzCore framework, so dont forget to add this framework. ARC (iOS 5+) is also required. + +## How to use ## + +First, you need to copy 2 files LBHamburgerButton.h/.m to your project. Then, import them to your class + +```objc +#import "LBHamburgerButton.h" +``` + +This is a sub-class of UIButton. So you can init a simple button and call set-up method: + +```objc +buttonHamburger = [[LBHamburgerButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; +[buttonHamburger setUpHamburgerWithType:LBHamburgerButtonTypeCloseButton +lineWidth:50 +lineHeight:50/6 +lineSpacing:5 +lineCenter:CGPointMake(50, 50) +color:[UIColor whiteColor]]; + + +or use full contructor like this: + + +```objc +buttonHamburger = [[LBHamburgerButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100) +withHamburgerType:LBHamburgerButtonTypeCloseButton +lineWidth:50 +lineHeight:50/6 +lineSpacing:5 +lineCenter:CGPointMake(50, 50) +color:[UIColor whiteColor]]; +``` + +Set other propertises, add target add it to view like UIButton. + +```objc +[buttonHamburger setCenter:CGPointMake(120, 120)]; +[buttonHamburger setBackgroundColor:[UIColor blackColor]]; +[buttonHamburger addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; + +[self.view addSubview:buttonHamburger]; +``` + +When you want to switch state, just call `switchState`. + +```objc +- (void)buttonPressed:(id)sender { +LBHamburgerButton* btn = (LBHamburgerButton*)sender; +[btn switchState]; +} +``` + +## MIT License +Copyright (c) 2014 Bang Nguyen ## Installation @@ -24,6 +81,8 @@ pod "HamburgerButton" Giuseppe Nucifora, me@giuseppenucifora.com + + ## License HamburgerButton is available under the MIT license. See the LICENSE file for more info.