From 6d01ff3ec09c575ce543e2631164fc63736b0365 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 27 Mar 2013 21:10:45 +0000 Subject: [PATCH] added image and colour replacing - see demo plist for example usage --- .gitignore | 2 + FontReplacer Demo.xcodeproj/project.pbxproj | 156 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 38841 bytes .../xcdebugger/Breakpoints.xcbkptlist | 20 +++ .../xcschemes/FontReplacer Demo.xcscheme | 86 ++++++++++ .../xcschemes/FontReplacer.xcscheme | 59 +++++++ .../xcschemes/xcschememanagement.plist | 42 +++++ FontReplacer Demo/DemoViewController.xib | 65 +++++--- .../FontReplacer Demo-Info.plist | 33 +++- .../Images/img_grid_cell_pattern.png | Bin 0 -> 1580 bytes .../Images/img_grid_cell_pattern@2x.png | Bin 0 -> 383 bytes .../Images/img_grid_cell_white.png | Bin 0 -> 2802 bytes .../Images/img_grid_cell_white@2x.png | Bin 0 -> 2820 bytes UIColor+Replacement/UIColor+Replacement.h | 13 ++ UIColor+Replacement/UIColor+Replacement.m | 93 +++++++++++ UIFont+Replacement/UIFont+Replacement.m | 1 + .../UIImage+Replacement.h | 13 ++ .../UIImage+Replacement.m | 105 ++++++++++++ 18 files changed, 659 insertions(+), 29 deletions(-) create mode 100644 .gitignore create mode 100644 FontReplacer Demo.xcodeproj/project.xcworkspace/xcuserdata/bransnw6.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer Demo.xcscheme create mode 100644 FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer.xcscheme create mode 100644 FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 FontReplacer Demo/Images/img_grid_cell_pattern.png create mode 100644 FontReplacer Demo/Images/img_grid_cell_pattern@2x.png create mode 100644 FontReplacer Demo/Images/img_grid_cell_white.png create mode 100644 FontReplacer Demo/Images/img_grid_cell_white@2x.png create mode 100644 UIColor+Replacement/UIColor+Replacement.h create mode 100644 UIColor+Replacement/UIColor+Replacement.m create mode 100644 UIImageNibPlaceholder+Replacement/UIImage+Replacement.h create mode 100644 UIImageNibPlaceholder+Replacement/UIImage+Replacement.m diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..241bda6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.svn +.DS_Store \ No newline at end of file diff --git a/FontReplacer Demo.xcodeproj/project.pbxproj b/FontReplacer Demo.xcodeproj/project.pbxproj index f69b126..1042f4f 100644 --- a/FontReplacer Demo.xcodeproj/project.pbxproj +++ b/FontReplacer Demo.xcodeproj/project.pbxproj @@ -10,6 +10,16 @@ 6FB0365D14BFFEC900626500 /* AdjustmentViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB0365C14BFFEC900626500 /* AdjustmentViewController.m */; }; 6FB0366014BFFEF500626500 /* AdjustmentViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6FB0365F14BFFEF500626500 /* AdjustmentViewController.xib */; }; 6FB0366414C0030200626500 /* OBSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FB0366314C0030200626500 /* OBSlider.m */; }; + C394CE3D16F074440008BDEF /* img_grid_cell_white.png in Resources */ = {isa = PBXBuildFile; fileRef = C394CE3B16F074440008BDEF /* img_grid_cell_white.png */; }; + C394CE3E16F074440008BDEF /* img_grid_cell_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C394CE3C16F074440008BDEF /* img_grid_cell_white@2x.png */; }; + C394CE4116F093D00008BDEF /* UIImage+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = C394CE4016F093D00008BDEF /* UIImage+Replacement.m */; }; + C394CE4216F093D00008BDEF /* UIImage+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = C394CE4016F093D00008BDEF /* UIImage+Replacement.m */; }; + C394CE4916F09FE60008BDEF /* UIColor+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = C394CE4816F09FE60008BDEF /* UIColor+Replacement.m */; }; + C394CE4A16F09FE60008BDEF /* UIColor+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = C394CE4816F09FE60008BDEF /* UIColor+Replacement.m */; }; + C394CE4D16F0AA1D0008BDEF /* img_grid_cell_pattern.png in Resources */ = {isa = PBXBuildFile; fileRef = C394CE4B16F0AA1D0008BDEF /* img_grid_cell_pattern.png */; }; + C394CE4E16F0AA1D0008BDEF /* img_grid_cell_pattern@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C394CE4C16F0AA1D0008BDEF /* img_grid_cell_pattern@2x.png */; }; + C3FFA0FC16E90838003A6F1C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA98620013F01BCE006DEC9A /* Foundation.framework */; }; + C3FFA10716E9084C003A6F1C /* UIFont+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = DA98621B13F01E63006DEC9A /* UIFont+Replacement.m */; }; DA336B6B13F01F5D00A60EA6 /* DemoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA336B6A13F01F5D00A60EA6 /* DemoViewController.xib */; }; DA4C182113F446120015A600 /* FontsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4C181F13F446110015A600 /* FontsViewController.m */; }; DA6C855713F02703007060AF /* CaviarDreams.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DA6C855213F02703007060AF /* CaviarDreams.ttf */; }; @@ -24,12 +34,33 @@ DA98621C13F01E63006DEC9A /* UIFont+Replacement.m in Sources */ = {isa = PBXBuildFile; fileRef = DA98621B13F01E63006DEC9A /* UIFont+Replacement.m */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + C3FFA0F916E90838003A6F1C /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/${PRODUCT_NAME}"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 6FB0365B14BFFEC900626500 /* AdjustmentViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustmentViewController.h; sourceTree = ""; }; 6FB0365C14BFFEC900626500 /* AdjustmentViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustmentViewController.m; sourceTree = ""; }; 6FB0365F14BFFEF500626500 /* AdjustmentViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AdjustmentViewController.xib; sourceTree = ""; }; 6FB0366214C0030200626500 /* OBSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OBSlider.h; sourceTree = ""; }; 6FB0366314C0030200626500 /* OBSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OBSlider.m; sourceTree = ""; }; + C394CE3B16F074440008BDEF /* img_grid_cell_white.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = img_grid_cell_white.png; sourceTree = ""; }; + C394CE3C16F074440008BDEF /* img_grid_cell_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "img_grid_cell_white@2x.png"; sourceTree = ""; }; + C394CE3F16F093D00008BDEF /* UIImage+Replacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Replacement.h"; path = "UIImageNibPlaceholder+Replacement/UIImage+Replacement.h"; sourceTree = SOURCE_ROOT; }; + C394CE4016F093D00008BDEF /* UIImage+Replacement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Replacement.m"; path = "UIImageNibPlaceholder+Replacement/UIImage+Replacement.m"; sourceTree = SOURCE_ROOT; }; + C394CE4716F09FE60008BDEF /* UIColor+Replacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Replacement.h"; sourceTree = ""; }; + C394CE4816F09FE60008BDEF /* UIColor+Replacement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Replacement.m"; sourceTree = ""; }; + C394CE4B16F0AA1D0008BDEF /* img_grid_cell_pattern.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = img_grid_cell_pattern.png; sourceTree = ""; }; + C394CE4C16F0AA1D0008BDEF /* img_grid_cell_pattern@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "img_grid_cell_pattern@2x.png"; sourceTree = ""; }; + C3FFA0FB16E90838003A6F1C /* libFontReplacer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFontReplacer.a; sourceTree = BUILT_PRODUCTS_DIR; }; DA336B6A13F01F5D00A60EA6 /* DemoViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoViewController.xib; sourceTree = ""; }; DA4C181E13F446110015A600 /* FontsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontsViewController.h; sourceTree = ""; }; DA4C181F13F446110015A600 /* FontsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FontsViewController.m; sourceTree = ""; }; @@ -51,6 +82,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + C3FFA0F816E90838003A6F1C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C3FFA0FC16E90838003A6F1C /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA9861F713F01BCE006DEC9A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -73,6 +112,35 @@ path = "FontReplacer Demo/OBSlider"; sourceTree = ""; }; + C394CE3A16F074440008BDEF /* Images */ = { + isa = PBXGroup; + children = ( + C394CE4B16F0AA1D0008BDEF /* img_grid_cell_pattern.png */, + C394CE4C16F0AA1D0008BDEF /* img_grid_cell_pattern@2x.png */, + C394CE3B16F074440008BDEF /* img_grid_cell_white.png */, + C394CE3C16F074440008BDEF /* img_grid_cell_white@2x.png */, + ); + path = Images; + sourceTree = ""; + }; + C394CE4316F094000008BDEF /* UIImageNibPlaceholder+Replacement */ = { + isa = PBXGroup; + children = ( + C394CE3F16F093D00008BDEF /* UIImage+Replacement.h */, + C394CE4016F093D00008BDEF /* UIImage+Replacement.m */, + ); + name = "UIImageNibPlaceholder+Replacement"; + sourceTree = ""; + }; + C394CE4616F09FE60008BDEF /* UIColor+Replacement */ = { + isa = PBXGroup; + children = ( + C394CE4716F09FE60008BDEF /* UIColor+Replacement.h */, + C394CE4816F09FE60008BDEF /* UIColor+Replacement.m */, + ); + path = "UIColor+Replacement"; + sourceTree = ""; + }; DA6C855113F02703007060AF /* CaviarDreams */ = { isa = PBXGroup; children = ( @@ -89,6 +157,8 @@ children = ( 6FB0366114C0030200626500 /* OBSlider */, DA98621913F01E55006DEC9A /* UIFont+Replacement */, + C394CE4316F094000008BDEF /* UIImageNibPlaceholder+Replacement */, + C394CE4616F09FE60008BDEF /* UIColor+Replacement */, DA98620213F01BCE006DEC9A /* FontReplacer Demo */, DA9861FD13F01BCE006DEC9A /* Frameworks */, DA9861FB13F01BCE006DEC9A /* Products */, @@ -100,6 +170,7 @@ isa = PBXGroup; children = ( DA9861FA13F01BCE006DEC9A /* FontReplacer Demo.app */, + C3FFA0FB16E90838003A6F1C /* libFontReplacer.a */, ); name = Products; sourceTree = ""; @@ -125,6 +196,7 @@ DA4C181E13F446110015A600 /* FontsViewController.h */, DA4C181F13F446110015A600 /* FontsViewController.m */, DA6C855113F02703007060AF /* CaviarDreams */, + C394CE3A16F074440008BDEF /* Images */, DA98620313F01BCE006DEC9A /* Supporting Files */, ); path = "FontReplacer Demo"; @@ -153,6 +225,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + C3FFA0FA16E90838003A6F1C /* FontReplacer */ = { + isa = PBXNativeTarget; + buildConfigurationList = C3FFA10416E90838003A6F1C /* Build configuration list for PBXNativeTarget "FontReplacer" */; + buildPhases = ( + C3FFA0F716E90838003A6F1C /* Sources */, + C3FFA0F816E90838003A6F1C /* Frameworks */, + C3FFA0F916E90838003A6F1C /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FontReplacer; + productName = FontReplacer; + productReference = C3FFA0FB16E90838003A6F1C /* libFontReplacer.a */; + productType = "com.apple.product-type.library.static"; + }; DA9861F913F01BCE006DEC9A /* FontReplacer Demo */ = { isa = PBXNativeTarget; buildConfigurationList = DA98621613F01BCE006DEC9A /* Build configuration list for PBXNativeTarget "FontReplacer Demo" */; @@ -192,6 +281,7 @@ projectRoot = ""; targets = ( DA9861F913F01BCE006DEC9A /* FontReplacer Demo */, + C3FFA0FA16E90838003A6F1C /* FontReplacer */, ); }; /* End PBXProject section */ @@ -208,12 +298,26 @@ DA6C855A13F02703007060AF /* CaviarDreams_Italic.ttf in Resources */, DA6C856513F035EA007060AF /* Icon@2x.png in Resources */, 6FB0366014BFFEF500626500 /* AdjustmentViewController.xib in Resources */, + C394CE3D16F074440008BDEF /* img_grid_cell_white.png in Resources */, + C394CE3E16F074440008BDEF /* img_grid_cell_white@2x.png in Resources */, + C394CE4D16F0AA1D0008BDEF /* img_grid_cell_pattern.png in Resources */, + C394CE4E16F0AA1D0008BDEF /* img_grid_cell_pattern@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + C3FFA0F716E90838003A6F1C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C3FFA10716E9084C003A6F1C /* UIFont+Replacement.m in Sources */, + C394CE4216F093D00008BDEF /* UIImage+Replacement.m in Sources */, + C394CE4A16F09FE60008BDEF /* UIColor+Replacement.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA9861F613F01BCE006DEC9A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -224,12 +328,55 @@ DA4C182113F446120015A600 /* FontsViewController.m in Sources */, 6FB0365D14BFFEC900626500 /* AdjustmentViewController.m in Sources */, 6FB0366414C0030200626500 /* OBSlider.m in Sources */, + C394CE4116F093D00008BDEF /* UIImage+Replacement.m in Sources */, + C394CE4916F09FE60008BDEF /* UIColor+Replacement.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + C3FFA10516E90838003A6F1C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DSTROOT = /tmp/FontReplacer.dst; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + ONLY_ACTIVE_ARCH = NO; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + C3FFA10616E90838003A6F1C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DSTROOT = /tmp/FontReplacer.dst; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; DA98621413F01BCE006DEC9A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -298,6 +445,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + C3FFA10416E90838003A6F1C /* Build configuration list for PBXNativeTarget "FontReplacer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3FFA10516E90838003A6F1C /* Debug */, + C3FFA10616E90838003A6F1C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; DA9861F413F01BCD006DEC9A /* Build configuration list for PBXProject "FontReplacer Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/FontReplacer Demo.xcodeproj/project.xcworkspace/xcuserdata/bransnw6.xcuserdatad/UserInterfaceState.xcuserstate b/FontReplacer Demo.xcodeproj/project.xcworkspace/xcuserdata/bransnw6.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..848a8fca61e278a47b31bbf766e1c18612a23df8 GIT binary patch literal 38841 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 literal 0 HcmV?d00001 diff --git a/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..c18c67a --- /dev/null +++ b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,20 @@ + + + + + + + diff --git a/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer Demo.xcscheme b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer Demo.xcscheme new file mode 100644 index 0000000..5f34725 --- /dev/null +++ b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer Demo.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer.xcscheme b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer.xcscheme new file mode 100644 index 0000000..bebacb7 --- /dev/null +++ b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/FontReplacer.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/xcschememanagement.plist b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e9a85ea --- /dev/null +++ b/FontReplacer Demo.xcodeproj/xcuserdata/bransnw6.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,42 @@ + + + + + SchemeUserState + + FontReplacer Demo.xcscheme + + orderHint + 0 + + FontReplacer.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + C35996AB16E8FDC90082110C + + primary + + + C3FFA0E816E902E6003A6F1C + + primary + + + C3FFA0FA16E90838003A6F1C + + primary + + + DA9861F913F01BCE006DEC9A + + primary + + + + + diff --git a/FontReplacer Demo/DemoViewController.xib b/FontReplacer Demo/DemoViewController.xib index 92ace5a..c02f62b 100644 --- a/FontReplacer Demo/DemoViewController.xib +++ b/FontReplacer Demo/DemoViewController.xib @@ -1,20 +1,21 @@ - 1280 - 10K549 - 1910 - 1038.36 - 461.00 + 1552 + 12C2034 + 3084 + 1187.34 + 625.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 911 + 2083 YES IBProxyObject - IBUIView + IBUIImageView IBUILabel + IBUIView YES @@ -44,7 +45,6 @@ 292 {{20, 20}, {280, 60}} - NO YES @@ -55,6 +55,7 @@ 1 MCAwIDAAA + darkTextColor 1 @@ -69,13 +70,13 @@ 14 16 + 280 292 {{20, 112}, {280, 22}} - NO YES @@ -105,7 +106,6 @@ 292 {{20, 149}, {280, 22}} - NO YES @@ -135,7 +135,6 @@ 292 {{20, 186}, {280, 22}} - NO YES @@ -165,8 +164,7 @@ 292 {{20, 223}, {280, 22}} - - + NO YES 7 @@ -190,17 +188,28 @@ 16 + + + 256 + {{103, 288}, {114, 114}} + + + NO + YES + YES + IBCocoaTouchFramework + + NSImage + img_grid_cell_white.png + + {{0, 20}, {320, 460}} - - 3 - MC43NQA - - 2 - + 1 + MC41ODgyMzUyOTQxIDAuNTg4MjM1Mjk0MSAwLjU4ODIzNTI5NDEAA NO @@ -251,6 +260,7 @@ + @@ -279,6 +289,11 @@ + + 13 + + + @@ -292,11 +307,12 @@ 10.IBPluginDependency 11.IBPluginDependency 12.IBPluginDependency + 13.IBPluginDependency 6.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency - + YES ViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -308,6 +324,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -322,7 +339,7 @@ - 12 + 13 0 @@ -333,6 +350,10 @@ YES 3 - 911 + + img_grid_cell_white.png + {2, 2} + + 2083 diff --git a/FontReplacer Demo/FontReplacer Demo-Info.plist b/FontReplacer Demo/FontReplacer Demo-Info.plist index 4f4116a..757a360 100644 --- a/FontReplacer Demo/FontReplacer Demo-Info.plist +++ b/FontReplacer Demo/FontReplacer Demo-Info.plist @@ -28,10 +28,15 @@ ReplacementFonts - ArialMT + Arial-BoldItalicMT Name - CaviarDreams + CaviarDreams-BoldItalic + + Arial-BoldMT + + Name + CaviarDreams-Bold Arial-ItalicMT @@ -40,19 +45,33 @@ Offset 0.3 - Arial-BoldMT + ArialMT Name - CaviarDreams-Bold + CaviarDreams - Arial-BoldItalicMT + + ReplacementImages + + img_grid_cell_white.png - Name - CaviarDreams-BoldItalic + Insets + {0.0,0.0,1.0,1.0} + Tile + + + + ReplacementColors + + {150,150,150} + + Image + img_grid_cell_pattern.png UIAppFonts + Interstate-Bold.otf CaviarDreams.ttf CaviarDreams_Italic.ttf CaviarDreams_Bold.ttf diff --git a/FontReplacer Demo/Images/img_grid_cell_pattern.png b/FontReplacer Demo/Images/img_grid_cell_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..09d440fe5300ab5bd6fd4d5b7841a1c02ea0fe20 GIT binary patch literal 1580 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 W^9}XV4b5Hv0000 + +@interface UIColor (Replacement) + +@end diff --git a/UIColor+Replacement/UIColor+Replacement.m b/UIColor+Replacement/UIColor+Replacement.m new file mode 100644 index 0000000..7518748 --- /dev/null +++ b/UIColor+Replacement/UIColor+Replacement.m @@ -0,0 +1,93 @@ +// +// UIColor+Replacement.m +// FontReplacer Demo +// +// Created by Nick Bransby-Williams on 13/03/2013. +// +// + +#import "UIColor+Replacement.h" +#import + +@implementation UIColor (Replacement) + +static NSDictionary *replacementDictionary = nil; + +static void initializeReplacementColors() +{ + static BOOL initialized = NO; + if (initialized) + return; + initialized = YES; + + NSDictionary *replacementDictionary = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReplacementColors"]; + NSLog(@"ReplacementColors = %@", replacementDictionary); + [UIColor setReplacementDictionary:replacementDictionary]; +} + ++ (void) load +{ + Method initWithRedGreenBlueAlpha = class_getInstanceMethod([UIColor class], @selector(initWithRed:green:blue:alpha:)); + Method replacementInitWithRedGreenBlueAlpha = class_getInstanceMethod([UIColor class], @selector(replacement_initWithRed:green:blue:alpha:)); + + if (initWithRedGreenBlueAlpha && replacementInitWithRedGreenBlueAlpha && strcmp(method_getTypeEncoding(initWithRedGreenBlueAlpha), method_getTypeEncoding(replacementInitWithRedGreenBlueAlpha)) == 0) + method_exchangeImplementations(initWithRedGreenBlueAlpha, replacementInitWithRedGreenBlueAlpha); +} + +- (UIColor *)replacementColorForString:(NSString*)string +{ + NSDictionary* info = [replacementDictionary objectForKey:string]; + NSLog(@"Found replacement color %@ for %@", info, string); + if (!replacementDictionary) + return nil; + return [[UIColor colorWithPatternImage:[UIImage imageNamed:[info objectForKey:@"Image"]]] retain]; +} + + +- (UIColor *)replacement_initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha +{ + initializeReplacementColors(); + NSString* string = [NSString stringWithFormat:@"{%d,%d,%d}", (int)ceilf(red*255), (int)ceilf(green*255), (int)ceilf(blue*255)]; + return [self replacementColorForString:string] ?: [self replacement_initWithRed:red green:green blue:blue alpha:alpha]; +} + ++ (NSDictionary *) replacementDictionary +{ + return replacementDictionary; +} + ++ (void) setReplacementDictionary:(NSDictionary *)aReplacementDictionary +{ + if (aReplacementDictionary == replacementDictionary) + return; + + for (id key in [aReplacementDictionary allKeys]) + { + if (![key isKindOfClass:[NSString class]]) + { + NSLog(@"ERROR: Replacement color key must be a string."); + return; + } + + NSString *colorName = (NSString *)key; + id value = [aReplacementDictionary valueForKey:colorName]; + if (![value isKindOfClass:[NSDictionary class]]) + { + NSLog(@"ERROR: Replacement color value must be a dictionary."); + return; + } + + NSDictionary *replacementInfo = (NSDictionary *)value; + NSString *replacementImage = [replacementInfo objectForKey:@"Image"]; + if (!replacementImage) + { + NSLog(@"ERROR: Missing image name for color '%@'", colorName); + return; + } + + } + [replacementDictionary release]; + replacementDictionary = [aReplacementDictionary retain]; +} + +@end diff --git a/UIFont+Replacement/UIFont+Replacement.m b/UIFont+Replacement/UIFont+Replacement.m index df96dd4..ad0f401 100644 --- a/UIFont+Replacement/UIFont+Replacement.m +++ b/UIFont+Replacement/UIFont+Replacement.m @@ -22,6 +22,7 @@ static void initializeReplacementFonts() initialized = YES; NSDictionary *replacementDictionary = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReplacementFonts"]; + NSLog(@"ReplacementFonts = %@", replacementDictionary); [UIFont setReplacementDictionary:replacementDictionary]; } diff --git a/UIImageNibPlaceholder+Replacement/UIImage+Replacement.h b/UIImageNibPlaceholder+Replacement/UIImage+Replacement.h new file mode 100644 index 0000000..76ea941 --- /dev/null +++ b/UIImageNibPlaceholder+Replacement/UIImage+Replacement.h @@ -0,0 +1,13 @@ +// +// UIImage+Replacement.h +// FontReplacer Demo +// +// Created by Nick Bransby-Williams on 13/03/2013. +// +// + +#import + +@interface UIImage (Replacement) + +@end diff --git a/UIImageNibPlaceholder+Replacement/UIImage+Replacement.m b/UIImageNibPlaceholder+Replacement/UIImage+Replacement.m new file mode 100644 index 0000000..b67b21e --- /dev/null +++ b/UIImageNibPlaceholder+Replacement/UIImage+Replacement.m @@ -0,0 +1,105 @@ +// +// UIImage+Replacement.m +// FontReplacer Demo +// +// Created by Nick Bransby-Williams on 13/03/2013. +// +// + +#import "UIImage+Replacement.h" +#import + +@implementation UIImage (Replacement) + +static NSDictionary *replacementDictionary = nil; + +static void initializeReplacementImages() +{ + static BOOL initialized = NO; + if (initialized) + return; + initialized = YES; + + NSDictionary *replacementDictionary = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReplacementImages"]; + NSLog(@"ReplacementImages = %@", replacementDictionary); + [UIImage setReplacementDictionary:replacementDictionary]; +} + ++ (void) load +{ + Class class = NSClassFromString(@"UIImageNibPlaceholder"); + Method initWithCoder = class_getInstanceMethod(class, @selector(initWithCoder:)); + Method replacementInitWithCoder = class_getInstanceMethod(class, @selector(replacement_initWithCoder:)); + + if (initWithCoder && replacementInitWithCoder && strcmp(method_getTypeEncoding(initWithCoder), method_getTypeEncoding(replacementInitWithCoder)) == 0) + method_exchangeImplementations(initWithCoder, replacementInitWithCoder); +} + ++ (NSDictionary *) replacementInfoForImageNamed:(NSString *)imageName +{ + if (!replacementDictionary) + return nil; + + return [replacementDictionary objectForKey:imageName]; +} + ++ (UIEdgeInsets) capInsetsForInfo:(NSDictionary *)info +{ + NSString* string = [info objectForKey:@"Insets"]; + return string ? UIEdgeInsetsFromString(string) : UIEdgeInsetsZero; +} + ++ (UIImageResizingMode) resizingModeForInfo:(NSDictionary *)info +{ + return [info[@"Stretch"] isEqual:@YES] || [info[@"Tile"] isEqual:@NO] ? UIImageResizingModeStretch : UIImageResizingModeTile; +} + +- (id) replacement_initWithCoder:(NSCoder *)coder +{ + initializeReplacementImages(); + UIImage* image = [self replacement_initWithCoder:coder]; + NSString * imageName = [coder decodeObjectForKey:@"UIResourceName"]; + NSDictionary* info = [UIImage replacementInfoForImageNamed:imageName]; + return info == nil ? image : [[image resizableImageWithCapInsets:[UIImage capInsetsForInfo:info] resizingMode:[UIImage resizingModeForInfo:info]] retain]; +} + ++ (NSDictionary *) replacementDictionary +{ + return replacementDictionary; +} + ++ (void) setReplacementDictionary:(NSDictionary *)aReplacementDictionary +{ + if (aReplacementDictionary == replacementDictionary) + return; + + for (id key in [aReplacementDictionary allKeys]) + { + if (![key isKindOfClass:[NSString class]]) + { + NSLog(@"ERROR: Replacement image key must be a string."); + return; + } + + NSString *imageName = (NSString *)key; + id value = [aReplacementDictionary valueForKey:imageName]; + if (![value isKindOfClass:[NSDictionary class]]) + { + NSLog(@"ERROR: Replacement image value must be a dictionary."); + return; + } + + NSDictionary *replacementInfo = (NSDictionary *)value; + NSString *replacementImageInsets = [replacementInfo objectForKey:@"Insets"]; + if (!replacementImageInsets) + { + NSLog(@"ERROR: Missing cap insets name for image '%@'", imageName); + return; + } + + } + [replacementDictionary release]; + replacementDictionary = [aReplacementDictionary retain]; +} + +@end