From 96868b547c0680c439a9e9bb8bd827c8c0066590 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 11 May 2015 21:37:16 -0400 Subject: [PATCH 1/3] Add image tinting utility and tests. Add test host application so we can use an asset catalog. --- RZUtils/Categories/UIImage/UIImage+RZTint.h | 22 ++ RZUtils/Categories/UIImage/UIImage+RZTint.m | 55 ++++ Tests/Default-568h@2x.png | Bin 0 -> 18594 bytes Tests/RZHostApp/AppDelegate.h | 17 ++ Tests/RZHostApp/AppDelegate.m | 23 ++ Tests/RZHostApp/Base.lproj/LaunchScreen.xib | 41 +++ Tests/RZHostApp/Info.plist | 43 +++ Tests/RZHostApp/main.m | 16 ++ Tests/RZUtilsTests.xcodeproj/project.pbxproj | 272 ++++++++++++++++-- .../xcschemes/RZUtilsTests.xcscheme | 8 +- Tests/RZUtilsTests/RZImageTintTests.m | 87 ++++++ .../Supporting Files/RZUtilsTests-Prefix.pch | 18 -- .../Supporting Files/Raizalbs Logo.sketch | Bin 0 -> 40960 bytes .../Raizlabs Logo.imageset/Contents.json | 23 ++ .../Raizlabs Logo.imageset/Raizlabs Logo.png | Bin 0 -> 2497 bytes .../Raizlabs Logo@2x.png | Bin 0 -> 4327 bytes .../Raizlabs Logo@3x.png | Bin 0 -> 6212 bytes 17 files changed, 585 insertions(+), 40 deletions(-) create mode 100644 RZUtils/Categories/UIImage/UIImage+RZTint.h create mode 100644 RZUtils/Categories/UIImage/UIImage+RZTint.m create mode 100644 Tests/Default-568h@2x.png create mode 100644 Tests/RZHostApp/AppDelegate.h create mode 100644 Tests/RZHostApp/AppDelegate.m create mode 100644 Tests/RZHostApp/Base.lproj/LaunchScreen.xib create mode 100644 Tests/RZHostApp/Info.plist create mode 100644 Tests/RZHostApp/main.m create mode 100644 Tests/RZUtilsTests/RZImageTintTests.m delete mode 100644 Tests/RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch create mode 100644 Tests/RZUtilsTests/Supporting Files/Raizalbs Logo.sketch create mode 100644 Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Contents.json create mode 100644 Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Raizlabs Logo.png create mode 100644 Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Raizlabs Logo@2x.png create mode 100644 Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Raizlabs Logo@3x.png diff --git a/RZUtils/Categories/UIImage/UIImage+RZTint.h b/RZUtils/Categories/UIImage/UIImage+RZTint.h new file mode 100644 index 0000000..b1563e0 --- /dev/null +++ b/RZUtils/Categories/UIImage/UIImage+RZTint.h @@ -0,0 +1,22 @@ +// +// UIImage+RZTint.h +// Pods +// +// Created by Zev Eisenberg on 5/11/15. +// +// + +#import + +@interface UIImage (RZTint) + +/** + * Tints an image with the provided color. Preserves the original image’s alignment rect insets, cap insets, and resizing mode. + * + * @param color The color to tint the image. Must not be @c nil. + * + * @return A tinted version of the image. + */ +- (UIImage *)rz_tintedImageWithColor:(UIColor *)color; + +@end diff --git a/RZUtils/Categories/UIImage/UIImage+RZTint.m b/RZUtils/Categories/UIImage/UIImage+RZTint.m new file mode 100644 index 0000000..b52194b --- /dev/null +++ b/RZUtils/Categories/UIImage/UIImage+RZTint.m @@ -0,0 +1,55 @@ +// +// UIImage+RZTint.m +// Pods +// +// Created by Zev Eisenberg on 5/11/15. +// +// + +#import "UIImage+RZTint.h" + +@implementation UIImage (RZTint) + +- (UIImage *)rz_tintedImageWithColor:(UIColor *)color +{ + NSParameterAssert(color); + + // Save original properties + UIEdgeInsets originalCapInsets = self.capInsets; + UIImageResizingMode originalResizingMode = self.resizingMode; + UIEdgeInsets originalAlignmentRectInsets = self.alignmentRectInsets; + + // Create image context + UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f); + CGContextRef ctx = UIGraphicsGetCurrentContext(); + + // Flip the context vertically + CGContextTranslateCTM(ctx, 0.0f, self.size.height); + CGContextScaleCTM(ctx, 1.0f, -1.0f); + + CGRect imageRect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); + + // Image tinting mostly inspired by http://stackoverflow.com/a/22528426/255489 + + CGContextSetBlendMode(ctx, kCGBlendModeNormal); + CGContextDrawImage(ctx, imageRect, self.CGImage); + + // kCGBlendModeSourceIn: resulting color = source color * destination alpha + CGContextSetBlendMode(ctx, kCGBlendModeSourceIn); + CGContextSetFillColorWithColor(ctx, color.CGColor); + CGContextFillRect(ctx, imageRect); + + // Get new image + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + // Restore original properties + image = [image imageWithAlignmentRectInsets:originalAlignmentRectInsets]; + if ( !UIEdgeInsetsEqualToEdgeInsets(originalCapInsets, image.capInsets) || originalResizingMode != image.resizingMode ) { + image = [image resizableImageWithCapInsets:originalCapInsets resizingMode:originalResizingMode]; + } + + return image; +} + +@end diff --git a/Tests/Default-568h@2x.png b/Tests/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Tests/RZHostApp/AppDelegate.h b/Tests/RZHostApp/AppDelegate.h new file mode 100644 index 0000000..9962316 --- /dev/null +++ b/Tests/RZHostApp/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// RZHostApp +// +// Created by Zev Eisenberg on 5/11/15. +// Copyright (c) 2015 Raizlabs. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/Tests/RZHostApp/AppDelegate.m b/Tests/RZHostApp/AppDelegate.m new file mode 100644 index 0000000..6c018f1 --- /dev/null +++ b/Tests/RZHostApp/AppDelegate.m @@ -0,0 +1,23 @@ +// +// AppDelegate.m +// RZHostApp +// +// Created by Zev Eisenberg on 5/11/15. +// Copyright (c) 2015 Raizlabs. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + +@end diff --git a/Tests/RZHostApp/Base.lproj/LaunchScreen.xib b/Tests/RZHostApp/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..5d6ddb3 --- /dev/null +++ b/Tests/RZHostApp/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/RZHostApp/Info.plist b/Tests/RZHostApp/Info.plist new file mode 100644 index 0000000..3bd02fd --- /dev/null +++ b/Tests/RZHostApp/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.raizlabs.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Tests/RZHostApp/main.m b/Tests/RZHostApp/main.m new file mode 100644 index 0000000..7548d58 --- /dev/null +++ b/Tests/RZHostApp/main.m @@ -0,0 +1,16 @@ +// +// main.m +// RZHostApp +// +// Created by Zev Eisenberg on 5/11/15. +// Copyright (c) 2015 Raizlabs. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Tests/RZUtilsTests.xcodeproj/project.pbxproj b/Tests/RZUtilsTests.xcodeproj/project.pbxproj index 6ec8de0..0ff2c32 100644 --- a/Tests/RZUtilsTests.xcodeproj/project.pbxproj +++ b/Tests/RZUtilsTests.xcodeproj/project.pbxproj @@ -7,16 +7,35 @@ objects = { /* Begin PBXBuildFile section */ + 364C0F78348087AEC2889C42 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22BAB0697B95400AAAD3740C /* libPods.a */; }; 7A175505AE684DAFB8613F72 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22BAB0697B95400AAAD3740C /* libPods.a */; }; 9A8D4DF4196335CC00AFAB21 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A8D4DF3196335CC00AFAB21 /* XCTest.framework */; }; 9A8D4DF5196335CC00AFAB21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A8D4DD1196335CC00AFAB21 /* Foundation.framework */; }; 9A8D4DF6196335CC00AFAB21 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A8D4DD5196335CC00AFAB21 /* UIKit.framework */; }; 9A8D4DFE196335CC00AFAB21 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9A8D4DFC196335CC00AFAB21 /* InfoPlist.strings */; }; 9A8D4EB61963431900AFAB21 /* RZBlockKVOTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8D4EB51963431900AFAB21 /* RZBlockKVOTests.m */; }; + CD475B311B018D66000C0C8A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CD475B301B018D66000C0C8A /* main.m */; }; + CD475B341B018D66000C0C8A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CD475B331B018D66000C0C8A /* AppDelegate.m */; }; + CD475B3F1B018D66000C0C8A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = CD475B3D1B018D66000C0C8A /* LaunchScreen.xib */; }; + CD475B561B018D9D000C0C8A /* Test Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CDDB47901B018B1D0012A201 /* Test Images.xcassets */; }; + CDDB478F1B0189B80012A201 /* RZImageTintTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CDDB478E1B0189B80012A201 /* RZImageTintTests.m */; }; + CDDB47911B018B1D0012A201 /* Test Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CDDB47901B018B1D0012A201 /* Test Images.xcassets */; }; + CDFA4DBD1B018E7A00918E27 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CDFA4DBC1B018E7A00918E27 /* Default-568h@2x.png */; }; D4874DA119918C46003EEC4B /* RZAutoLayoutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D4874DA019918C46003EEC4B /* RZAutoLayoutTests.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + CD475B541B018D71000C0C8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A8D4DC6196335CC00AFAB21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CD475B2B1B018D66000C0C8A; + remoteInfo = RZHostApp; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + 19428E876E28110F46DB30FA /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 22BAB0697B95400AAAD3740C /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 9A8D4DD1196335CC00AFAB21 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 9A8D4DD3196335CC00AFAB21 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -26,9 +45,18 @@ 9A8D4DF3196335CC00AFAB21 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 9A8D4DFB196335CC00AFAB21 /* RZUtilsTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RZUtilsTests-Info.plist"; sourceTree = ""; }; 9A8D4DFD196335CC00AFAB21 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 9A8D4EB4196336C500AFAB21 /* RZUtilsTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RZUtilsTests-Prefix.pch"; sourceTree = ""; }; 9A8D4EB51963431900AFAB21 /* RZBlockKVOTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RZBlockKVOTests.m; sourceTree = ""; }; - CFC331EF976D4DEC8CB9094C /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; + AA43025CFD9319FD22B5CA8F /* Pods.enterprise-qa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods.enterprise-qa.xcconfig"; path = "Pods/Target Support Files/Pods/Pods.enterprise-qa.xcconfig"; sourceTree = ""; }; + CAE27EC2D5A3F04FF06102A4 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + CD475B2C1B018D66000C0C8A /* RZHostApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RZHostApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + CD475B2F1B018D66000C0C8A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CD475B301B018D66000C0C8A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + CD475B321B018D66000C0C8A /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + CD475B331B018D66000C0C8A /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + CD475B3E1B018D66000C0C8A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + CDDB478E1B0189B80012A201 /* RZImageTintTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RZImageTintTests.m; sourceTree = ""; }; + CDDB47901B018B1D0012A201 /* Test Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Test Images.xcassets"; sourceTree = ""; }; + CDFA4DBC1B018E7A00918E27 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; D4874DA019918C46003EEC4B /* RZAutoLayoutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RZAutoLayoutTests.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -44,16 +72,26 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CD475B291B018D66000C0C8A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 364C0F78348087AEC2889C42 /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 9A8D4DC5196335CC00AFAB21 = { isa = PBXGroup; children = ( + CDFA4DBC1B018E7A00918E27 /* Default-568h@2x.png */, 9A8D4DF9196335CC00AFAB21 /* RZUtilsTests */, + CD475B2D1B018D66000C0C8A /* RZHostApp */, 9A8D4DD0196335CC00AFAB21 /* Frameworks */, 9A8D4DCF196335CC00AFAB21 /* Products */, - CFC331EF976D4DEC8CB9094C /* Pods.xcconfig */, + BDE41AA10EFDC1CC3F7E3386 /* Pods */, ); sourceTree = ""; }; @@ -61,6 +99,7 @@ isa = PBXGroup; children = ( 9A8D4DF2196335CC00AFAB21 /* RZUtilsTests.xctest */, + CD475B2C1B018D66000C0C8A /* RZHostApp.app */, ); name = Products; sourceTree = ""; @@ -82,8 +121,9 @@ isa = PBXGroup; children = ( 9A8D4DFA196335CC00AFAB21 /* Supporting Files */, - 9A8D4EB51963431900AFAB21 /* RZBlockKVOTests.m */, D4874DA019918C46003EEC4B /* RZAutoLayoutTests.m */, + 9A8D4EB51963431900AFAB21 /* RZBlockKVOTests.m */, + CDDB478E1B0189B80012A201 /* RZImageTintTests.m */, ); path = RZUtilsTests; sourceTree = ""; @@ -93,11 +133,41 @@ children = ( 9A8D4DFB196335CC00AFAB21 /* RZUtilsTests-Info.plist */, 9A8D4DFC196335CC00AFAB21 /* InfoPlist.strings */, - 9A8D4EB4196336C500AFAB21 /* RZUtilsTests-Prefix.pch */, + CDDB47901B018B1D0012A201 /* Test Images.xcassets */, ); path = "Supporting Files"; sourceTree = ""; }; + BDE41AA10EFDC1CC3F7E3386 /* Pods */ = { + isa = PBXGroup; + children = ( + CAE27EC2D5A3F04FF06102A4 /* Pods.debug.xcconfig */, + 19428E876E28110F46DB30FA /* Pods.release.xcconfig */, + AA43025CFD9319FD22B5CA8F /* Pods.enterprise-qa.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + CD475B2D1B018D66000C0C8A /* RZHostApp */ = { + isa = PBXGroup; + children = ( + CD475B321B018D66000C0C8A /* AppDelegate.h */, + CD475B331B018D66000C0C8A /* AppDelegate.m */, + CD475B3D1B018D66000C0C8A /* LaunchScreen.xib */, + CD475B2E1B018D66000C0C8A /* Supporting Files */, + ); + path = RZHostApp; + sourceTree = ""; + }; + CD475B2E1B018D66000C0C8A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + CD475B2F1B018D66000C0C8A /* Info.plist */, + CD475B301B018D66000C0C8A /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -114,12 +184,32 @@ buildRules = ( ); dependencies = ( + CD475B551B018D71000C0C8A /* PBXTargetDependency */, ); name = RZUtilsTests; productName = RZUtilsTests; productReference = 9A8D4DF2196335CC00AFAB21 /* RZUtilsTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + CD475B2B1B018D66000C0C8A /* RZHostApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = CD475B521B018D66000C0C8A /* Build configuration list for PBXNativeTarget "RZHostApp" */; + buildPhases = ( + FC3B370C76E1787C3C557EAC /* Check Pods Manifest.lock */, + CD475B281B018D66000C0C8A /* Sources */, + CD475B291B018D66000C0C8A /* Frameworks */, + CD475B2A1B018D66000C0C8A /* Resources */, + 16C5AB32AB697CDBC193F861 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RZHostApp; + productName = RZHostApp; + productReference = CD475B2C1B018D66000C0C8A /* RZHostApp.app */; + productType = "com.apple.product-type.application"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -127,8 +217,16 @@ isa = PBXProject; attributes = { CLASSPREFIX = RZ; - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0630; ORGANIZATIONNAME = Raizlabs; + TargetAttributes = { + 9A8D4DF1196335CC00AFAB21 = { + TestTargetID = CD475B2B1B018D66000C0C8A; + }; + CD475B2B1B018D66000C0C8A = { + CreatedOnToolsVersion = 6.3.1; + }; + }; }; buildConfigurationList = 9A8D4DC9196335CC00AFAB21 /* Build configuration list for PBXProject "RZUtilsTests" */; compatibilityVersion = "Xcode 3.2"; @@ -136,12 +234,14 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 9A8D4DC5196335CC00AFAB21; productRefGroup = 9A8D4DCF196335CC00AFAB21 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( + CD475B2B1B018D66000C0C8A /* RZHostApp */, 9A8D4DF1196335CC00AFAB21 /* RZUtilsTests */, ); }; @@ -152,13 +252,39 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + CDDB47911B018B1D0012A201 /* Test Images.xcassets in Resources */, 9A8D4DFE196335CC00AFAB21 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + CD475B2A1B018D66000C0C8A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CD475B3F1B018D66000C0C8A /* LaunchScreen.xib in Resources */, + CD475B561B018D9D000C0C8A /* Test Images.xcassets in Resources */, + CDFA4DBD1B018E7A00918E27 /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 16C5AB32AB697CDBC193F861 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; DB328C2D17B7432F9AFBFA98 /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -171,7 +297,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; showEnvVarsInLog = 0; }; DFCEA1E42D714A99949F834D /* Check Pods Manifest.lock */ = { @@ -189,6 +315,21 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; + FC3B370C76E1787C3C557EAC /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -198,11 +339,29 @@ files = ( D4874DA119918C46003EEC4B /* RZAutoLayoutTests.m in Sources */, 9A8D4EB61963431900AFAB21 /* RZBlockKVOTests.m in Sources */, + CDDB478F1B0189B80012A201 /* RZImageTintTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CD475B281B018D66000C0C8A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CD475B341B018D66000C0C8A /* AppDelegate.m in Sources */, + CD475B311B018D66000C0C8A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + CD475B551B018D71000C0C8A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CD475B2B1B018D66000C0C8A /* RZHostApp */; + targetProxy = CD475B541B018D71000C0C8A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 9A8D4DFC196335CC00AFAB21 /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -212,6 +371,14 @@ name = InfoPlist.strings; sourceTree = ""; }; + CD475B3D1B018D66000C0C8A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + CD475B3E1B018D66000C0C8A /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -219,7 +386,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -258,7 +424,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -291,7 +456,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -327,15 +491,14 @@ }; 9A8D4E09196335CC00AFAB21 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CFC331EF976D4DEC8CB9094C /* Pods.xcconfig */; + baseConfigurationReference = CAE27EC2D5A3F04FF06102A4 /* Pods.debug.xcconfig */; buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -343,46 +506,107 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "RZUtilsTests/Supporting Files/RZUtilsTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RZHostApp.app/RZHostApp"; WRAPPER_EXTENSION = xctest; }; name = Debug; }; 9A8D4E0A196335CC00AFAB21 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CFC331EF976D4DEC8CB9094C /* Pods.xcconfig */; + baseConfigurationReference = 19428E876E28110F46DB30FA /* Pods.release.xcconfig */; buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "RZUtilsTests/Supporting Files/RZUtilsTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RZHostApp.app/RZHostApp"; WRAPPER_EXTENSION = xctest; }; name = Release; }; 9A8D4E0B196335CC00AFAB21 /* Enterprise-QA */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CFC331EF976D4DEC8CB9094C /* Pods.xcconfig */; + baseConfigurationReference = AA43025CFD9319FD22B5CA8F /* Pods.enterprise-qa.xcconfig */; buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "RZUtilsTests/Supporting Files/RZUtilsTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RZHostApp.app/RZHostApp"; WRAPPER_EXTENSION = xctest; }; name = "Enterprise-QA"; }; + CD475B4C1B018D66000C0C8A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CAE27EC2D5A3F04FF06102A4 /* Pods.debug.xcconfig */; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = RZHostApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + CD475B4D1B018D66000C0C8A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19428E876E28110F46DB30FA /* Pods.release.xcconfig */; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = RZHostApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + CD475B4E1B018D66000C0C8A /* Enterprise-QA */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AA43025CFD9319FD22B5CA8F /* Pods.enterprise-qa.xcconfig */; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = RZHostApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Enterprise-QA"; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -406,6 +630,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + CD475B521B018D66000C0C8A /* Build configuration list for PBXNativeTarget "RZHostApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD475B4C1B018D66000C0C8A /* Debug */, + CD475B4D1B018D66000C0C8A /* Release */, + CD475B4E1B018D66000C0C8A /* Enterprise-QA */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 9A8D4DC6196335CC00AFAB21 /* Project object */; diff --git a/Tests/RZUtilsTests.xcodeproj/xcshareddata/xcschemes/RZUtilsTests.xcscheme b/Tests/RZUtilsTests.xcodeproj/xcshareddata/xcschemes/RZUtilsTests.xcscheme index b0389c1..55e6a48 100644 --- a/Tests/RZUtilsTests.xcodeproj/xcshareddata/xcschemes/RZUtilsTests.xcscheme +++ b/Tests/RZUtilsTests.xcodeproj/xcshareddata/xcschemes/RZUtilsTests.xcscheme @@ -1,6 +1,6 @@ - + - + +#import + +#import + +@interface RZImageTintTests : XCTestCase + +@property (strong, nonatomic) UIImage *testImage; + +@end + +@implementation RZImageTintTests + +- (void)setUp +{ + [super setUp]; + self.testImage = [UIImage imageNamed:@"Raizlabs Logo"]; +} + +- (void)testTinting +{ + XCTAssertNotNil(self.testImage); + + NSData *testData = UIImagePNGRepresentation(self.testImage); + + UIImage *blueImage1 = [self.testImage rz_tintedImageWithColor:[UIColor blueColor]]; + NSData *blueData1 = UIImagePNGRepresentation(blueImage1); + + XCTAssertNotEqualObjects(testData, blueData1, @"A tinted image should not be the same as the original, unless the original has changed since this test was written"); + + UIImage *redImage = [blueImage1 rz_tintedImageWithColor:[UIColor redColor]]; + NSData *redData = UIImagePNGRepresentation(redImage); + + XCTAssertNotEqualObjects(blueData1, redData, @"Two of the same image, tinted with different colors, should not be equal"); + + UIImage *blueImage2 = [redImage rz_tintedImageWithColor:[UIColor blueColor]]; + NSData *blueData2 = UIImagePNGRepresentation(blueImage2); + + XCTAssertEqualObjects(blueData1, blueData2, @"An image, tinted a different color and then tinted the original color again, should result in the same image"); +} + +- (void)testAttributes +{ + XCTAssertNotNil(self.testImage); + + UIEdgeInsets capInsets = UIEdgeInsetsMake(1.0f, 2.0f, 5.0f, 3.0f); + UIEdgeInsets alignmentRectInsets = UIEdgeInsetsMake(5.0f, 4.0f, 3.0f, 2.0f); + UIImageResizingMode resizingMode = UIImageResizingModeStretch; + UIImage *testImageWithAttributes = [self.testImage resizableImageWithCapInsets:capInsets resizingMode:resizingMode]; + testImageWithAttributes = [testImageWithAttributes imageWithAlignmentRectInsets:alignmentRectInsets]; + NSData *dataWithAttributes = UIImagePNGRepresentation(testImageWithAttributes); + + // first check assumptions about how these properties work + XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(capInsets, testImageWithAttributes.capInsets)); + XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(alignmentRectInsets, testImageWithAttributes.alignmentRectInsets)); + XCTAssertEqual(resizingMode, testImageWithAttributes.resizingMode); + + // make sure the attributes survive the tinting of the image + UIImage *tintedImage = [testImageWithAttributes rz_tintedImageWithColor:[UIColor purpleColor]]; + NSData *tintedData = UIImagePNGRepresentation(tintedImage); + XCTAssertNotEqualObjects(dataWithAttributes, tintedData); + + XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(capInsets, tintedImage.capInsets)); + XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(alignmentRectInsets, tintedImage.alignmentRectInsets)); + XCTAssertEqual(resizingMode, tintedImage.resizingMode); +} + +- (void)testNonOpaqueColor +{ + XCTAssertNotNil(self.testImage); + + NSData *testData = UIImagePNGRepresentation(self.testImage); + + UIImage *alphaTintedImage = [self.testImage rz_tintedImageWithColor:[[UIColor whiteColor] colorWithAlphaComponent:0.5f]]; + NSData *alphaTintedData = UIImagePNGRepresentation(alphaTintedImage); + XCTAssertNotEqualObjects(testData, alphaTintedData, @"An image tinted with a color whose alpha component is not 1 should be different from the original"); +} + +@end diff --git a/Tests/RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch b/Tests/RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch deleted file mode 100644 index fe3102f..0000000 --- a/Tests/RZUtilsTests/Supporting Files/RZUtilsTests-Prefix.pch +++ /dev/null @@ -1,18 +0,0 @@ -// -// RZUtilsTests-Prefix.pch -// RZUtilsTests -// -// Created by Nick Donaldson on 7/1/14. -// Copyright (c) 2014 Raizlabs. All rights reserved. -// - -#import - -#ifndef __IPHONE_6_0 - #warning "This project uses features only available in iOS SDK 6.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Tests/RZUtilsTests/Supporting Files/Raizalbs Logo.sketch b/Tests/RZUtilsTests/Supporting Files/Raizalbs Logo.sketch new file mode 100644 index 0000000000000000000000000000000000000000..3c81111874dacf79e5594a143767045e3d9d89c2 GIT binary patch literal 40960 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 ad83L(S>>cI1@A>7Kin_!U+3>pW&Z=f2C=dL literal 0 HcmV?d00001 diff --git a/Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Contents.json b/Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Contents.json new file mode 100644 index 0000000..cd246ed --- /dev/null +++ b/Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "Raizlabs Logo.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "Raizlabs Logo@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "Raizlabs Logo@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Raizlabs Logo.png b/Tests/RZUtilsTests/Supporting Files/Test Images.xcassets/Raizlabs Logo.imageset/Raizlabs Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..34762d0919c6cd2e185750afd1aee431ab3bdd23 GIT binary patch literal 2497 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 literal 0 HcmV?d00001 From 1dc6de92b75dafdd4f960c46a3a48eb51b210126 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Mon, 11 May 2015 21:43:51 -0400 Subject: [PATCH 2/3] Update copyright notice. --- RZUtils/Categories/UIImage/UIImage+RZTint.h | 22 ++++++++++++++++- RZUtils/Categories/UIImage/UIImage+RZTint.m | 26 ++++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/RZUtils/Categories/UIImage/UIImage+RZTint.h b/RZUtils/Categories/UIImage/UIImage+RZTint.h index b1563e0..2cc4085 100644 --- a/RZUtils/Categories/UIImage/UIImage+RZTint.h +++ b/RZUtils/Categories/UIImage/UIImage+RZTint.h @@ -1,9 +1,29 @@ // // UIImage+RZTint.h -// Pods // // Created by Zev Eisenberg on 5/11/15. + +// Copyright 2015 Raizlabs and other contributors +// http://raizlabs.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. // #import diff --git a/RZUtils/Categories/UIImage/UIImage+RZTint.m b/RZUtils/Categories/UIImage/UIImage+RZTint.m index b52194b..c550a14 100644 --- a/RZUtils/Categories/UIImage/UIImage+RZTint.m +++ b/RZUtils/Categories/UIImage/UIImage+RZTint.m @@ -1,13 +1,33 @@ // // UIImage+RZTint.m -// Pods // // Created by Zev Eisenberg on 5/11/15. -// -// #import "UIImage+RZTint.h" +// Copyright 2015 Raizlabs and other contributors +// http://raizlabs.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. +// + @implementation UIImage (RZTint) - (UIImage *)rz_tintedImageWithColor:(UIColor *)color From d7f83e9c71fab26c47486b43acfce2da970b3280 Mon Sep 17 00:00:00 2001 From: Zev Eisenberg Date: Tue, 30 Jun 2015 16:52:12 -0400 Subject: [PATCH 3/3] Fix overridden deployment target. --- Tests/RZUtilsTests.xcodeproj/project.pbxproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/Tests/RZUtilsTests.xcodeproj/project.pbxproj b/Tests/RZUtilsTests.xcodeproj/project.pbxproj index 0ff2c32..6bfeeec 100644 --- a/Tests/RZUtilsTests.xcodeproj/project.pbxproj +++ b/Tests/RZUtilsTests.xcodeproj/project.pbxproj @@ -561,7 +561,6 @@ ); GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = RZHostApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -580,7 +579,6 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = RZHostApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -599,7 +597,6 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = RZHostApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)";