[
  {
    "path": ".gitignore",
    "content": "# Mac OS X\n*.DS_Store\n*.psd\n\n# Xcode\nbuild/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n*.xcworkspace\n!default.xcworkspace\nxcuserdata\nprofile\n*.moved-aside\n\n# Generated files\nbuild/\n*.[oa]\n*.pyc\n\n# Backup files\n*~.nib\n/ graphics/\n\n\n"
  },
  {
    "path": "JMWhenTapped/JMWhenTapped.h",
    "content": "//\n//  JMWhenTapped.h\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import \"UIView+WhenTappedBlocks.h\"\n"
  },
  {
    "path": "JMWhenTapped/UIView+WhenTappedBlocks.h",
    "content": "//\n//  UIView+WhenTappedBlocks.h\n//\n//  Created by Jake Marsh on 3/7/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#if NS_BLOCKS_AVAILABLE\n\n#import <UIKit/UIKit.h>\n\ntypedef void (^JMWhenTappedBlock)();\n\n@interface UIView (JMWhenTappedBlocks) <UIGestureRecognizerDelegate>\n\n- (void)whenTapped:(JMWhenTappedBlock)block;\n- (void)whenDoubleTapped:(JMWhenTappedBlock)block;\n- (void)whenTwoFingerTapped:(JMWhenTappedBlock)block;\n- (void)whenTouchedDown:(JMWhenTappedBlock)block;\n- (void)whenTouchedUp:(JMWhenTappedBlock)block;\n\n@end\n\n#endif\n"
  },
  {
    "path": "JMWhenTapped/UIView+WhenTappedBlocks.m",
    "content": "//\n//  UIView+WhenTappedBlocks.m\n//\n//  Created by Jake Marsh on 3/7/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#if NS_BLOCKS_AVAILABLE\n\n#import \"UIView+WhenTappedBlocks.h\"\n#import <objc/runtime.h>\n\n@interface UIView (JMWhenTappedBlocks_Private)\n\n- (void)runBlockForKey:(void *)blockKey;\n- (void)setBlock:(JMWhenTappedBlock)block forKey:(void *)blockKey;\n\n- (UITapGestureRecognizer*)addTapGestureRecognizerWithTaps:(NSUInteger) taps touches:(NSUInteger) touches selector:(SEL) selector;\n- (void) addRequirementToSingleTapsRecognizer:(UIGestureRecognizer*) recognizer;\n- (void) addRequiredToDoubleTapsRecognizer:(UIGestureRecognizer*) recognizer;\n\n@end\n\n@implementation UIView (JMWhenTappedBlocks)\n\nstatic char kWhenTappedBlockKey;\nstatic char kWhenDoubleTappedBlockKey;\nstatic char kWhenTwoFingerTappedBlockKey;\nstatic char kWhenTouchedDownBlockKey;\nstatic char kWhenTouchedUpBlockKey;\n\n#pragma mark -\n#pragma mark Set blocks\n\n- (void)runBlockForKey:(void *)blockKey {\n    JMWhenTappedBlock block = objc_getAssociatedObject(self, blockKey);\n    if (block) block();\n}\n\n- (void)setBlock:(JMWhenTappedBlock)block forKey:(void *)blockKey {\n    self.userInteractionEnabled = YES;\n    objc_setAssociatedObject(self, blockKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);\n}\n\n#pragma mark -\n#pragma mark When Tapped\n\n- (void)whenTapped:(JMWhenTappedBlock)block {\n    UITapGestureRecognizer* gesture = [self addTapGestureRecognizerWithTaps:1 touches:1 selector:@selector(viewWasTapped)];\n    [self addRequiredToDoubleTapsRecognizer:gesture];\n    \n    [self setBlock:block forKey:&kWhenTappedBlockKey];\n}\n\n- (void)whenDoubleTapped:(JMWhenTappedBlock)block {\n    UITapGestureRecognizer* gesture = [self addTapGestureRecognizerWithTaps:2 touches:1 selector:@selector(viewWasDoubleTapped)];\n    [self addRequirementToSingleTapsRecognizer:gesture];\n    \n    [self setBlock:block forKey:&kWhenDoubleTappedBlockKey];\n}\n\n- (void)whenTwoFingerTapped:(JMWhenTappedBlock)block {\n    [self addTapGestureRecognizerWithTaps:1 touches:2 selector:@selector(viewWasTwoFingerTapped)];\n    \n    [self setBlock:block forKey:&kWhenTwoFingerTappedBlockKey];\n}\n\n- (void)whenTouchedDown:(JMWhenTappedBlock)block {\n    [self setBlock:block forKey:&kWhenTouchedDownBlockKey];\n}\n\n- (void)whenTouchedUp:(JMWhenTappedBlock)block {\n    [self setBlock:block forKey:&kWhenTouchedUpBlockKey];\n}\n\n#pragma mark -\n#pragma mark Callbacks\n\n- (void)viewWasTapped {\n    [self runBlockForKey:&kWhenTappedBlockKey];\n}\n\n- (void)viewWasDoubleTapped {\n    [self runBlockForKey:&kWhenDoubleTappedBlockKey];\n}\n\n- (void)viewWasTwoFingerTapped {\n    [self runBlockForKey:&kWhenTwoFingerTappedBlockKey];\n}\n\n- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {\n    [super touchesBegan:touches withEvent:event];\n    [self runBlockForKey:&kWhenTouchedDownBlockKey];\n}\n\n- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\n    [super touchesEnded:touches withEvent:event];\n    [self runBlockForKey:&kWhenTouchedUpBlockKey];\n}\n\n#pragma mark -\n#pragma mark Helpers\n\n- (UITapGestureRecognizer*)addTapGestureRecognizerWithTaps:(NSUInteger)taps touches:(NSUInteger)touches selector:(SEL)selector {\n    UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:selector];\n    tapGesture.delegate = self;\n    tapGesture.numberOfTapsRequired = taps;\n    tapGesture.numberOfTouchesRequired = touches;\n    [self addGestureRecognizer:tapGesture];\n    \n    return tapGesture;\n}\n\n- (void) addRequirementToSingleTapsRecognizer:(UIGestureRecognizer*) recognizer {\n    for (UIGestureRecognizer* gesture in [self gestureRecognizers]) {\n        if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {\n            UITapGestureRecognizer* tapGesture = (UITapGestureRecognizer*) gesture;\n            if (tapGesture.numberOfTouchesRequired == 1 && tapGesture.numberOfTapsRequired == 1) {\n                [tapGesture requireGestureRecognizerToFail:recognizer];\n            }\n        }\n    }\n}\n\n- (void) addRequiredToDoubleTapsRecognizer:(UIGestureRecognizer*) recognizer {\n    for (UIGestureRecognizer* gesture in [self gestureRecognizers]) {\n        if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {\n            UITapGestureRecognizer* tapGesture = (UITapGestureRecognizer*) gesture;\n            if (tapGesture.numberOfTouchesRequired == 2 && tapGesture.numberOfTapsRequired == 1) {\n                [recognizer requireGestureRecognizerToFail:tapGesture];\n            }\n        }\n    }\n}\n\n@end\n\n#endif\n"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/AppDelegate.h",
    "content": "//\n//  JMWhenTappedDemoAppDelegate.h\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@class DemoViewController;\n\n@interface AppDelegate : NSObject <UIApplicationDelegate> {\n\tUIWindow *_window;\n\tDemoViewController *_viewController;\n}\n\n@end"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/AppDelegate.m",
    "content": "//\n//  JMWhenTappedDemoAppDelegate.m\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n#import \"DemoViewController.h\"\n\n@implementation AppDelegate\n\n- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n\t_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n\n\t_viewController = [[DemoViewController alloc] init];\n\t_window.rootViewController = _viewController;\n\n\t[_window makeKeyAndVisible];\n\n    return YES;\n}\n\n\n@end"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/DemoViewController.h",
    "content": "//\n//  JMWhenTappedDemoViewController.h\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DemoViewController : UIViewController\n\n@end"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/DemoViewController.m",
    "content": "//\n//  JMWhenTappedDemoViewController.m\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import \"DemoViewController.h\"\n#import \"JMWhenTapped.h\"\n\n@interface DemoViewController ()\n\n@property (strong, nonatomic) UIView *view1;\n@property (strong, nonatomic) UIView *view2;\n\n@end\n\n@implementation DemoViewController\n\n@synthesize view1 = _view1;\n@synthesize view2 = _view2;\n\n- (void) loadView {\n\t[super loadView];\n\n\tself.view1 = [[UIView alloc] initWithFrame:CGRectMake(20.0, 20.0, 100.0, 100.0)];\n\tself.view1.backgroundColor = [UIColor redColor];\n\n\t[self.view addSubview:self.view1];\n\n\t[self.view1 whenTapped:^{\n\t\tUIAlertView *a = [[UIAlertView alloc] initWithTitle:@\"Tapped!\" \n                                                    message:@\"You tapped view1! Congratulations!\" \n                                                   delegate:nil \n                                          cancelButtonTitle:@\"OK\" \n                                          otherButtonTitles:nil];\n\t\t[a show];\n\t}];\n    \n    [self.view1 whenDoubleTapped:^{\n        UIAlertView *a = [[UIAlertView alloc] initWithTitle:@\"Double tapped!\" \n                                                    message:@\"You double tapped view1! Congratulations!\" \n                                                   delegate:nil\n                                          cancelButtonTitle:@\"OK\" \n                                          otherButtonTitles:nil];\n\t\t[a show];\n    }];\n    \n    [self.view1 whenTwoFingerTapped:^{\n        UIAlertView *a = [[UIAlertView alloc] initWithTitle:@\"Two finger tapped!\" \n                                                    message:@\"You two finger tapped view1! Congratulations!\" \n                                                   delegate:nil \n                                          cancelButtonTitle:@\"OK\" \n                                          otherButtonTitles:nil];\n\t\t[a show];\n    }];\n\n\n\tself.view2 = [[UIView alloc] initWithFrame:CGRectMake(140.0, 20.0, 100.0, 100.0)];\n\tself.view2.backgroundColor = [UIColor blueColor];\n\n\t[self.view addSubview:self.view2];\n\n    __block DemoViewController *safeSelf = self;\n\t[self.view2 whenTouchedDown:^{\n\t\tsafeSelf.view2.backgroundColor = [UIColor yellowColor];\n\t}];\n\n\t[self.view2 whenTouchedUp:^{\n\t\tsafeSelf.view2.backgroundColor = [UIColor blueColor];\n\n\t\tUIAlertView *a = [[UIAlertView alloc] initWithTitle:@\"Tapped!\" \n                                                    message:@\"You tapped view2! Congratulations!\" \n                                                   delegate:nil \n                                          cancelButtonTitle:@\"OK\" \n                                          otherButtonTitles:nil];\n\t\t[a show];\n\t}];\n\n}\n\n#pragma mark Cleanup Methods\n\n- (void) viewDidUnload {\n    [super viewDidUnload];\n}\n- (void) didReceiveMemoryWarning {\n    [super didReceiveMemoryWarning];\n}\n\n@end"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/JMWhenTappedDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.rubberducksoft.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/JMWhenTappedDemo-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'JMWhenTappedDemo' target in the 'JMWhenTappedDemo' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_3_0\n#warning \"This project uses features only available in iPhone SDK 3.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n\t#import <UIKit/UIKit.h>\n\t#import <Foundation/Foundation.h>\n#endif"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo/main.m",
    "content": "//\n//  main.m\n//  JMWhenTappedDemo\n//\n//  Created by Jake Marsh on 4/27/11.\n//  Copyright 2011 Rubber Duck Software. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\nint main(int argc, char *argv[]) {\n\t@autoreleasepool {\n\n\t\tint retVal = UIApplicationMain(argc, argv, nil, @\"AppDelegate\");\n\n\n\t\treturn retVal;\n\t}\n}\n"
  },
  {
    "path": "JMWhenTappedDemo/JMWhenTappedDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t301AA693136ADFB000B2BB5C /* UIView+WhenTappedBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 301AA692136ADFB000B2BB5C /* UIView+WhenTappedBlocks.m */; };\n\t\t309F988F136899270030817E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 309F988E136899270030817E /* UIKit.framework */; };\n\t\t309F9891136899270030817E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 309F9890136899270030817E /* Foundation.framework */; };\n\t\t309F9893136899270030817E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 309F9892136899270030817E /* CoreGraphics.framework */; };\n\t\t309F9899136899270030817E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 309F9897136899270030817E /* InfoPlist.strings */; };\n\t\t309F989C136899270030817E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 309F989B136899270030817E /* main.m */; };\n\t\t309F989F136899270030817E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 309F989E136899270030817E /* AppDelegate.m */; };\n\t\t309F98A5136899270030817E /* DemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 309F98A4136899270030817E /* DemoViewController.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t301AA692136ADFB000B2BB5C /* UIView+WhenTappedBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIView+WhenTappedBlocks.m\"; sourceTree = \"<group>\"; };\n\t\t309F988A136899270030817E /* JMWhenTappedDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JMWhenTappedDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t309F988E136899270030817E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t309F9890136899270030817E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t309F9892136899270030817E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t309F9896136899270030817E /* JMWhenTappedDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"JMWhenTappedDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t309F9898136899270030817E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t309F989A136899270030817E /* JMWhenTappedDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"JMWhenTappedDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t309F989B136899270030817E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t309F989D136899270030817E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t309F989E136899270030817E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t309F98A3136899270030817E /* DemoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoViewController.h; sourceTree = \"<group>\"; };\n\t\t309F98A4136899270030817E /* DemoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoViewController.m; sourceTree = \"<group>\"; };\n\t\t309F98B113689AE20030817E /* UIView+WhenTappedBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIView+WhenTappedBlocks.h\"; sourceTree = \"<group>\"; };\n\t\t309F98B513689AFA0030817E /* JMWhenTapped.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JMWhenTapped.h; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t309F9887136899270030817E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t309F988F136899270030817E /* UIKit.framework in Frameworks */,\n\t\t\t\t309F9891136899270030817E /* Foundation.framework in Frameworks */,\n\t\t\t\t309F9893136899270030817E /* CoreGraphics.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t309F987F136899270030817E = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F9894136899270030817E /* JMWhenTappedDemo */,\n\t\t\t\t309F988D136899270030817E /* Frameworks */,\n\t\t\t\t309F988B136899270030817E /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t309F988B136899270030817E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F988A136899270030817E /* JMWhenTappedDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t309F988D136899270030817E /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F988E136899270030817E /* UIKit.framework */,\n\t\t\t\t309F9890136899270030817E /* Foundation.framework */,\n\t\t\t\t309F9892136899270030817E /* CoreGraphics.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t309F9894136899270030817E /* JMWhenTappedDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F98AE13689AE20030817E /* JMWhenTapped */,\n\t\t\t\t309F989D136899270030817E /* AppDelegate.h */,\n\t\t\t\t309F989E136899270030817E /* AppDelegate.m */,\n\t\t\t\t309F98A3136899270030817E /* DemoViewController.h */,\n\t\t\t\t309F98A4136899270030817E /* DemoViewController.m */,\n\t\t\t\t309F9895136899270030817E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = JMWhenTappedDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t309F9895136899270030817E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F9896136899270030817E /* JMWhenTappedDemo-Info.plist */,\n\t\t\t\t309F9897136899270030817E /* InfoPlist.strings */,\n\t\t\t\t309F989A136899270030817E /* JMWhenTappedDemo-Prefix.pch */,\n\t\t\t\t309F989B136899270030817E /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t309F98AE13689AE20030817E /* JMWhenTapped */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t309F98B113689AE20030817E /* UIView+WhenTappedBlocks.h */,\n\t\t\t\t301AA692136ADFB000B2BB5C /* UIView+WhenTappedBlocks.m */,\n\t\t\t\t309F98B513689AFA0030817E /* JMWhenTapped.h */,\n\t\t\t);\n\t\t\tname = JMWhenTapped;\n\t\t\tpath = ../../JMWhenTapped;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t309F9889136899270030817E /* JMWhenTappedDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 309F98AB136899270030817E /* Build configuration list for PBXNativeTarget \"JMWhenTappedDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t309F9886136899270030817E /* Sources */,\n\t\t\t\t309F9887136899270030817E /* Frameworks */,\n\t\t\t\t309F9888136899270030817E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = JMWhenTappedDemo;\n\t\t\tproductName = JMWhenTappedDemo;\n\t\t\tproductReference = 309F988A136899270030817E /* JMWhenTappedDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t309F9881136899270030817E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tORGANIZATIONNAME = \"Rubber Duck Software\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 309F9884136899270030817E /* Build configuration list for PBXProject \"JMWhenTappedDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 309F987F136899270030817E;\n\t\t\tproductRefGroup = 309F988B136899270030817E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t309F9889136899270030817E /* JMWhenTappedDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t309F9888136899270030817E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t309F9899136899270030817E /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t309F9886136899270030817E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t309F989C136899270030817E /* main.m in Sources */,\n\t\t\t\t309F989F136899270030817E /* AppDelegate.m in Sources */,\n\t\t\t\t309F98A5136899270030817E /* DemoViewController.m in Sources */,\n\t\t\t\t301AA693136ADFB000B2BB5C /* UIView+WhenTappedBlocks.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t309F9897136899270030817E /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t309F9898136899270030817E /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t309F98A9136899270030817E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = DEBUG;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvmgcc42;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 4.3;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t309F98AA136899270030817E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvmgcc42;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 4.3;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t309F98AC136899270030817E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"JMWhenTappedDemo/JMWhenTappedDemo-Prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINFOPLIST_FILE = \"JMWhenTappedDemo/JMWhenTappedDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t309F98AD136899270030817E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"JMWhenTappedDemo/JMWhenTappedDemo-Prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINFOPLIST_FILE = \"JMWhenTappedDemo/JMWhenTappedDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t309F9884136899270030817E /* Build configuration list for PBXProject \"JMWhenTappedDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t309F98A9136899270030817E /* Debug */,\n\t\t\t\t309F98AA136899270030817E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t309F98AB136899270030817E /* Build configuration list for PBXNativeTarget \"JMWhenTappedDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t309F98AC136899270030817E /* Debug */,\n\t\t\t\t309F98AD136899270030817E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 309F9881136899270030817E /* Project object */;\n}\n"
  },
  {
    "path": "MIT-LICENSE",
    "content": "Copyright (c) 2012 Jake Marsh and other contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "README.markdown",
    "content": "## What is it?\n\n`JMWhenTapped` is a simple little syntactical-sugar addition to all `UIView` objects, as well as any class that inherits from `UIView`. It allows you to assign touch-up, touch-down, tapped (touched down then up), double taps and two finger taps actions to a `UIView` object using a convenient blocks-style syntax. (Examples shown below).\n\n## Installation\n\nClone the repo. Add the `JMWhenTapped` folder to your iOS 4 project. `#import \"JMWhenTapped.h\"` wherever you'd like to use the syntax.\n\n## Examples & Usage\n\nUse it like this:\n\t\n\t[myView whenTapped:^{\n\t\tNSLog(@\"I was tapped!\");\n\t}];\n\t\nOr like this:\n\n\t[myView whenTouchedDown:^{\n\t\tNSLog(@\"I was touched down!\");\n\t}];\n\t\nAnd also like this:\n\n\t[myView whenTouchedUp:^{\n\t\tNSLog(@\"I was touched up!\");\t\t\n\t}];\n\nThis works the same way with double tap and two finger taps.\n\n## The Different Actions\n\nThe `whenTapped:` method should be used in cases where you simply want something to happen when the user taps on a view (i.e. you are concerned with performing some action when their finger is down then up, like changing to a \"pressed\" state.)\n\nThe `whenDoubleTapped:` method should be used when you want to check for double taps on your view.\n\nThe `whenTwoFingerTapped:` method should be used when you want to check for single taps made with two fingers (like in Maps.app).\n\nThe `whenTouchedDown:` method should be used when you want to trigger some action when the user touches down on your view.\n\nThe `whenTouchedUp:` method should be used when you want to trigger some action when the user touches up on your view.\n\n## Demo\n\nIncluded in this repo is a demo Xcode project that illustrates a quick example of how to use `JMWhenTapped`."
  }
]