├── .gitignore ├── ASTouchVisualizer.xcodeproj └── project.pbxproj ├── ASTouchVisualizer ├── ASAppDelegate.h ├── ASAppDelegate.m ├── ASTouchVisualizer-Info.plist ├── ASTouchVisualizer-Prefix.pch ├── ASTouchVisualizer.h ├── ASTouchVisualizer.m ├── ASViewController.h ├── ASViewController.m ├── Default-568h@2x.png ├── Default.png ├── Default@2x.png ├── en.lproj │ ├── ASViewController.xib │ └── InfoPlist.strings └── main.m ├── Readme.md ├── Screenshots ├── iPhone.png └── iPhoneVideo.gif └── license /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | .DS_Store 3 | *.pbxuser 4 | *.perspective 5 | *.perspectivev3 6 | *.mode1v3 7 | *.mode2v3 8 | *.xcworkspace 9 | xcuserdata -------------------------------------------------------------------------------- /ASTouchVisualizer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4AA4DC84165BD61600F326CA /* Readme.md in Resources */ = {isa = PBXBuildFile; fileRef = 4AA4DC83165BD61600F326CA /* Readme.md */; }; 11 | 4AA4DC92165CB5BF00F326CA /* license in Resources */ = {isa = PBXBuildFile; fileRef = 4AA4DC91165CB5BF00F326CA /* license */; }; 12 | 4ABD602A16554AB1005E8371 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ABD602916554AB1005E8371 /* UIKit.framework */; }; 13 | 4ABD602C16554AB1005E8371 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ABD602B16554AB1005E8371 /* Foundation.framework */; }; 14 | 4ABD602E16554AB1005E8371 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ABD602D16554AB1005E8371 /* CoreGraphics.framework */; }; 15 | 4ABD603416554AB2005E8371 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4ABD603216554AB2005E8371 /* InfoPlist.strings */; }; 16 | 4ABD603616554AB2005E8371 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABD603516554AB2005E8371 /* main.m */; }; 17 | 4ABD603A16554AB2005E8371 /* ASAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABD603916554AB2005E8371 /* ASAppDelegate.m */; }; 18 | 4ABD603C16554AB2005E8371 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 4ABD603B16554AB2005E8371 /* Default.png */; }; 19 | 4ABD603E16554AB2005E8371 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4ABD603D16554AB2005E8371 /* Default@2x.png */; }; 20 | 4ABD604016554AB2005E8371 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4ABD603F16554AB2005E8371 /* Default-568h@2x.png */; }; 21 | 4ABD604316554AB2005E8371 /* ASViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABD604216554AB2005E8371 /* ASViewController.m */; }; 22 | 4ABD604616554AB2005E8371 /* ASViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4ABD604416554AB2005E8371 /* ASViewController.xib */; }; 23 | 4ABD60531655540F005E8371 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ABD60521655540F005E8371 /* QuartzCore.framework */; }; 24 | 4ABD606016556452005E8371 /* ASTouchVisualizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABD605F16556452005E8371 /* ASTouchVisualizer.m */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | 4AA4DC83165BD61600F326CA /* Readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Readme.md; sourceTree = ""; }; 29 | 4AA4DC91165CB5BF00F326CA /* license */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license; sourceTree = ""; }; 30 | 4ABD602516554AB1005E8371 /* ASTouchVisualizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ASTouchVisualizer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 4ABD602916554AB1005E8371 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 32 | 4ABD602B16554AB1005E8371 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 33 | 4ABD602D16554AB1005E8371 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 34 | 4ABD603116554AB2005E8371 /* ASTouchVisualizer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ASTouchVisualizer-Info.plist"; sourceTree = ""; }; 35 | 4ABD603316554AB2005E8371 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 36 | 4ABD603516554AB2005E8371 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 37 | 4ABD603716554AB2005E8371 /* ASTouchVisualizer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ASTouchVisualizer-Prefix.pch"; sourceTree = ""; }; 38 | 4ABD603816554AB2005E8371 /* ASAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASAppDelegate.h; sourceTree = ""; }; 39 | 4ABD603916554AB2005E8371 /* ASAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASAppDelegate.m; sourceTree = ""; }; 40 | 4ABD603B16554AB2005E8371 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 41 | 4ABD603D16554AB2005E8371 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 42 | 4ABD603F16554AB2005E8371 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 43 | 4ABD604116554AB2005E8371 /* ASViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ASViewController.h; sourceTree = ""; }; 44 | 4ABD604216554AB2005E8371 /* ASViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASViewController.m; sourceTree = ""; }; 45 | 4ABD604516554AB2005E8371 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ASViewController.xib; sourceTree = ""; }; 46 | 4ABD60521655540F005E8371 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 47 | 4ABD605E16556452005E8371 /* ASTouchVisualizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASTouchVisualizer.h; sourceTree = ""; }; 48 | 4ABD605F16556452005E8371 /* ASTouchVisualizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASTouchVisualizer.m; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 4ABD602216554AB1005E8371 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | 4ABD60531655540F005E8371 /* QuartzCore.framework in Frameworks */, 57 | 4ABD602A16554AB1005E8371 /* UIKit.framework in Frameworks */, 58 | 4ABD602C16554AB1005E8371 /* Foundation.framework in Frameworks */, 59 | 4ABD602E16554AB1005E8371 /* CoreGraphics.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | 4ABD601A16554AB1005E8371 = { 67 | isa = PBXGroup; 68 | children = ( 69 | 4AA4DC91165CB5BF00F326CA /* license */, 70 | 4AA4DC83165BD61600F326CA /* Readme.md */, 71 | 4ABD602F16554AB1005E8371 /* ASTouchVisualizer */, 72 | 4ABD602816554AB1005E8371 /* Frameworks */, 73 | 4ABD602616554AB1005E8371 /* Products */, 74 | ); 75 | sourceTree = ""; 76 | }; 77 | 4ABD602616554AB1005E8371 /* Products */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 4ABD602516554AB1005E8371 /* ASTouchVisualizer.app */, 81 | ); 82 | name = Products; 83 | sourceTree = ""; 84 | }; 85 | 4ABD602816554AB1005E8371 /* Frameworks */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 4ABD60521655540F005E8371 /* QuartzCore.framework */, 89 | 4ABD602916554AB1005E8371 /* UIKit.framework */, 90 | 4ABD602B16554AB1005E8371 /* Foundation.framework */, 91 | 4ABD602D16554AB1005E8371 /* CoreGraphics.framework */, 92 | ); 93 | name = Frameworks; 94 | sourceTree = ""; 95 | }; 96 | 4ABD602F16554AB1005E8371 /* ASTouchVisualizer */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 4ABD603816554AB2005E8371 /* ASAppDelegate.h */, 100 | 4ABD603916554AB2005E8371 /* ASAppDelegate.m */, 101 | 4ABD604116554AB2005E8371 /* ASViewController.h */, 102 | 4ABD604216554AB2005E8371 /* ASViewController.m */, 103 | 4ABD604416554AB2005E8371 /* ASViewController.xib */, 104 | 4ABD605E16556452005E8371 /* ASTouchVisualizer.h */, 105 | 4ABD605F16556452005E8371 /* ASTouchVisualizer.m */, 106 | 4ABD603016554AB2005E8371 /* Supporting Files */, 107 | ); 108 | path = ASTouchVisualizer; 109 | sourceTree = ""; 110 | }; 111 | 4ABD603016554AB2005E8371 /* Supporting Files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 4ABD603116554AB2005E8371 /* ASTouchVisualizer-Info.plist */, 115 | 4ABD603216554AB2005E8371 /* InfoPlist.strings */, 116 | 4ABD603516554AB2005E8371 /* main.m */, 117 | 4ABD603716554AB2005E8371 /* ASTouchVisualizer-Prefix.pch */, 118 | 4ABD603B16554AB2005E8371 /* Default.png */, 119 | 4ABD603D16554AB2005E8371 /* Default@2x.png */, 120 | 4ABD603F16554AB2005E8371 /* Default-568h@2x.png */, 121 | ); 122 | name = "Supporting Files"; 123 | sourceTree = ""; 124 | }; 125 | /* End PBXGroup section */ 126 | 127 | /* Begin PBXNativeTarget section */ 128 | 4ABD602416554AB1005E8371 /* ASTouchVisualizer */ = { 129 | isa = PBXNativeTarget; 130 | buildConfigurationList = 4ABD604916554AB2005E8371 /* Build configuration list for PBXNativeTarget "ASTouchVisualizer" */; 131 | buildPhases = ( 132 | 4ABD602116554AB1005E8371 /* Sources */, 133 | 4ABD602216554AB1005E8371 /* Frameworks */, 134 | 4ABD602316554AB1005E8371 /* Resources */, 135 | ); 136 | buildRules = ( 137 | ); 138 | dependencies = ( 139 | ); 140 | name = ASTouchVisualizer; 141 | productName = ASTouchVisualizer; 142 | productReference = 4ABD602516554AB1005E8371 /* ASTouchVisualizer.app */; 143 | productType = "com.apple.product-type.application"; 144 | }; 145 | /* End PBXNativeTarget section */ 146 | 147 | /* Begin PBXProject section */ 148 | 4ABD601C16554AB1005E8371 /* Project object */ = { 149 | isa = PBXProject; 150 | attributes = { 151 | CLASSPREFIX = AS; 152 | LastUpgradeCheck = 0450; 153 | ORGANIZATIONNAME = AutreSphere; 154 | }; 155 | buildConfigurationList = 4ABD601F16554AB1005E8371 /* Build configuration list for PBXProject "ASTouchVisualizer" */; 156 | compatibilityVersion = "Xcode 3.2"; 157 | developmentRegion = English; 158 | hasScannedForEncodings = 0; 159 | knownRegions = ( 160 | en, 161 | ); 162 | mainGroup = 4ABD601A16554AB1005E8371; 163 | productRefGroup = 4ABD602616554AB1005E8371 /* Products */; 164 | projectDirPath = ""; 165 | projectRoot = ""; 166 | targets = ( 167 | 4ABD602416554AB1005E8371 /* ASTouchVisualizer */, 168 | ); 169 | }; 170 | /* End PBXProject section */ 171 | 172 | /* Begin PBXResourcesBuildPhase section */ 173 | 4ABD602316554AB1005E8371 /* Resources */ = { 174 | isa = PBXResourcesBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | 4ABD603416554AB2005E8371 /* InfoPlist.strings in Resources */, 178 | 4ABD603C16554AB2005E8371 /* Default.png in Resources */, 179 | 4ABD603E16554AB2005E8371 /* Default@2x.png in Resources */, 180 | 4ABD604016554AB2005E8371 /* Default-568h@2x.png in Resources */, 181 | 4ABD604616554AB2005E8371 /* ASViewController.xib in Resources */, 182 | 4AA4DC84165BD61600F326CA /* Readme.md in Resources */, 183 | 4AA4DC92165CB5BF00F326CA /* license in Resources */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXResourcesBuildPhase section */ 188 | 189 | /* Begin PBXSourcesBuildPhase section */ 190 | 4ABD602116554AB1005E8371 /* Sources */ = { 191 | isa = PBXSourcesBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | 4ABD603616554AB2005E8371 /* main.m in Sources */, 195 | 4ABD603A16554AB2005E8371 /* ASAppDelegate.m in Sources */, 196 | 4ABD604316554AB2005E8371 /* ASViewController.m in Sources */, 197 | 4ABD606016556452005E8371 /* ASTouchVisualizer.m in Sources */, 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | }; 201 | /* End PBXSourcesBuildPhase section */ 202 | 203 | /* Begin PBXVariantGroup section */ 204 | 4ABD603216554AB2005E8371 /* InfoPlist.strings */ = { 205 | isa = PBXVariantGroup; 206 | children = ( 207 | 4ABD603316554AB2005E8371 /* en */, 208 | ); 209 | name = InfoPlist.strings; 210 | sourceTree = ""; 211 | }; 212 | 4ABD604416554AB2005E8371 /* ASViewController.xib */ = { 213 | isa = PBXVariantGroup; 214 | children = ( 215 | 4ABD604516554AB2005E8371 /* en */, 216 | ); 217 | name = ASViewController.xib; 218 | sourceTree = ""; 219 | }; 220 | /* End PBXVariantGroup section */ 221 | 222 | /* Begin XCBuildConfiguration section */ 223 | 4ABD604716554AB2005E8371 /* Debug */ = { 224 | isa = XCBuildConfiguration; 225 | buildSettings = { 226 | ALWAYS_SEARCH_USER_PATHS = NO; 227 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 228 | CLANG_CXX_LIBRARY = "libc++"; 229 | CLANG_ENABLE_OBJC_ARC = YES; 230 | CLANG_WARN_EMPTY_BODY = YES; 231 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 232 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 233 | COPY_PHASE_STRIP = NO; 234 | GCC_C_LANGUAGE_STANDARD = gnu99; 235 | GCC_DYNAMIC_NO_PIC = NO; 236 | GCC_OPTIMIZATION_LEVEL = 0; 237 | GCC_PREPROCESSOR_DEFINITIONS = ( 238 | "DEBUG=1", 239 | "$(inherited)", 240 | ); 241 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 242 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 243 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 244 | GCC_WARN_UNUSED_VARIABLE = YES; 245 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 246 | ONLY_ACTIVE_ARCH = YES; 247 | SDKROOT = iphoneos; 248 | TARGETED_DEVICE_FAMILY = 2; 249 | }; 250 | name = Debug; 251 | }; 252 | 4ABD604816554AB2005E8371 /* Release */ = { 253 | isa = XCBuildConfiguration; 254 | buildSettings = { 255 | ALWAYS_SEARCH_USER_PATHS = NO; 256 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 257 | CLANG_CXX_LIBRARY = "libc++"; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | CLANG_WARN_EMPTY_BODY = YES; 260 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 261 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 262 | COPY_PHASE_STRIP = YES; 263 | GCC_C_LANGUAGE_STANDARD = gnu99; 264 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 265 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 266 | GCC_WARN_UNUSED_VARIABLE = YES; 267 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 268 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 269 | SDKROOT = iphoneos; 270 | TARGETED_DEVICE_FAMILY = 2; 271 | VALIDATE_PRODUCT = YES; 272 | }; 273 | name = Release; 274 | }; 275 | 4ABD604A16554AB2005E8371 /* Debug */ = { 276 | isa = XCBuildConfiguration; 277 | buildSettings = { 278 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 279 | GCC_PREFIX_HEADER = "ASTouchVisualizer/ASTouchVisualizer-Prefix.pch"; 280 | INFOPLIST_FILE = "ASTouchVisualizer/ASTouchVisualizer-Info.plist"; 281 | PRODUCT_NAME = ASTouchVisualizer; 282 | TARGETED_DEVICE_FAMILY = "1,2"; 283 | WRAPPER_EXTENSION = app; 284 | }; 285 | name = Debug; 286 | }; 287 | 4ABD604B16554AB2005E8371 /* Release */ = { 288 | isa = XCBuildConfiguration; 289 | buildSettings = { 290 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 291 | GCC_PREFIX_HEADER = "ASTouchVisualizer/ASTouchVisualizer-Prefix.pch"; 292 | INFOPLIST_FILE = "ASTouchVisualizer/ASTouchVisualizer-Info.plist"; 293 | PRODUCT_NAME = ASTouchVisualizer; 294 | TARGETED_DEVICE_FAMILY = "1,2"; 295 | WRAPPER_EXTENSION = app; 296 | }; 297 | name = Release; 298 | }; 299 | /* End XCBuildConfiguration section */ 300 | 301 | /* Begin XCConfigurationList section */ 302 | 4ABD601F16554AB1005E8371 /* Build configuration list for PBXProject "ASTouchVisualizer" */ = { 303 | isa = XCConfigurationList; 304 | buildConfigurations = ( 305 | 4ABD604716554AB2005E8371 /* Debug */, 306 | 4ABD604816554AB2005E8371 /* Release */, 307 | ); 308 | defaultConfigurationIsVisible = 0; 309 | defaultConfigurationName = Release; 310 | }; 311 | 4ABD604916554AB2005E8371 /* Build configuration list for PBXNativeTarget "ASTouchVisualizer" */ = { 312 | isa = XCConfigurationList; 313 | buildConfigurations = ( 314 | 4ABD604A16554AB2005E8371 /* Debug */, 315 | 4ABD604B16554AB2005E8371 /* Release */, 316 | ); 317 | defaultConfigurationIsVisible = 0; 318 | defaultConfigurationName = Release; 319 | }; 320 | /* End XCConfigurationList section */ 321 | }; 322 | rootObject = 4ABD601C16554AB1005E8371 /* Project object */; 323 | } 324 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // ASAppDelegate.h 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class ASViewController; 12 | 13 | @interface ASAppDelegate : UIResponder 14 | 15 | @property (strong, nonatomic) UIWindow *window; 16 | 17 | @property (strong, nonatomic) ASViewController *viewController; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // ASAppDelegate.m 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import "ASAppDelegate.h" 10 | 11 | #import "ASViewController.h" 12 | #import "ASTouchVisualizer.h" 13 | 14 | @implementation ASAppDelegate 15 | 16 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 17 | { 18 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 19 | // Override point for customization after application launch. 20 | self.viewController = [[ASViewController alloc] initWithNibName:@"ASViewController" bundle:nil]; 21 | self.window.rootViewController = self.viewController; 22 | [self.window makeKeyAndVisible]; 23 | [ASTouchVisualizer install]; 24 | 25 | return YES; 26 | } 27 | 28 | - (void)applicationWillResignActive:(UIApplication *)application 29 | { 30 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 31 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 32 | } 33 | 34 | - (void)applicationDidEnterBackground:(UIApplication *)application 35 | { 36 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 37 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 38 | } 39 | 40 | - (void)applicationWillEnterForeground:(UIApplication *)application 41 | { 42 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 43 | } 44 | 45 | - (void)applicationDidBecomeActive:(UIApplication *)application 46 | { 47 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 48 | } 49 | 50 | - (void)applicationWillTerminate:(UIApplication *)application 51 | { 52 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 53 | } 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASTouchVisualizer-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.autresphere.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UIStatusBarHidden 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASTouchVisualizer-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ASTouchVisualizer' target in the 'ASTouchVisualizer' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_4_0 8 | #warning "This project uses features only available in iOS SDK 4.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASTouchVisualizer.h: -------------------------------------------------------------------------------- 1 | // 2 | // ASTouchVisualizer.h 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface ASTouchVisualizer : NSObject 13 | 14 | + (BOOL)isInstalled; 15 | 16 | + (void)install; 17 | 18 | + (void)uninstall; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASTouchVisualizer.m: -------------------------------------------------------------------------------- 1 | // 2 | // ASTouchVisualizer.m 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import "ASTouchVisualizer.h" 10 | #import 11 | #import 12 | 13 | static CGFloat const kTouchViewAttentionScale = 3; 14 | static CGFloat const kTouchViewSize = 60; 15 | static CGFloat const kTouchViewAlpha = 0.5; 16 | static NSTimeInterval const kTouchAnimationduration = 0.25; 17 | 18 | static ASTouchVisualizer *touchVisualizer; 19 | 20 | @class ASTouchView; 21 | 22 | @interface ASTouchVisualizer () 23 | { 24 | CFMutableDictionaryRef touchViews; 25 | } 26 | @property (nonatomic, strong) UIView *mainView; 27 | @property (nonatomic, getter=isInstalled) BOOL installed; 28 | 29 | + (ASTouchVisualizer *)sharedTouchVisualizer; 30 | - (void)showTouches:(NSSet *)touches; 31 | @end 32 | 33 | @interface ASTouchView : UIView 34 | @property (nonatomic, strong) UIView *markView; 35 | @property (nonatomic, strong) UIView *attentionView; 36 | @property (readonly, nonatomic) UIWindow *window; 37 | @end 38 | 39 | @implementation ASTouchView 40 | 41 | - (id)initWithFrame:(CGRect)frame 42 | { 43 | self = [super initWithFrame:frame]; 44 | if(self) 45 | { 46 | [self setupAttentionView]; 47 | [self setupMarkView]; 48 | } 49 | 50 | return self; 51 | } 52 | 53 | - (void)setupAttentionView 54 | { 55 | self.attentionView = [[UIView alloc] initWithFrame:self.bounds]; 56 | self.attentionView.layer.cornerRadius = kTouchViewSize/2; 57 | self.attentionView.layer.borderColor = [UIColor redColor].CGColor; 58 | self.attentionView.layer.borderWidth = 6; 59 | self.attentionView.alpha = 0; 60 | self.attentionView.layer.shadowOpacity = 0.25; 61 | self.attentionView.layer.shadowOffset = CGSizeMake(1, 1); 62 | self.attentionView.layer.shadowColor = self.attentionView.layer.borderColor; 63 | self.attentionView.layer.shadowRadius = 1; 64 | [self addSubview:self.attentionView]; 65 | } 66 | 67 | - (void)setupMarkView 68 | { 69 | self.markView = [[UIView alloc] initWithFrame:self.bounds]; 70 | [self addSubview:self.markView]; 71 | self.markView.backgroundColor = [UIColor whiteColor]; 72 | self.markView.layer.cornerRadius = kTouchViewSize/2; 73 | self.markView.layer.borderWidth = 2; 74 | self.markView.layer.borderColor = [UIColor blackColor].CGColor; 75 | self.markView.layer.shadowOpacity = 0.5; 76 | self.markView.layer.shadowOffset = CGSizeMake(2, 2); 77 | self.markView.layer.shadowRadius = 2; 78 | self.markView.transform = CGAffineTransformMakeScale(0.1, 0.1); 79 | self.markView.alpha = 0; 80 | } 81 | 82 | - (void)show 83 | { 84 | [UIView animateWithDuration:kTouchAnimationduration 85 | animations:^{ 86 | self.markView.alpha = kTouchViewAlpha; 87 | self.markView.transform = CGAffineTransformIdentity; 88 | self.attentionView.alpha = 0.75; 89 | self.markView.alpha = kTouchViewAlpha; 90 | } 91 | completion:^(BOOL finished) { 92 | [UIView animateWithDuration:kTouchAnimationduration 93 | animations:^{ 94 | self.attentionView.alpha = 0; 95 | }]; 96 | }]; 97 | 98 | [UIView animateWithDuration:kTouchAnimationduration*2 99 | animations:^{ 100 | self.attentionView.transform = CGAffineTransformMakeScale(kTouchViewAttentionScale, kTouchViewAttentionScale); 101 | } 102 | completion:^(BOOL finished) { 103 | self.attentionView.alpha = 0; 104 | self.attentionView.transform = CGAffineTransformIdentity; 105 | }]; 106 | } 107 | 108 | - (void)hide 109 | { 110 | [UIView animateWithDuration:kTouchAnimationduration 111 | animations:^{ 112 | self.markView.transform = CGAffineTransformMakeScale(0.1, 0.1); 113 | self.markView.alpha = 0; 114 | }]; 115 | } 116 | 117 | - (BOOL)isVisible 118 | { 119 | return self.markView.alpha != 0; 120 | } 121 | 122 | @end 123 | 124 | @interface UIWindow (TouchVisualizer) 125 | @end 126 | 127 | @implementation UIWindow (TouchVisualizer) 128 | 129 | - (void)swizzled_sendEvent:(UIEvent *)event 130 | { 131 | [[ASTouchVisualizer sharedTouchVisualizer] showTouches:event.allTouches]; 132 | [self swizzled_sendEvent:event]; 133 | } 134 | 135 | @end 136 | 137 | @implementation ASTouchVisualizer 138 | + (ASTouchVisualizer *)sharedTouchVisualizer 139 | { 140 | static dispatch_once_t onceToken; 141 | dispatch_once(&onceToken, ^{ 142 | touchVisualizer = [[ASTouchVisualizer alloc] init]; 143 | }); 144 | 145 | return touchVisualizer; 146 | } 147 | 148 | + (void)install 149 | { 150 | [[ASTouchVisualizer sharedTouchVisualizer] install]; 151 | } 152 | 153 | + (void)uninstall 154 | { 155 | [[ASTouchVisualizer sharedTouchVisualizer] uninstall]; 156 | } 157 | 158 | + (BOOL)isInstalled 159 | { 160 | return [[ASTouchVisualizer sharedTouchVisualizer] isInstalled]; 161 | } 162 | 163 | - (void)setupEventHandler 164 | { 165 | Method original, swizzle; 166 | 167 | original = class_getInstanceMethod([UIWindow class], @selector(sendEvent:)); 168 | swizzle = class_getInstanceMethod([UIWindow class], @selector(swizzled_sendEvent:)); 169 | method_exchangeImplementations(original, swizzle); 170 | } 171 | 172 | - (void)setupMainView 173 | { 174 | self.mainView = [[UIView alloc] initWithFrame:self.window.bounds]; 175 | self.mainView.backgroundColor = [UIColor clearColor]; 176 | self.mainView.opaque = NO; 177 | self.mainView.userInteractionEnabled = NO; 178 | self.mainView.transform = self.window.rootViewController.view.transform; 179 | [self.window addSubview:self.mainView]; 180 | } 181 | 182 | - (ASTouchView *)touchViewForTouch:(UITouch *)touch 183 | { 184 | ASTouchView *touchView; 185 | 186 | touchView = (ASTouchView *)CFDictionaryGetValue(touchViews, (__bridge const void *)(touch)); 187 | if(touchView == nil) 188 | { 189 | touchView = [[ASTouchView alloc] initWithFrame:CGRectMake(0, 0, kTouchViewSize, kTouchViewSize)]; 190 | [self.mainView addSubview:touchView]; 191 | CFDictionaryAddValue(touchViews, (__bridge const void *)(touch), (__bridge const void *)(touchView)); 192 | } 193 | 194 | return touchView; 195 | } 196 | 197 | - (id)init 198 | { 199 | self = [super init]; 200 | if(self) 201 | { 202 | touchViews = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); 203 | } 204 | 205 | return self; 206 | } 207 | 208 | - (void)install 209 | { 210 | if (self.installed) { 211 | return; 212 | } 213 | [self setupEventHandler]; 214 | [self setupMainView]; 215 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 216 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActiveNotification:) name:UIApplicationWillResignActiveNotification object:nil]; 217 | [self.window addObserver:self forKeyPath:@"rootViewController" options:NSKeyValueObservingOptionNew context:nil]; 218 | self.installed = YES; 219 | } 220 | 221 | - (void)uninstall 222 | { 223 | if (!self.installed) { 224 | return; 225 | } 226 | [self setupEventHandler]; 227 | [self.window removeObserver:self forKeyPath:@"rootViewController"]; 228 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 229 | [self.mainView removeFromSuperview]; 230 | self.mainView = nil; 231 | for (UIView *touchView in ((__bridge NSMutableDictionary *)touchViews).objectEnumerator) { 232 | [touchView removeFromSuperview]; 233 | } 234 | [((__bridge NSMutableDictionary *)touchViews) removeAllObjects]; 235 | self.installed = NO; 236 | } 237 | 238 | - (void)showTouches:(NSSet *)touches 239 | { 240 | for(UITouch *touch in touches) 241 | { 242 | [self showTouch:touch]; 243 | } 244 | } 245 | 246 | - (void)showTouch:(UITouch *)touch 247 | { 248 | // Make sure mainView is at the top of the view hierarchy 249 | [self.mainView.superview bringSubviewToFront:self.mainView]; 250 | 251 | ASTouchView *touchView; 252 | CGPoint location; 253 | 254 | location = [touch locationInView:self.mainView]; 255 | touchView = [self touchViewForTouch:touch]; 256 | touchView.center = location; 257 | if(![touchView isVisible]) 258 | { 259 | [touchView show]; 260 | } 261 | if(touch.phase == UITouchPhaseEnded || touch.phase == UITouchPhaseCancelled) 262 | { 263 | CFDictionaryRemoveValue(touchViews, (__bridge const void *)(touch)); 264 | [touchView hide]; 265 | } 266 | } 267 | 268 | - (void)hideAllTouchViews 269 | { 270 | CFDictionaryRemoveAllValues(touchViews); 271 | [self.mainView.subviews makeObjectsPerformSelector:@selector(hide)]; 272 | } 273 | 274 | - (UIWindow *)window { 275 | if ([[UIApplication sharedApplication].delegate respondsToSelector:@selector(window)]) { 276 | return [UIApplication sharedApplication].delegate.window; 277 | } else { 278 | return [UIApplication sharedApplication].keyWindow; 279 | } 280 | } 281 | 282 | #pragma mark - Notifications 283 | - (void)applicationWillResignActiveNotification:(NSNotification *)notification 284 | { 285 | [[ASTouchVisualizer sharedTouchVisualizer] hideAllTouchViews]; 286 | } 287 | 288 | - (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification 289 | { 290 | self.mainView.transform = self.window.rootViewController.view.transform; 291 | } 292 | 293 | #pragma mark - KVO Observing 294 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 295 | { 296 | self.mainView.transform = self.window.rootViewController.view.transform; 297 | [self.mainView.superview bringSubviewToFront:self.mainView]; 298 | } 299 | @end 300 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ASViewController.h 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ASViewController : UIViewController 12 | 13 | - (IBAction)handleTapGesture:(UITapGestureRecognizer *)sender; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ASTouchVisualizer/ASViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ASViewController.m 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import "ASViewController.h" 10 | 11 | 12 | /* 13 | Tentative pour capturer les evenements touch sans les bloquer. 14 | Une vue transparente est placée par dessus. 15 | */ 16 | @interface ASViewController () 17 | 18 | @end 19 | 20 | @implementation ASViewController 21 | 22 | - (void)viewDidLoad 23 | { 24 | [super viewDidLoad]; 25 | // Do any additional setup after loading the view, typically from a nib. 26 | } 27 | 28 | - (void)didReceiveMemoryWarning 29 | { 30 | [super didReceiveMemoryWarning]; 31 | // Dispose of any resources that can be recreated. 32 | } 33 | 34 | - (IBAction)handleTapGesture:(UITapGestureRecognizer *)sender 35 | { 36 | NSLog(@"TAP"); 37 | } 38 | @end 39 | -------------------------------------------------------------------------------- /ASTouchVisualizer/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autresphere/ASTouchVisualizer/6ba08fe595bda01b9896444851e4bf89b597f17f/ASTouchVisualizer/Default-568h@2x.png -------------------------------------------------------------------------------- /ASTouchVisualizer/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autresphere/ASTouchVisualizer/6ba08fe595bda01b9896444851e4bf89b597f17f/ASTouchVisualizer/Default.png -------------------------------------------------------------------------------- /ASTouchVisualizer/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autresphere/ASTouchVisualizer/6ba08fe595bda01b9896444851e4bf89b597f17f/ASTouchVisualizer/Default@2x.png -------------------------------------------------------------------------------- /ASTouchVisualizer/en.lproj/ASViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1536 5 | 12C60 6 | 2844 7 | 1187.34 8 | 625.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 1930 12 | 13 | 14 | IBProxyObject 15 | IBUISegmentedControl 16 | IBUISwitch 17 | IBUITextView 18 | IBUIView 19 | 20 | 21 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 22 | 23 | 24 | PluginDependencyRecalculationVersion 25 | 26 | 27 | 28 | 29 | IBFilesOwner 30 | IBIPadFramework 31 | 32 | 33 | IBFirstResponder 34 | IBIPadFramework 35 | 36 | 37 | 38 | 274 39 | 40 | 41 | 42 | 293 43 | {{107, 356}, {94, 27}} 44 | 45 | 46 | 47 | _NS:9 48 | NO 49 | IBIPadFramework 50 | 0 51 | 0 52 | YES 53 | 54 | 55 | 56 | 293 57 | {{98, 269}, {125, 44}} 58 | 59 | 60 | 61 | _NS:9 62 | NO 63 | IBIPadFramework 64 | 2 65 | 0 66 | 67 | OK 68 | Great 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | {0, 0} 80 | {0, 0} 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 293 90 | {{10, 405}, {300, 54}} 91 | 92 | 93 | 94 | _NS:9 95 | 96 | 1 97 | MSAxIDEAA 98 | 99 | YES 100 | YES 101 | NO 102 | IBIPadFramework 103 | NO 104 | NO 105 | These buttons have no actions, there are just here for the demo purpose. 106 | 1 107 | 108 | 2 109 | IBCocoaTouchFramework 110 | 111 | 112 | HelveticaNeue-Medium 113 | Helvetica Neue 114 | 0 115 | 13 116 | 117 | 118 | HelveticaNeue-Medium 119 | 13 120 | 16 121 | 122 | 123 | 124 | 125 | 292 126 | {{10, 16}, {300, 241}} 127 | 128 | 129 | 130 | _NS:9 131 | 132 | YES 133 | YES 134 | IBIPadFramework 135 | NO 136 | 137 | QVNUb3VjaFZpc3VhbGl6ZXIgaXMgYSBzaW1wbGUgY2xhc3MgdGhhdCBzaG93cyB0aGUgY3VycmVudCB0 138 | b3VjaCBldmVudCBvbiB0b3Agb2YgYWxsIHlvdXIgdmlld3MuCgpJdCBpcyB1c2VkIHRvIGNyZWF0ZSBp 139 | UGhvbmUgb3IgaVBhZCB2aWRlbyB0dXRvcmlhbHMgb24gd2hpY2ggZmluZ2VyIG1vdmVtZW50IGlzIGNs 140 | ZWFybHkgc2Vlbi4KCkl0IGlzIGRlYWQgc2ltcGxlIHRvIHVzZSBpbiBhIHByb2plY3QsIG5vIG92ZXJs 141 | b2FkaW5nIG5lZWRlZC4gSnVzdCBjb3B5IHRoZSBmaWxlIGluIHlvdXIgcHJvamVjdCBhbmQgY2FsbCB0 142 | aGUgaW5zdGFsbCBtZXRob2QuCgpMb3JlbSBpcHN1bSBkb2xvciBzaXQgZXIgZWxpdCBsYW1ldCwgY29u 143 | c2VjdGV0YXVyIGNpbGxpdW0gYWRpcGlzaWNpbmcgcGVjdSwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGlu 144 | Y2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0g 145 | dmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFs 146 | aXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXBy 147 | ZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51 148 | bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50 149 | LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJv 150 | cnVtLiBOYW0gbGliZXIgdGUgY29uc2NpZW50IHRvIGZhY3RvciB0dW0gcG9lbiBsZWd1bSBvZGlvcXVl 151 | IGNpdml1ZGEuA 152 | 153 | 154 | 2 155 | IBCocoaTouchFramework 156 | 157 | 158 | HelveticaNeue-Medium 159 | Helvetica Neue 160 | 0 161 | 15 162 | 163 | 164 | HelveticaNeue-Medium 165 | 15 166 | 16 167 | 168 | 169 | 170 | {{0, 20}, {320, 479}} 171 | 172 | 173 | 174 | 175 | 3 176 | MQA 177 | 178 | 2 179 | 180 | 181 | 182 | 2 183 | 184 | 185 | IBUISimulatedFreeformSizeMetricsSentinel 186 | Freeform 187 | 188 | IBIPadFramework 189 | 190 | 191 | 192 | 193 | 194 | 195 | view 196 | 197 | 198 | 199 | 3 200 | 201 | 202 | 203 | 204 | 205 | 0 206 | 207 | 208 | 209 | 210 | 211 | -1 212 | 213 | 214 | File's Owner 215 | 216 | 217 | -2 218 | 219 | 220 | 221 | 222 | 2 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 4 234 | 235 | 236 | 237 | 238 | 7 239 | 240 | 241 | 242 | 243 | 19 244 | 245 | 246 | 247 | 248 | 20 249 | 250 | 251 | 252 | 253 | 254 | 255 | ASViewController 256 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 257 | UIResponder 258 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 259 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 260 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 261 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 262 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 263 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 264 | 265 | 266 | 267 | 268 | 269 | 20 270 | 271 | 272 | 273 | 274 | ASViewController 275 | UIViewController 276 | 277 | handleTapGesture: 278 | UITapGestureRecognizer 279 | 280 | 281 | handleTapGesture: 282 | 283 | handleTapGesture: 284 | UITapGestureRecognizer 285 | 286 | 287 | 288 | IBProjectSource 289 | ./Classes/ASViewController.h 290 | 291 | 292 | 293 | 294 | 0 295 | IBIPadFramework 296 | YES 297 | 3 298 | 1930 299 | 300 | 301 | -------------------------------------------------------------------------------- /ASTouchVisualizer/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ASTouchVisualizer/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ASTouchVisualizer 4 | // 5 | // Created by Philippe Converset on 15/11/12. 6 | // Copyright (c) 2012 AutreSphere. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "ASAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([ASAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | ## ASTouchVisualizer 2 | ASTouchVisualizer is a simple class that shows multitouch events on top of all your views. 3 | 4 | It is used to create iPhone or iPad video tutorials on which finger movement is clearly seen. 5 | 6 | It is dead simple to use in a project, no overloading needed. Just copy the file in your project and call the install method. 7 | 8 | ![](https://github.com/autresphere/ASTouchVisualizer/raw/master/Screenshots/iPhone.png) 9 | ![](https://github.com/autresphere/ASTouchVisualizer/raw/master/Screenshots/iPhoneVideo.gif) 10 | 11 | ## Try it 12 | Download the whole project and run it under Xcode. You can choose either iPhone or iPad destination. 13 | It supports all orientations change. 14 | 15 | ## Use it 16 | Just copy ASTouchVisualizer.h and ASTouchVisualizer.m in your project. 17 | 18 | In your App delegate, add 19 | ``` objective-c 20 | #import "ASTouchVisualizer.h" 21 | ``` 22 | 23 | then at the end of ```application:didFinishLaunchingWithOptions:```, just call 24 | ``` objective-c 25 | [ASTouchVisualizer install]; 26 | ``` 27 | 28 | Thanks to @ johnboiles, you can also uninstall it by calling 29 | ``` objective-c 30 | [ASTouchVisualizer uninstall]; 31 | ``` 32 | ### Supported iOS 33 | iOS 5.0 and above. 34 | 35 | ### ARC Support 36 | ASTouchVisualizer requires ARC. If you wish to use ASTouchVisualizer in a non-ARC project, just add the -fobjc-arc compiler flag to the ASTouchVisualizer.m class. To do this, go to the Build Phases tab in your target settings, open the Compile Sources group, double-click ASTouchVisualizer.m in the list and type -fobjc-arc into the popover. 37 | -------------------------------------------------------------------------------- /Screenshots/iPhone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autresphere/ASTouchVisualizer/6ba08fe595bda01b9896444851e4bf89b597f17f/Screenshots/iPhone.png -------------------------------------------------------------------------------- /Screenshots/iPhoneVideo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autresphere/ASTouchVisualizer/6ba08fe595bda01b9896444851e4bf89b597f17f/Screenshots/iPhoneVideo.gif -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 AutreSphere 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------------------