├── BlockAlertView ├── BlockAlertView.h └── BlockAlertView.m ├── Media.xcassets ├── AppIcon.appiconset │ ├── 120-1.png │ ├── 120.png │ ├── 152.png │ ├── 180.png │ ├── 29.png │ ├── 40.png │ ├── 58-1.png │ ├── 58.png │ ├── 76.png │ ├── 80-1.png │ ├── 80.png │ ├── 87.png │ └── Contents.json ├── Devices │ ├── iPad Air 2 │ │ ├── iPadAir2LandscapeBlck.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadAir2LscpBlack.png │ │ │ └── iPadAir2LscpBlack@2x.png │ │ ├── iPadAir2LanscapeSlv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadAir2LscpSlv.png │ │ │ └── iPadAir2LscpSlv@2x.png │ │ ├── iPadAir2PrtBlck.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadAir2PrtBlack.png │ │ │ └── iPadAir2PrtBlack@2x.png │ │ └── iPadAir2PrtSlv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadAir2PrtSlv.png │ │ │ └── iPadAir2PrtSlv@2x.png │ ├── iPad Mini Retina 3 │ │ ├── iPadMini3LandscapeBlack.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadMini3LandscapeBlack.png │ │ │ └── iPadMini3LandscapeBlack@2x.png │ │ ├── iPadMini3LandscapeSlv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadMini3LandscapeSlv.png │ │ │ └── iPadMini3LandscapeSlv@2x.png │ │ ├── iPadMini3VertBlack.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadMini3VertBlack.png │ │ │ └── iPadMini3VertBlack@2x.png │ │ └── iPadMini3VertSlv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPadMini3VertSlv.png │ │ │ └── iPadMini3VertSlv@2x.png │ ├── iPad4.imageset │ │ ├── Contents.json │ │ ├── iPad3.png │ │ └── iPad3@2x.png │ ├── iPadMini.imageset │ │ ├── Contents.json │ │ ├── iPadMini.png │ │ └── iPadMini@2x.png │ ├── iPhone 5c │ │ └── iPhone5cBlue.imageset │ │ │ ├── Contents.json │ │ │ ├── iPhone5cBlue.png │ │ │ └── iPhone5cBlue@2x.png │ ├── iPhone 6+ │ │ ├── iPhone6+Black.imageset │ │ │ ├── Contents.json │ │ │ ├── iPhone6+Black.png │ │ │ └── iPhone6+Black@2x.png │ │ └── iPhone6+Slv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPhone6+Slv.png │ │ │ └── iPhone6+Slv@2x.png │ ├── iPhone 6 │ │ ├── iPhone6PrtBlack.imageset │ │ │ ├── Contents.json │ │ │ ├── iPhone6PrtBlack.png │ │ │ └── iPhone6PrtBlack@2x.png │ │ └── iPhone6PrtSlv.imageset │ │ │ ├── Contents.json │ │ │ ├── iPhone6PrtSlv.png │ │ │ └── iPhone6PrtSlv@2x.png │ ├── iPhone4s.imageset │ │ ├── Contents.json │ │ ├── iPhone_4s_Verticle.png │ │ └── iPhone_4s_Verticle@2x.png │ └── iPhone5.imageset │ │ ├── Contents.json │ │ ├── iPhone_5_Vertical.png │ │ └── iPhone_5_Vertical@2x.png ├── LaunchImage.launchimage │ ├── 5s.png │ ├── 5standard.png │ ├── 6plus.png │ ├── 6standard.png │ ├── Contents.json │ ├── bigiPadLscp.png │ ├── bigiPadPrt.png │ ├── smalliPadLscp.png │ └── smalliPadPrt.png └── Tab Bar Icons │ ├── recentSavedTab.imageset │ ├── Contents.json │ ├── tab_recent_icon.png │ ├── tab_recent_icon@2x.png │ └── tab_recent_icon@3x.png │ └── screenshotTab.imageset │ ├── Contents.json │ ├── tab_capture_icon.png │ ├── tab_capture_icon@2x.png │ └── tab_capture_icon@3x.png ├── README.md ├── ScreenShotPrep.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ ├── jasonloewy.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── jloewy.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ ├── jasonloewy.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints.xcbkptlist │ └── xcschemes │ │ ├── ScreenShotPrep.xcscheme │ │ └── xcschememanagement.plist │ └── jloewy.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── ScreenShotPrep.xcscheme │ └── xcschememanagement.plist └── ScreenShotPrep ├── AppDelegate.h ├── AppDelegate.m ├── Capture Screenshot ├── ImagePickerPreviewViewController.h ├── ImagePickerPreviewViewController.m ├── LayeredDeviceView.swift ├── PreviewSettingsViewController.h └── PreviewSettingsViewController.m ├── DEVTabBarViewController.swift ├── Data Objects ├── Screenshot.h └── Screenshot.m ├── DataResourceHandler.h ├── DataResourceHandler.m ├── Device Selection ├── DEVDeviceSelectionCollectionViewController.swift ├── Data │ ├── DEVDevice.h │ └── DEVDevice.m └── View │ └── DEVDeviceCollectionViewCell.swift ├── Recent Screenshots ├── RecentShotsViewController.h └── RecentShotsViewController.m ├── ScreenShotPrep-Bridging-Header.h ├── ScreenShotPrep-Info.plist ├── ScreenShotPrep-Prefix.pch ├── SourceSansPro-Bold.ttf ├── SourceSansPro-ExtraLight.ttf ├── SourceSansPro-Light.ttf ├── SourceSansPro-Regular.ttf ├── SourceSansPro-Semibold.ttf ├── en.lproj ├── InfoPlist.strings └── MainStoryboard_iPhone.storyboard └── main.m /BlockAlertView/BlockAlertView.h: -------------------------------------------------------------------------------- 1 | // 2 | // BlockAlertView.h 3 | // LSATMax 4 | // 5 | // Created by Jason Loewy on 1/9/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class BlockAlertView; 12 | 13 | typedef void(^JLAlertBlock)(BlockAlertView* alertView, NSInteger buttonIndex); 14 | 15 | @interface BlockAlertView : UIAlertView 16 | { 17 | JLAlertBlock _clickedButtonBlock; 18 | JLAlertBlock _willDismissBlock; 19 | JLAlertBlock _didDismissBlock; 20 | } 21 | 22 | @property (nonatomic, strong) id secondaryDelegate; 23 | 24 | - (void) setClickedButtonBlock:(JLAlertBlock) clickedButtonBlock; 25 | - (void) setWillDismissBlock:(JLAlertBlock) willDismissBlock; 26 | - (void) setDidDismissBlock:(JLAlertBlock) didDismissBlock; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /BlockAlertView/BlockAlertView.m: -------------------------------------------------------------------------------- 1 | // 2 | // BlockAlertView.m 3 | // LSATMax 4 | // 5 | // Created by Jason Loewy on 1/9/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "BlockAlertView.h" 10 | 11 | @implementation BlockAlertView 12 | 13 | #pragma mark - 14 | #pragma mark - Initialization Methods 15 | 16 | // Simple block initialization methods 17 | - (void) setClickedButtonBlock:(JLAlertBlock)clickedButtonBlock 18 | { 19 | [self setDelegate:self]; 20 | _clickedButtonBlock = clickedButtonBlock; 21 | } 22 | 23 | - (void) setWillDismissBlock:(JLAlertBlock)willDismissBlock 24 | { 25 | [self setDelegate:self]; 26 | _willDismissBlock = willDismissBlock; 27 | } 28 | 29 | - (void) setDidDismissBlock:(JLAlertBlock)didDismissBlock 30 | { 31 | [self setDelegate:self]; 32 | _didDismissBlock = didDismissBlock; 33 | } 34 | 35 | #pragma mark - 36 | #pragma mark - Responding Actions 37 | 38 | - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 39 | { 40 | if (_clickedButtonBlock != NULL) 41 | _clickedButtonBlock(self, buttonIndex); 42 | 43 | if ([_secondaryDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) 44 | [_secondaryDelegate alertView:alertView clickedButtonAtIndex:buttonIndex]; 45 | } 46 | 47 | - (void) alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex 48 | { 49 | if (_willDismissBlock != NULL) 50 | _willDismissBlock(self, buttonIndex); 51 | 52 | if ([_secondaryDelegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) 53 | [_secondaryDelegate alertView:alertView willDismissWithButtonIndex:buttonIndex]; 54 | } 55 | 56 | - (void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 57 | { 58 | if (_didDismissBlock != NULL) 59 | _didDismissBlock(self, buttonIndex); 60 | 61 | if ([_secondaryDelegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) 62 | [_secondaryDelegate alertView:alertView didDismissWithButtonIndex:buttonIndex]; 63 | } 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/120-1.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/58-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/58-1.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/80-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/80-1.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /Media.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "58.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "29x29", 11 | "idiom" : "iphone", 12 | "filename" : "87.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "40x40", 17 | "idiom" : "iphone", 18 | "filename" : "80-1.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "40x40", 23 | "idiom" : "iphone", 24 | "filename" : "120.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "60x60", 29 | "idiom" : "iphone", 30 | "filename" : "120-1.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "180.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "29x29", 41 | "idiom" : "ipad", 42 | "filename" : "29.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "29x29", 47 | "idiom" : "ipad", 48 | "filename" : "58-1.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "40x40", 53 | "idiom" : "ipad", 54 | "filename" : "40.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "40x40", 59 | "idiom" : "ipad", 60 | "filename" : "80.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "76x76", 65 | "idiom" : "ipad", 66 | "filename" : "76.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "76x76", 71 | "idiom" : "ipad", 72 | "filename" : "152.png", 73 | "scale" : "2x" 74 | } 75 | ], 76 | "info" : { 77 | "version" : 1, 78 | "author" : "xcode" 79 | }, 80 | "properties" : { 81 | "pre-rendered" : true 82 | } 83 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LandscapeBlck.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadAir2LscpBlack.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadAir2LscpBlack@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LandscapeBlck.imageset/iPadAir2LscpBlack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2LandscapeBlck.imageset/iPadAir2LscpBlack.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LandscapeBlck.imageset/iPadAir2LscpBlack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2LandscapeBlck.imageset/iPadAir2LscpBlack@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LanscapeSlv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadAir2LscpSlv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadAir2LscpSlv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LanscapeSlv.imageset/iPadAir2LscpSlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2LanscapeSlv.imageset/iPadAir2LscpSlv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2LanscapeSlv.imageset/iPadAir2LscpSlv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2LanscapeSlv.imageset/iPadAir2LscpSlv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtBlck.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadAir2PrtBlack.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadAir2PrtBlack@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtBlck.imageset/iPadAir2PrtBlack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2PrtBlck.imageset/iPadAir2PrtBlack.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtBlck.imageset/iPadAir2PrtBlack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2PrtBlck.imageset/iPadAir2PrtBlack@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtSlv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadAir2PrtSlv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadAir2PrtSlv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtSlv.imageset/iPadAir2PrtSlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2PrtSlv.imageset/iPadAir2PrtSlv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Air 2/iPadAir2PrtSlv.imageset/iPadAir2PrtSlv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Air 2/iPadAir2PrtSlv.imageset/iPadAir2PrtSlv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeBlack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadMini3LandscapeBlack.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadMini3LandscapeBlack@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeBlack.imageset/iPadMini3LandscapeBlack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeBlack.imageset/iPadMini3LandscapeBlack.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeBlack.imageset/iPadMini3LandscapeBlack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeBlack.imageset/iPadMini3LandscapeBlack@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeSlv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadMini3LandscapeSlv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadMini3LandscapeSlv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeSlv.imageset/iPadMini3LandscapeSlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeSlv.imageset/iPadMini3LandscapeSlv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeSlv.imageset/iPadMini3LandscapeSlv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3LandscapeSlv.imageset/iPadMini3LandscapeSlv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertBlack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadMini3VertBlack.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadMini3VertBlack@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertBlack.imageset/iPadMini3VertBlack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertBlack.imageset/iPadMini3VertBlack.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertBlack.imageset/iPadMini3VertBlack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertBlack.imageset/iPadMini3VertBlack@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertSlv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadMini3VertSlv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadMini3VertSlv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertSlv.imageset/iPadMini3VertSlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertSlv.imageset/iPadMini3VertSlv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertSlv.imageset/iPadMini3VertSlv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad Mini Retina 3/iPadMini3VertSlv.imageset/iPadMini3VertSlv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPad3.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPad3@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad4.imageset/iPad3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad4.imageset/iPad3.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPad4.imageset/iPad3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPad4.imageset/iPad3@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPadMini.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPadMini.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPadMini@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPadMini.imageset/iPadMini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPadMini.imageset/iPadMini.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPadMini.imageset/iPadMini@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPadMini.imageset/iPadMini@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 5c/iPhone5cBlue.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone5cBlue.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone5cBlue@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 5c/iPhone5cBlue.imageset/iPhone5cBlue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 5c/iPhone5cBlue.imageset/iPhone5cBlue.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 5c/iPhone5cBlue.imageset/iPhone5cBlue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 5c/iPhone5cBlue.imageset/iPhone5cBlue@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Black.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone6+Black.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone6+Black@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Black.imageset/iPhone6+Black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6+/iPhone6+Black.imageset/iPhone6+Black.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Black.imageset/iPhone6+Black@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6+/iPhone6+Black.imageset/iPhone6+Black@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Slv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone6+Slv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone6+Slv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Slv.imageset/iPhone6+Slv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6+/iPhone6+Slv.imageset/iPhone6+Slv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6+/iPhone6+Slv.imageset/iPhone6+Slv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6+/iPhone6+Slv.imageset/iPhone6+Slv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtBlack.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone6PrtBlack.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone6PrtBlack@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtBlack.imageset/iPhone6PrtBlack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6/iPhone6PrtBlack.imageset/iPhone6PrtBlack.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtBlack.imageset/iPhone6PrtBlack@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6/iPhone6PrtBlack.imageset/iPhone6PrtBlack@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtSlv.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone6PrtSlv.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone6PrtSlv@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtSlv.imageset/iPhone6PrtSlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6/iPhone6PrtSlv.imageset/iPhone6PrtSlv.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone 6/iPhone6PrtSlv.imageset/iPhone6PrtSlv@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone 6/iPhone6PrtSlv.imageset/iPhone6PrtSlv@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone4s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone_4s_Verticle.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone_4s_Verticle@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone4s.imageset/iPhone_4s_Verticle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone4s.imageset/iPhone_4s_Verticle.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone4s.imageset/iPhone_4s_Verticle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone4s.imageset/iPhone_4s_Verticle@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "iPhone_5_Vertical.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "iPhone_5_Vertical@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone5.imageset/iPhone_5_Vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone5.imageset/iPhone_5_Vertical.png -------------------------------------------------------------------------------- /Media.xcassets/Devices/iPhone5.imageset/iPhone_5_Vertical@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Devices/iPhone5.imageset/iPhone_5_Vertical@2x.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/5s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/5s.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/5standard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/5standard.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/6plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/6plus.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/6standard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/6standard.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "736h", 7 | "filename" : "6plus.png", 8 | "minimum-system-version" : "8.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "extent" : "full-screen", 14 | "idiom" : "iphone", 15 | "subtype" : "667h", 16 | "filename" : "6standard.png", 17 | "minimum-system-version" : "8.0", 18 | "orientation" : "portrait", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "orientation" : "portrait", 23 | "idiom" : "iphone", 24 | "extent" : "full-screen", 25 | "minimum-system-version" : "7.0", 26 | "filename" : "5standard.png", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "extent" : "full-screen", 31 | "idiom" : "iphone", 32 | "subtype" : "retina4", 33 | "filename" : "5s.png", 34 | "minimum-system-version" : "7.0", 35 | "orientation" : "portrait", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "orientation" : "portrait", 40 | "idiom" : "ipad", 41 | "extent" : "full-screen", 42 | "minimum-system-version" : "7.0", 43 | "filename" : "smalliPadPrt.png", 44 | "scale" : "1x" 45 | }, 46 | { 47 | "orientation" : "landscape", 48 | "idiom" : "ipad", 49 | "extent" : "full-screen", 50 | "minimum-system-version" : "7.0", 51 | "filename" : "smalliPadLscp.png", 52 | "scale" : "1x" 53 | }, 54 | { 55 | "orientation" : "portrait", 56 | "idiom" : "ipad", 57 | "extent" : "full-screen", 58 | "minimum-system-version" : "7.0", 59 | "filename" : "bigiPadPrt.png", 60 | "scale" : "2x" 61 | }, 62 | { 63 | "orientation" : "landscape", 64 | "idiom" : "ipad", 65 | "extent" : "full-screen", 66 | "minimum-system-version" : "7.0", 67 | "filename" : "bigiPadLscp.png", 68 | "scale" : "2x" 69 | } 70 | ], 71 | "info" : { 72 | "version" : 1, 73 | "author" : "xcode" 74 | } 75 | } -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/bigiPadLscp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/bigiPadLscp.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/bigiPadPrt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/bigiPadPrt.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/smalliPadLscp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/smalliPadLscp.png -------------------------------------------------------------------------------- /Media.xcassets/LaunchImage.launchimage/smalliPadPrt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/LaunchImage.launchimage/smalliPadPrt.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "tab_recent_icon.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "tab_recent_icon@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "tab_recent_icon@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/recentSavedTab.imageset/tab_recent_icon@3x.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/screenshotTab.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "tab_capture_icon.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "tab_capture_icon@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "tab_capture_icon@3x.png" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon@2x.png -------------------------------------------------------------------------------- /Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/Media.xcassets/Tab Bar Icons/screenshotTab.imageset/tab_capture_icon@3x.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Dev Frames is an open source tool for creating in-device screenshots of your own apps for use in various places like websites and marketing materials. 2 | 3 | 4 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 030EFC761A18600A00CD7425 /* DEVTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030EFC751A18600A00CD7425 /* DEVTabBarViewController.swift */; }; 11 | 035632201A1A6657002AA7FA /* BlockAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0356321F1A1A6657002AA7FA /* BlockAlertView.m */; }; 12 | 03A990D31A15DBF200FD7342 /* DEVDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A990D21A15DBF200FD7342 /* DEVDevice.m */; }; 13 | 03A990D51A15F59900FD7342 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 03A990D41A15F59900FD7342 /* Media.xcassets */; }; 14 | 03BE905C1A1C5FA6001010B4 /* DEVDeviceCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BE905B1A1C5FA6001010B4 /* DEVDeviceCollectionViewCell.swift */; }; 15 | 03BE905E1A1C5FED001010B4 /* DEVDeviceSelectionCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BE905D1A1C5FED001010B4 /* DEVDeviceSelectionCollectionViewController.swift */; }; 16 | 03C985D01A1EDA64001B5005 /* SourceSansPro-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03C985CB1A1EDA64001B5005 /* SourceSansPro-Bold.ttf */; }; 17 | 03C985D11A1EDA64001B5005 /* SourceSansPro-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03C985CC1A1EDA64001B5005 /* SourceSansPro-ExtraLight.ttf */; }; 18 | 03C985D21A1EDA64001B5005 /* SourceSansPro-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03C985CD1A1EDA64001B5005 /* SourceSansPro-Light.ttf */; }; 19 | 03C985D31A1EDA64001B5005 /* SourceSansPro-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03C985CE1A1EDA64001B5005 /* SourceSansPro-Regular.ttf */; }; 20 | 03C985D41A1EDA64001B5005 /* SourceSansPro-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03C985CF1A1EDA64001B5005 /* SourceSansPro-Semibold.ttf */; }; 21 | 03D50B0F1A169DD000020DAF /* LayeredDeviceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D50B0E1A169DD000020DAF /* LayeredDeviceView.swift */; }; 22 | 362823CE16A2949E00249EC7 /* ImagePickerPreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 362823CD16A2949E00249EC7 /* ImagePickerPreviewViewController.m */; }; 23 | 362823DA16A29DD600249EC7 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 362823D916A29DD500249EC7 /* MessageUI.framework */; }; 24 | 362823F316A29EFA00249EC7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 362823F216A29EFA00249EC7 /* QuartzCore.framework */; }; 25 | 3654E1BB169BE7C2009DA304 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3654E1BA169BE7C2009DA304 /* UIKit.framework */; }; 26 | 3654E1BD169BE7C2009DA304 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3654E1BC169BE7C2009DA304 /* Foundation.framework */; }; 27 | 3654E1BF169BE7C2009DA304 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3654E1BE169BE7C2009DA304 /* CoreGraphics.framework */; }; 28 | 3654E1C5169BE7C2009DA304 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3654E1C3169BE7C2009DA304 /* InfoPlist.strings */; }; 29 | 3654E1C7169BE7C2009DA304 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3654E1C6169BE7C2009DA304 /* main.m */; }; 30 | 3654E1CB169BE7C2009DA304 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3654E1CA169BE7C2009DA304 /* AppDelegate.m */; }; 31 | 3654E1D4169BE7C2009DA304 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3654E1D2169BE7C2009DA304 /* MainStoryboard_iPhone.storyboard */; }; 32 | 3654E1E2169BEDF8009DA304 /* RecentShotsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3654E1E1169BEDF8009DA304 /* RecentShotsViewController.m */; }; 33 | 3654E1E6169BEEB2009DA304 /* Screenshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 3654E1E5169BEEB2009DA304 /* Screenshot.m */; }; 34 | 3691B2D216A7C28600B16431 /* PreviewSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3691B2D116A7C28500B16431 /* PreviewSettingsViewController.m */; }; 35 | 369AB9FC16A92C04000FCB6F /* DataResourceHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 369AB9FB16A92C04000FCB6F /* DataResourceHandler.m */; }; 36 | /* End PBXBuildFile section */ 37 | 38 | /* Begin PBXFileReference section */ 39 | 030EFC751A18600A00CD7425 /* DEVTabBarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DEVTabBarViewController.swift; sourceTree = ""; }; 40 | 0356321E1A1A6657002AA7FA /* BlockAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockAlertView.h; sourceTree = ""; }; 41 | 0356321F1A1A6657002AA7FA /* BlockAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlockAlertView.m; sourceTree = ""; }; 42 | 03A990C51A15D6C000FD7342 /* ScreenShotPrep-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ScreenShotPrep-Bridging-Header.h"; sourceTree = ""; }; 43 | 03A990D11A15DBF200FD7342 /* DEVDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DEVDevice.h; path = "Device Selection/Data/DEVDevice.h"; sourceTree = ""; }; 44 | 03A990D21A15DBF200FD7342 /* DEVDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DEVDevice.m; path = "Device Selection/Data/DEVDevice.m"; sourceTree = ""; }; 45 | 03A990D41A15F59900FD7342 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; 46 | 03BE905B1A1C5FA6001010B4 /* DEVDeviceCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DEVDeviceCollectionViewCell.swift; path = "Device Selection/View/DEVDeviceCollectionViewCell.swift"; sourceTree = ""; }; 47 | 03BE905D1A1C5FED001010B4 /* DEVDeviceSelectionCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DEVDeviceSelectionCollectionViewController.swift; path = "Device Selection/DEVDeviceSelectionCollectionViewController.swift"; sourceTree = ""; }; 48 | 03C985CB1A1EDA64001B5005 /* SourceSansPro-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceSansPro-Bold.ttf"; sourceTree = ""; }; 49 | 03C985CC1A1EDA64001B5005 /* SourceSansPro-ExtraLight.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceSansPro-ExtraLight.ttf"; sourceTree = ""; }; 50 | 03C985CD1A1EDA64001B5005 /* SourceSansPro-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceSansPro-Light.ttf"; sourceTree = ""; }; 51 | 03C985CE1A1EDA64001B5005 /* SourceSansPro-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceSansPro-Regular.ttf"; sourceTree = ""; }; 52 | 03C985CF1A1EDA64001B5005 /* SourceSansPro-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceSansPro-Semibold.ttf"; sourceTree = ""; }; 53 | 03D50B0E1A169DD000020DAF /* LayeredDeviceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LayeredDeviceView.swift; path = "Capture Screenshot/LayeredDeviceView.swift"; sourceTree = ""; }; 54 | 362823CC16A2949E00249EC7 /* ImagePickerPreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImagePickerPreviewViewController.h; path = "Capture Screenshot/ImagePickerPreviewViewController.h"; sourceTree = ""; }; 55 | 362823CD16A2949E00249EC7 /* ImagePickerPreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ImagePickerPreviewViewController.m; path = "Capture Screenshot/ImagePickerPreviewViewController.m"; sourceTree = ""; }; 56 | 362823D916A29DD500249EC7 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; 57 | 362823F216A29EFA00249EC7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 58 | 3654E1B6169BE7C2009DA304 /* ScreenShotPrep.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScreenShotPrep.app; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 3654E1BA169BE7C2009DA304 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 60 | 3654E1BC169BE7C2009DA304 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 61 | 3654E1BE169BE7C2009DA304 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 62 | 3654E1C2169BE7C2009DA304 /* ScreenShotPrep-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ScreenShotPrep-Info.plist"; sourceTree = ""; }; 63 | 3654E1C4169BE7C2009DA304 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 64 | 3654E1C6169BE7C2009DA304 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 65 | 3654E1C8169BE7C2009DA304 /* ScreenShotPrep-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ScreenShotPrep-Prefix.pch"; sourceTree = ""; }; 66 | 3654E1C9169BE7C2009DA304 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ScreenShotPrep/AppDelegate.h; sourceTree = ""; }; 67 | 3654E1CA169BE7C2009DA304 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ScreenShotPrep/AppDelegate.m; sourceTree = ""; }; 68 | 3654E1D3169BE7C2009DA304 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; 69 | 3654E1E0169BEDF8009DA304 /* RecentShotsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RecentShotsViewController.h; path = "Recent Screenshots/RecentShotsViewController.h"; sourceTree = ""; }; 70 | 3654E1E1169BEDF8009DA304 /* RecentShotsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RecentShotsViewController.m; path = "Recent Screenshots/RecentShotsViewController.m"; sourceTree = ""; }; 71 | 3654E1E4169BEEB2009DA304 /* Screenshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Screenshot.h; path = "Data Objects/Screenshot.h"; sourceTree = ""; }; 72 | 3654E1E5169BEEB2009DA304 /* Screenshot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Screenshot.m; path = "Data Objects/Screenshot.m"; sourceTree = ""; }; 73 | 3691B2D016A7C28500B16431 /* PreviewSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreviewSettingsViewController.h; path = "Capture Screenshot/PreviewSettingsViewController.h"; sourceTree = ""; }; 74 | 3691B2D116A7C28500B16431 /* PreviewSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PreviewSettingsViewController.m; path = "Capture Screenshot/PreviewSettingsViewController.m"; sourceTree = ""; }; 75 | 369AB9FA16A92C03000FCB6F /* DataResourceHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataResourceHandler.h; sourceTree = ""; }; 76 | 369AB9FB16A92C04000FCB6F /* DataResourceHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataResourceHandler.m; sourceTree = ""; }; 77 | /* End PBXFileReference section */ 78 | 79 | /* Begin PBXFrameworksBuildPhase section */ 80 | 3654E1B3169BE7C2009DA304 /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | 362823F316A29EFA00249EC7 /* QuartzCore.framework in Frameworks */, 85 | 362823DA16A29DD600249EC7 /* MessageUI.framework in Frameworks */, 86 | 3654E1BB169BE7C2009DA304 /* UIKit.framework in Frameworks */, 87 | 3654E1BD169BE7C2009DA304 /* Foundation.framework in Frameworks */, 88 | 3654E1BF169BE7C2009DA304 /* CoreGraphics.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | /* End PBXFrameworksBuildPhase section */ 93 | 94 | /* Begin PBXGroup section */ 95 | 0356321D1A1A6657002AA7FA /* BlockAlertView */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 0356321E1A1A6657002AA7FA /* BlockAlertView.h */, 99 | 0356321F1A1A6657002AA7FA /* BlockAlertView.m */, 100 | ); 101 | path = BlockAlertView; 102 | sourceTree = ""; 103 | }; 104 | 03A990C81A15D6C500FD7342 /* Device Selection */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 03BE905A1A1C5F7F001010B4 /* View */, 108 | 03A990CE1A15DB7E00FD7342 /* Data */, 109 | 03BE905D1A1C5FED001010B4 /* DEVDeviceSelectionCollectionViewController.swift */, 110 | ); 111 | name = "Device Selection"; 112 | sourceTree = ""; 113 | }; 114 | 03A990CE1A15DB7E00FD7342 /* Data */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 03A990D11A15DBF200FD7342 /* DEVDevice.h */, 118 | 03A990D21A15DBF200FD7342 /* DEVDevice.m */, 119 | ); 120 | name = Data; 121 | sourceTree = ""; 122 | }; 123 | 03BE905A1A1C5F7F001010B4 /* View */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 03BE905B1A1C5FA6001010B4 /* DEVDeviceCollectionViewCell.swift */, 127 | ); 128 | name = View; 129 | sourceTree = ""; 130 | }; 131 | 03BF526F1A19A0A600FED372 /* Fonts */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 03C985CB1A1EDA64001B5005 /* SourceSansPro-Bold.ttf */, 135 | 03C985CC1A1EDA64001B5005 /* SourceSansPro-ExtraLight.ttf */, 136 | 03C985CD1A1EDA64001B5005 /* SourceSansPro-Light.ttf */, 137 | 03C985CE1A1EDA64001B5005 /* SourceSansPro-Regular.ttf */, 138 | 03C985CF1A1EDA64001B5005 /* SourceSansPro-Semibold.ttf */, 139 | ); 140 | name = Fonts; 141 | sourceTree = ""; 142 | }; 143 | 362823BC16A27F9D00249EC7 /* Capture Screenshot */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 3691B2EB16A7D7F500B16431 /* PreviewSettings */, 147 | 362823CC16A2949E00249EC7 /* ImagePickerPreviewViewController.h */, 148 | 362823CD16A2949E00249EC7 /* ImagePickerPreviewViewController.m */, 149 | 03D50B0E1A169DD000020DAF /* LayeredDeviceView.swift */, 150 | ); 151 | name = "Capture Screenshot"; 152 | sourceTree = ""; 153 | }; 154 | 362823C716A28C9200249EC7 /* Images */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | ); 158 | name = Images; 159 | sourceTree = ""; 160 | }; 161 | 3654E1AB169BE7C2009DA304 = { 162 | isa = PBXGroup; 163 | children = ( 164 | 03A990D41A15F59900FD7342 /* Media.xcassets */, 165 | 3654E1C9169BE7C2009DA304 /* AppDelegate.h */, 166 | 3654E1CA169BE7C2009DA304 /* AppDelegate.m */, 167 | 3654E1C0169BE7C2009DA304 /* ScreenShotPrep */, 168 | 3654E1C1169BE7C2009DA304 /* Supporting Files */, 169 | 3654E1B9169BE7C2009DA304 /* Frameworks */, 170 | 3654E1B7169BE7C2009DA304 /* Products */, 171 | ); 172 | sourceTree = ""; 173 | }; 174 | 3654E1B7169BE7C2009DA304 /* Products */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 3654E1B6169BE7C2009DA304 /* ScreenShotPrep.app */, 178 | ); 179 | name = Products; 180 | sourceTree = ""; 181 | }; 182 | 3654E1B9169BE7C2009DA304 /* Frameworks */ = { 183 | isa = PBXGroup; 184 | children = ( 185 | 0356321D1A1A6657002AA7FA /* BlockAlertView */, 186 | 362823F216A29EFA00249EC7 /* QuartzCore.framework */, 187 | 362823D916A29DD500249EC7 /* MessageUI.framework */, 188 | 3654E1BA169BE7C2009DA304 /* UIKit.framework */, 189 | 3654E1BC169BE7C2009DA304 /* Foundation.framework */, 190 | 3654E1BE169BE7C2009DA304 /* CoreGraphics.framework */, 191 | ); 192 | name = Frameworks; 193 | sourceTree = ""; 194 | }; 195 | 3654E1C0169BE7C2009DA304 /* ScreenShotPrep */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 03A990C81A15D6C500FD7342 /* Device Selection */, 199 | 367FB39A16AA8D570041B4E3 /* Saved Images Classes */, 200 | 362823BC16A27F9D00249EC7 /* Capture Screenshot */, 201 | 3654E1D2169BE7C2009DA304 /* MainStoryboard_iPhone.storyboard */, 202 | 369AB9FA16A92C03000FCB6F /* DataResourceHandler.h */, 203 | 369AB9FB16A92C04000FCB6F /* DataResourceHandler.m */, 204 | 03A990C51A15D6C000FD7342 /* ScreenShotPrep-Bridging-Header.h */, 205 | 030EFC751A18600A00CD7425 /* DEVTabBarViewController.swift */, 206 | ); 207 | path = ScreenShotPrep; 208 | sourceTree = ""; 209 | }; 210 | 3654E1C1169BE7C2009DA304 /* Supporting Files */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 03BF526F1A19A0A600FED372 /* Fonts */, 214 | 362823C716A28C9200249EC7 /* Images */, 215 | 3654E1C2169BE7C2009DA304 /* ScreenShotPrep-Info.plist */, 216 | 3654E1C3169BE7C2009DA304 /* InfoPlist.strings */, 217 | 3654E1C6169BE7C2009DA304 /* main.m */, 218 | 3654E1C8169BE7C2009DA304 /* ScreenShotPrep-Prefix.pch */, 219 | ); 220 | name = "Supporting Files"; 221 | path = ScreenShotPrep; 222 | sourceTree = ""; 223 | }; 224 | 3654E1E3169BEE73009DA304 /* Data Objects */ = { 225 | isa = PBXGroup; 226 | children = ( 227 | 3654E1E4169BEEB2009DA304 /* Screenshot.h */, 228 | 3654E1E5169BEEB2009DA304 /* Screenshot.m */, 229 | ); 230 | name = "Data Objects"; 231 | sourceTree = ""; 232 | }; 233 | 367FB39A16AA8D570041B4E3 /* Saved Images Classes */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | 3654E1E3169BEE73009DA304 /* Data Objects */, 237 | 3654E1E0169BEDF8009DA304 /* RecentShotsViewController.h */, 238 | 3654E1E1169BEDF8009DA304 /* RecentShotsViewController.m */, 239 | ); 240 | name = "Saved Images Classes"; 241 | sourceTree = ""; 242 | }; 243 | 3691B2EB16A7D7F500B16431 /* PreviewSettings */ = { 244 | isa = PBXGroup; 245 | children = ( 246 | 3691B2D016A7C28500B16431 /* PreviewSettingsViewController.h */, 247 | 3691B2D116A7C28500B16431 /* PreviewSettingsViewController.m */, 248 | ); 249 | name = PreviewSettings; 250 | sourceTree = ""; 251 | }; 252 | /* End PBXGroup section */ 253 | 254 | /* Begin PBXNativeTarget section */ 255 | 3654E1B5169BE7C2009DA304 /* ScreenShotPrep */ = { 256 | isa = PBXNativeTarget; 257 | buildConfigurationList = 3654E1DD169BE7C2009DA304 /* Build configuration list for PBXNativeTarget "ScreenShotPrep" */; 258 | buildPhases = ( 259 | 3654E1B2169BE7C2009DA304 /* Sources */, 260 | 3654E1B3169BE7C2009DA304 /* Frameworks */, 261 | 3654E1B4169BE7C2009DA304 /* Resources */, 262 | ); 263 | buildRules = ( 264 | ); 265 | dependencies = ( 266 | ); 267 | name = ScreenShotPrep; 268 | productName = ScreenShotPrep; 269 | productReference = 3654E1B6169BE7C2009DA304 /* ScreenShotPrep.app */; 270 | productType = "com.apple.product-type.application"; 271 | }; 272 | /* End PBXNativeTarget section */ 273 | 274 | /* Begin PBXProject section */ 275 | 3654E1AD169BE7C2009DA304 /* Project object */ = { 276 | isa = PBXProject; 277 | attributes = { 278 | LastUpgradeCheck = 0450; 279 | ORGANIZATIONNAME = "Jason Loewy"; 280 | TargetAttributes = { 281 | 3654E1B5169BE7C2009DA304 = { 282 | DevelopmentTeam = MYUFZKVZME; 283 | }; 284 | }; 285 | }; 286 | buildConfigurationList = 3654E1B0169BE7C2009DA304 /* Build configuration list for PBXProject "ScreenShotPrep" */; 287 | compatibilityVersion = "Xcode 3.2"; 288 | developmentRegion = English; 289 | hasScannedForEncodings = 0; 290 | knownRegions = ( 291 | en, 292 | ); 293 | mainGroup = 3654E1AB169BE7C2009DA304; 294 | productRefGroup = 3654E1B7169BE7C2009DA304 /* Products */; 295 | projectDirPath = ""; 296 | projectRoot = ""; 297 | targets = ( 298 | 3654E1B5169BE7C2009DA304 /* ScreenShotPrep */, 299 | ); 300 | }; 301 | /* End PBXProject section */ 302 | 303 | /* Begin PBXResourcesBuildPhase section */ 304 | 3654E1B4169BE7C2009DA304 /* Resources */ = { 305 | isa = PBXResourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | 03C985D11A1EDA64001B5005 /* SourceSansPro-ExtraLight.ttf in Resources */, 309 | 03C985D41A1EDA64001B5005 /* SourceSansPro-Semibold.ttf in Resources */, 310 | 3654E1C5169BE7C2009DA304 /* InfoPlist.strings in Resources */, 311 | 3654E1D4169BE7C2009DA304 /* MainStoryboard_iPhone.storyboard in Resources */, 312 | 03C985D31A1EDA64001B5005 /* SourceSansPro-Regular.ttf in Resources */, 313 | 03C985D21A1EDA64001B5005 /* SourceSansPro-Light.ttf in Resources */, 314 | 03A990D51A15F59900FD7342 /* Media.xcassets in Resources */, 315 | 03C985D01A1EDA64001B5005 /* SourceSansPro-Bold.ttf in Resources */, 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | /* End PBXResourcesBuildPhase section */ 320 | 321 | /* Begin PBXSourcesBuildPhase section */ 322 | 3654E1B2169BE7C2009DA304 /* Sources */ = { 323 | isa = PBXSourcesBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | 3654E1C7169BE7C2009DA304 /* main.m in Sources */, 327 | 3654E1CB169BE7C2009DA304 /* AppDelegate.m in Sources */, 328 | 03D50B0F1A169DD000020DAF /* LayeredDeviceView.swift in Sources */, 329 | 03BE905C1A1C5FA6001010B4 /* DEVDeviceCollectionViewCell.swift in Sources */, 330 | 3654E1E2169BEDF8009DA304 /* RecentShotsViewController.m in Sources */, 331 | 030EFC761A18600A00CD7425 /* DEVTabBarViewController.swift in Sources */, 332 | 3654E1E6169BEEB2009DA304 /* Screenshot.m in Sources */, 333 | 362823CE16A2949E00249EC7 /* ImagePickerPreviewViewController.m in Sources */, 334 | 3691B2D216A7C28600B16431 /* PreviewSettingsViewController.m in Sources */, 335 | 03BE905E1A1C5FED001010B4 /* DEVDeviceSelectionCollectionViewController.swift in Sources */, 336 | 03A990D31A15DBF200FD7342 /* DEVDevice.m in Sources */, 337 | 035632201A1A6657002AA7FA /* BlockAlertView.m in Sources */, 338 | 369AB9FC16A92C04000FCB6F /* DataResourceHandler.m in Sources */, 339 | ); 340 | runOnlyForDeploymentPostprocessing = 0; 341 | }; 342 | /* End PBXSourcesBuildPhase section */ 343 | 344 | /* Begin PBXVariantGroup section */ 345 | 3654E1C3169BE7C2009DA304 /* InfoPlist.strings */ = { 346 | isa = PBXVariantGroup; 347 | children = ( 348 | 3654E1C4169BE7C2009DA304 /* en */, 349 | ); 350 | name = InfoPlist.strings; 351 | sourceTree = ""; 352 | }; 353 | 3654E1D2169BE7C2009DA304 /* MainStoryboard_iPhone.storyboard */ = { 354 | isa = PBXVariantGroup; 355 | children = ( 356 | 3654E1D3169BE7C2009DA304 /* en */, 357 | ); 358 | name = MainStoryboard_iPhone.storyboard; 359 | sourceTree = ""; 360 | }; 361 | /* End PBXVariantGroup section */ 362 | 363 | /* Begin XCBuildConfiguration section */ 364 | 3654E1DB169BE7C2009DA304 /* Debug */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | ALWAYS_SEARCH_USER_PATHS = NO; 368 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 369 | CLANG_CXX_LIBRARY = "libc++"; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_WARN_EMPTY_BODY = YES; 372 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 373 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 374 | COPY_PHASE_STRIP = NO; 375 | GCC_C_LANGUAGE_STANDARD = gnu99; 376 | GCC_DYNAMIC_NO_PIC = NO; 377 | GCC_OPTIMIZATION_LEVEL = 0; 378 | GCC_PREPROCESSOR_DEFINITIONS = ( 379 | "DEBUG=1", 380 | "$(inherited)", 381 | ); 382 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 383 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 384 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 385 | GCC_WARN_UNUSED_VARIABLE = YES; 386 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 387 | ONLY_ACTIVE_ARCH = YES; 388 | SDKROOT = iphoneos; 389 | TARGETED_DEVICE_FAMILY = "1,2"; 390 | }; 391 | name = Debug; 392 | }; 393 | 3654E1DC169BE7C2009DA304 /* Release */ = { 394 | isa = XCBuildConfiguration; 395 | buildSettings = { 396 | ALWAYS_SEARCH_USER_PATHS = NO; 397 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 398 | CLANG_CXX_LIBRARY = "libc++"; 399 | CLANG_ENABLE_OBJC_ARC = YES; 400 | CLANG_WARN_EMPTY_BODY = YES; 401 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 402 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 403 | COPY_PHASE_STRIP = YES; 404 | GCC_C_LANGUAGE_STANDARD = gnu99; 405 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 406 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 407 | GCC_WARN_UNUSED_VARIABLE = YES; 408 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 409 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 410 | SDKROOT = iphoneos; 411 | TARGETED_DEVICE_FAMILY = "1,2"; 412 | VALIDATE_PRODUCT = YES; 413 | }; 414 | name = Release; 415 | }; 416 | 3654E1DE169BE7C2009DA304 /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 420 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 421 | CLANG_ENABLE_MODULES = YES; 422 | CODE_SIGN_IDENTITY = "iPhone Developer"; 423 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 424 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 425 | GCC_PREFIX_HEADER = "ScreenShotPrep/ScreenShotPrep-Prefix.pch"; 426 | INFOPLIST_FILE = "ScreenShotPrep/ScreenShotPrep-Info.plist"; 427 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 428 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 429 | PRODUCT_NAME = "$(TARGET_NAME)"; 430 | PROVISIONING_PROFILE = ""; 431 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 432 | SWIFT_OBJC_BRIDGING_HEADER = "ScreenShotPrep/ScreenShotPrep-Bridging-Header.h"; 433 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 434 | TARGETED_DEVICE_FAMILY = "1,2"; 435 | WRAPPER_EXTENSION = app; 436 | }; 437 | name = Debug; 438 | }; 439 | 3654E1DF169BE7C2009DA304 /* Release */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 443 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 444 | CLANG_ENABLE_MODULES = YES; 445 | CODE_SIGN_IDENTITY = "iPhone Developer"; 446 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 447 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 448 | GCC_PREFIX_HEADER = "ScreenShotPrep/ScreenShotPrep-Prefix.pch"; 449 | INFOPLIST_FILE = "ScreenShotPrep/ScreenShotPrep-Info.plist"; 450 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 451 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 452 | PRODUCT_NAME = "$(TARGET_NAME)"; 453 | PROVISIONING_PROFILE = ""; 454 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 455 | SWIFT_OBJC_BRIDGING_HEADER = "ScreenShotPrep/ScreenShotPrep-Bridging-Header.h"; 456 | TARGETED_DEVICE_FAMILY = "1,2"; 457 | WRAPPER_EXTENSION = app; 458 | }; 459 | name = Release; 460 | }; 461 | /* End XCBuildConfiguration section */ 462 | 463 | /* Begin XCConfigurationList section */ 464 | 3654E1B0169BE7C2009DA304 /* Build configuration list for PBXProject "ScreenShotPrep" */ = { 465 | isa = XCConfigurationList; 466 | buildConfigurations = ( 467 | 3654E1DB169BE7C2009DA304 /* Debug */, 468 | 3654E1DC169BE7C2009DA304 /* Release */, 469 | ); 470 | defaultConfigurationIsVisible = 0; 471 | defaultConfigurationName = Release; 472 | }; 473 | 3654E1DD169BE7C2009DA304 /* Build configuration list for PBXNativeTarget "ScreenShotPrep" */ = { 474 | isa = XCConfigurationList; 475 | buildConfigurations = ( 476 | 3654E1DE169BE7C2009DA304 /* Debug */, 477 | 3654E1DF169BE7C2009DA304 /* Release */, 478 | ); 479 | defaultConfigurationIsVisible = 0; 480 | defaultConfigurationName = Release; 481 | }; 482 | /* End XCConfigurationList section */ 483 | }; 484 | rootObject = 3654E1AD169BE7C2009DA304 /* Project object */; 485 | } 486 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/project.xcworkspace/xcuserdata/jasonloewy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep.xcodeproj/project.xcworkspace/xcuserdata/jasonloewy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/project.xcworkspace/xcuserdata/jloewy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep.xcodeproj/project.xcworkspace/xcuserdata/jloewy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/project.xcworkspace/xcuserdata/jloewy.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jasonloewy.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 18 | 19 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jasonloewy.xcuserdatad/xcschemes/ScreenShotPrep.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jasonloewy.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ScreenShotPrep.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 3654E1B5169BE7C2009DA304 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jloewy.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 40 | 52 | 53 | 54 | 56 | 68 | 69 | 70 | 72 | 84 | 85 | 86 | 88 | 100 | 101 | 102 | 104 | 116 | 117 | 118 | 120 | 132 | 133 | 134 | 136 | 148 | 149 | 150 | 152 | 164 | 165 | 166 | 168 | 180 | 181 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jloewy.xcuserdatad/xcschemes/ScreenShotPrep.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /ScreenShotPrep.xcodeproj/xcuserdata/jloewy.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ScreenShotPrep.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 3654E1B5169BE7C2009DA304 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ScreenShotPrep/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ScreenShotPrep/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "ScreenShotPrep-Swift.h" 11 | 12 | #import "RecentShotsViewController.h" 13 | 14 | @implementation AppDelegate 15 | 16 | - (void) applyTheme 17 | { 18 | [[UINavigationBar appearance] setBarTintColor:Color(240, 240, 240, 1.0f)]; 19 | [[UINavigationBar appearance] setTintColor:Color(40, 40, 40, 1.0f)]; 20 | [[UINavigationBar appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"SourceSansPro-Semibold" size:22], NSForegroundColorAttributeName : Color(60, 60, 60, 1.0f)}]; 21 | [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"SourceSansPro-Regular" size:14.0f], NSForegroundColorAttributeName : Color(60, 60, 60, 1.0f)} forState:UIControlStateNormal]; 22 | 23 | 24 | [[UIApplication sharedApplication] setStatusBarHidden:YES]; 25 | } 26 | 27 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 28 | { 29 | [self applyTheme]; 30 | // [self showAllFonts]; 31 | 32 | // Create the initial data store for the saved images 33 | if (![[NSUserDefaults standardUserDefaults] objectForKey:kSavedImagesKey]) 34 | { 35 | [[NSUserDefaults standardUserDefaults] setValue:[@[] mutableCopy] forKey:kSavedImagesKey]; 36 | [[NSUserDefaults standardUserDefaults] synchronize]; 37 | } 38 | 39 | return YES; 40 | } 41 | 42 | /* 43 | Output all of the system fonts to the console 44 | */ 45 | - (void) showAllFonts 46 | { 47 | NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]]; 48 | NSArray *fontNames; 49 | NSInteger indFamily, indFont; 50 | for (indFamily=0; indFamily<[familyNames count]; ++indFamily) 51 | { 52 | fontNames = [[NSArray alloc] initWithArray: 53 | [UIFont fontNamesForFamilyName: 54 | [familyNames objectAtIndex:indFamily]]]; 55 | 56 | 57 | NSLog(@"Family name: %@ (%ld)", [familyNames objectAtIndex:indFamily], fontNames.count); 58 | for (indFont=0; indFont<[fontNames count]; ++indFont) 59 | { 60 | NSLog(@" Font name: %@", [fontNames objectAtIndex:indFont]); 61 | } 62 | } 63 | } 64 | 65 | - (void)applicationWillResignActive:(UIApplication *)application 66 | { 67 | // 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. 68 | // 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. 69 | } 70 | 71 | - (void)applicationDidEnterBackground:(UIApplication *)application 72 | { 73 | // 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. 74 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 75 | } 76 | 77 | - (void)applicationWillEnterForeground:(UIApplication *)application 78 | { 79 | // 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. 80 | } 81 | 82 | - (void)applicationDidBecomeActive:(UIApplication *)application 83 | { 84 | // 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. 85 | } 86 | 87 | - (void)applicationWillTerminate:(UIApplication *)application 88 | { 89 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 90 | } 91 | 92 | @end 93 | -------------------------------------------------------------------------------- /ScreenShotPrep/Capture Screenshot/ImagePickerPreviewViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ImagePickerPreviewViewController.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/12/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | typedef NS_ENUM(NSInteger, ImageEditOption) 10 | { 11 | ImageEditOptionXPosition, 12 | ImageEditOptionYPosition, 13 | ImageEditOptionWidth, 14 | ImageEditOptionHeight 15 | }; 16 | 17 | @class Screenshot; 18 | @class DEVDevice; 19 | 20 | @interface ImagePickerPreviewViewController : UIViewController 21 | 22 | /** 23 | * Responsible for configuring the displays data prior to display 24 | * 25 | * @param deviceType The DEVDevice type that will feed the UI of this display 26 | */ 27 | - (void) configureForDevice:(DEVDevice*) deviceType; 28 | 29 | - (void) displayForRecent:(Screenshot*) recentScreenshot; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ScreenShotPrep/Capture Screenshot/ImagePickerPreviewViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ImagePickerPreviewViewController.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/12/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | #import 9 | #import 10 | #import "ScreenShotPrep-Swift.h" 11 | 12 | /// Associated View Controllers 13 | #import "ImagePickerPreviewViewController.h" 14 | #import "PreviewSettingsViewController.h" 15 | 16 | /// Data Object Imports 17 | #import "DEVDevice.h" 18 | #import "Screenshot.h" 19 | 20 | /// UI Objects 21 | #import "BlockAlertView.h" 22 | 23 | @interface ImagePickerPreviewViewController () 24 | 25 | // Data Objects 26 | @property BOOL fromRecent; 27 | @property ImageEditOption currentEditOption; 28 | @property (nonatomic, strong) DEVDevice* deviceType; 29 | @property (nonatomic, strong) Screenshot* activeScreenshot; 30 | 31 | // Image Output Objects 32 | @property UIViewContentMode aspectStyle; 33 | @property NSInteger aspectScale; 34 | 35 | // UI Objets 36 | @property (strong, nonatomic) IBOutlet LayeredDeviceView *screenshotContainer; 37 | @property (nonatomic, strong) UIImagePickerController* pickerController; 38 | 39 | // Image Editing Objects 40 | @property (strong, nonatomic) IBOutlet UIStepper *editStepper; 41 | @property (strong, nonatomic) IBOutlet UIToolbar *editParentToolbar; 42 | @property (strong, nonatomic) IBOutlet UISegmentedControl *editTypeSegmentedControl; 43 | @property NSInteger currentValue; 44 | @property (strong, nonatomic) IBOutlet UISegmentedControl *deltaSegmentedController; 45 | 46 | @end 47 | 48 | @implementation ImagePickerPreviewViewController 49 | 50 | #pragma mark - 51 | #pragma mark - Initialization Methods 52 | 53 | - (void) configureForDevice:(DEVDevice *)deviceType 54 | { 55 | _deviceType = deviceType; 56 | } 57 | 58 | - (void) displayForRecent:(Screenshot *)recentScreenshot 59 | { 60 | _activeScreenshot = recentScreenshot; 61 | _fromRecent = YES; 62 | } 63 | 64 | #pragma mark - 65 | #pragma mark - UIViewController Lifecycle Methods 66 | 67 | - (void)viewDidLoad 68 | { 69 | [super viewDidLoad]; 70 | _currentValue = _editStepper.value; 71 | 72 | _aspectStyle = UIViewContentModeScaleAspectFit; 73 | _aspectScale = 4.0; 74 | 75 | if (_activeScreenshot == NULL) 76 | { 77 | [_screenshotContainer configureForDevice:_deviceType]; 78 | } 79 | else if (_fromRecent) 80 | { 81 | //---- 82 | // Enter here if there is an active screenshot at this point 83 | // That means that the user is review a previously saved screenshot 84 | //---- 85 | [_screenshotContainer configureFromSavedScreenshot:_activeScreenshot]; 86 | } 87 | 88 | if (!isIpad) 89 | { 90 | [_deltaSegmentedController removeFromSuperview]; 91 | } 92 | } 93 | 94 | - (void) viewWillAppear:(BOOL)animated 95 | { 96 | [super viewWillAppear:animated]; 97 | [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 98 | } 99 | 100 | - (void) viewDidAppear:(BOOL)animated 101 | { 102 | if (!_fromRecent) 103 | { 104 | if (_pickerController == NULL) 105 | { 106 | // Enter here to present the image picker to the user on the first time this view controller displays 107 | _pickerController = [[UIImagePickerController alloc] init]; 108 | [_pickerController setDelegate:self]; 109 | [_pickerController setSourceType:(UIImagePickerControllerSourceTypePhotoLibrary | UIImagePickerControllerSourceTypeSavedPhotosAlbum)]; 110 | 111 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .15 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 112 | [self presentViewController:_pickerController animated:YES completion:nil]; 113 | }); 114 | } 115 | else if (_activeScreenshot == nil) 116 | { 117 | // Enter here if the user failed to pick a screenshot when the image picker was displayed 118 | [self dismissViewControllerAnimated:YES completion:nil]; 119 | } 120 | } 121 | } 122 | 123 | /** 124 | * Responsible for reacting to the back button being selected and dismissing this page from view 125 | * 126 | * @param sender The object responsible for firing this method 127 | */ 128 | - (IBAction)backButtonPressed:(id)sender 129 | { 130 | [self dismissViewControllerAnimated:YES completion:nil]; 131 | } 132 | 133 | #pragma mark - 134 | #pragma mark - Screenshot Adjustment Methods 135 | 136 | /** 137 | * Responsible for reacting to the user changing the value of the currently selected ImagEditOption 138 | * 139 | * @param sender The UIStepper that was tapped to call this function 140 | */ 141 | - (IBAction)stepperValueChanged:(UIStepper *)sender 142 | { 143 | CGFloat delta; 144 | 145 | // Base the delta value off of the current selected segment of the delta segmented controllers 146 | switch (_deltaSegmentedController.selectedSegmentIndex) { 147 | case 0: 148 | delta = 1; 149 | break; 150 | case 1: 151 | delta = 2; 152 | break; 153 | case 2: 154 | delta = 5; 155 | break; 156 | default: 157 | delta = 1; 158 | break; 159 | } 160 | 161 | if (sender.value < _currentValue) 162 | delta *= -1; 163 | 164 | [_screenshotContainer manipulateScreenshot:_currentEditOption delta:delta]; 165 | _currentValue = sender.value; 166 | } 167 | 168 | /** 169 | * Updates the currently selected ImageEditing option based off of which segment is now selected 170 | * 171 | * @param sender The object that is responsible for firing this method 172 | */ 173 | - (IBAction)segmentedControllerChanged:(UISegmentedControl *)sender 174 | { 175 | _editStepper.value = _currentValue = 0.0f; 176 | switch (sender.selectedSegmentIndex) { 177 | case 0: 178 | _currentEditOption = ImageEditOptionXPosition; 179 | break; 180 | case 1: 181 | _currentEditOption = ImageEditOptionYPosition; 182 | break; 183 | case 2: 184 | _currentEditOption = ImageEditOptionWidth; 185 | break; 186 | case 3: 187 | _currentEditOption = ImageEditOptionHeight; 188 | break; 189 | default: 190 | break; 191 | } 192 | } 193 | 194 | #pragma mark - 195 | #pragma mark - Share Methods 196 | 197 | /** 198 | * Responsible for reacting to the user signifying that they want to share this screenshot. Asks the user if they want to save or email this screenshot 199 | * 200 | * @param sender The UIBarButintItem that was tapped to call this function 201 | */ 202 | - (IBAction)shareButtonTapped:(UIBarButtonItem *)sender 203 | { 204 | UIActionSheet* shareSheet; 205 | if (!_fromRecent) 206 | shareSheet = [[UIActionSheet alloc] initWithTitle:@"Share Screenshot" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Email", @"Save", nil]; 207 | else 208 | shareSheet = [[UIActionSheet alloc] initWithTitle:@"Share Screenshot" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Email", nil]; 209 | 210 | [shareSheet showInView:self.navigationController.view]; 211 | } 212 | 213 | - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 214 | { 215 | if (buttonIndex != actionSheet.cancelButtonIndex) 216 | { 217 | // Present the user with the title text input alert 218 | BlockAlertView* titleAlert = [[BlockAlertView alloc] initWithTitle:@"Enter Image Title" message:@"Enter your desired title, or skip to bypass naming your screenshot." delegate:nil cancelButtonTitle:@"Skip" otherButtonTitles:@"Save", nil]; 219 | [titleAlert setAlertViewStyle:UIAlertViewStylePlainTextInput]; 220 | [titleAlert setDidDismissBlock:^(BlockAlertView *alertView, NSInteger alertButtonIndex) { 221 | 222 | NSString* titleText; 223 | if (alertButtonIndex != alertView.cancelButtonIndex && [alertView textFieldAtIndex:0].text.length > 0) 224 | titleText = [alertView textFieldAtIndex:0].text; 225 | 226 | if ([[actionSheet buttonTitleAtIndex:buttonIndex] containsString:@"Email"]) 227 | { 228 | [self emailScreenshot:titleText]; 229 | } 230 | else if ([[actionSheet buttonTitleAtIndex:buttonIndex] containsString:@"Save"]) 231 | { 232 | [self saveScreenshot:titleText]; 233 | } 234 | }]; 235 | 236 | [titleAlert show]; 237 | } 238 | } 239 | 240 | /** 241 | * Resposnible for retrieving a image representation of the layered device view 242 | * 243 | * @param completionBlock The block of code that will get called when retrieval of the image represetiation is complete 244 | */ 245 | static NSDateFormatter *__nameDateFormatter; 246 | - (void) retrieveImage:(void(^)(Screenshot*)) completionBlock 247 | { 248 | [UIView animateWithDuration:.4 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 249 | 250 | // Hide all of the surrounding views besides the layered device image 251 | _editParentToolbar.alpha = self.navigationController.navigationBar.alpha = 0.0f; 252 | [self.view setBackgroundColor:[UIColor clearColor]]; 253 | 254 | }completion:^(BOOL finished){ 255 | 256 | [self.view setBackgroundColor:[UIColor clearColor]]; 257 | 258 | // Save the actual image 259 | UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, _aspectScale); 260 | [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 261 | UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 262 | UIGraphicsEndImageContext(); 263 | 264 | NSMutableString* screenshotName; 265 | if (_activeScreenshot.title.length > 0) 266 | screenshotName = [_activeScreenshot.title mutableCopy]; 267 | else 268 | { 269 | // If there wasnt an explicit title provided then initialize one based off of the time 270 | if (__nameDateFormatter == nil) 271 | { 272 | // Only need to initialize the date formatter onces 273 | __nameDateFormatter = [[NSDateFormatter alloc] init]; 274 | [__nameDateFormatter setTimeStyle:NSDateFormatterFullStyle]; 275 | } 276 | 277 | screenshotName = [NSMutableString stringWithFormat:@"Dev Frames %@",[__nameDateFormatter stringFromDate:[[NSDate alloc] init]]]; 278 | [screenshotName replaceOccurrencesOfString:@"/" withString:@":" options:NSLiteralSearch range:(NSRange){0,screenshotName.length}]; 279 | 280 | for (NSString* needle in @[@"PM", @"AM"]) 281 | { 282 | NSRange range = [screenshotName rangeOfString:needle]; 283 | if (range.location != NSNotFound) 284 | { 285 | [screenshotName deleteCharactersInRange:(NSRange){range.location, (screenshotName.length - range.location)}]; 286 | break; 287 | } 288 | } 289 | } 290 | 291 | // Make sure that it has the correct file extention on it 292 | if (![screenshotName containsString:@".png"]) 293 | [screenshotName appendString:@".png"]; 294 | 295 | if (completionBlock) 296 | { 297 | Screenshot* newScreenshot = [[Screenshot alloc] initWithImage:viewImage]; 298 | [newScreenshot setTitle:screenshotName]; 299 | 300 | completionBlock(newScreenshot); 301 | } 302 | 303 | // Bring back all of the faded UI Objects 304 | [UIView animateWithDuration:1.0 animations:^{ 305 | [self.view setBackgroundColor:[UIColor darkGrayColor]]; 306 | _editParentToolbar.alpha = self.navigationController.navigationBar.alpha = 1.0f; 307 | }]; 308 | }]; 309 | 310 | } 311 | 312 | /** 313 | * REsponsible for saving the image to the users persistent local storage 314 | * 315 | * @param sender The object responsible for firing this method 316 | */ 317 | - (IBAction)saveScreenshot:(NSString*) title 318 | { 319 | [self retrieveImage:^(Screenshot *newScreenshot) { 320 | 321 | if (title.length > 0) 322 | [newScreenshot setTitle:title]; 323 | 324 | [newScreenshot saveScreenshot]; 325 | [[[UIAlertView alloc] initWithTitle:@"Image Saved" message:@"Your screenshot was successfully saved for later use." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles: nil] show]; 326 | 327 | }]; 328 | } 329 | 330 | /** 331 | * Responsible for generating the screenshot and presenting the mail composer. Called when the user selects that they wish to email the screenshot 332 | * 333 | * @param sender The object responsible for firing this method 334 | */ 335 | - (IBAction)emailScreenshot:(NSString*) title 336 | { 337 | if ([MFMailComposeViewController canSendMail]) 338 | { 339 | MFMailComposeViewController *mfViewController = [[MFMailComposeViewController alloc] init]; 340 | [mfViewController setMailComposeDelegate:self]; 341 | 342 | NSDateFormatter* timestampFormatter = [[NSDateFormatter alloc] init]; 343 | [timestampFormatter setDateStyle:NSDateFormatterMediumStyle]; 344 | [mfViewController setSubject:[NSString stringWithFormat:@"Dev Frames %@", [timestampFormatter stringFromDate:[[NSDate alloc] init]]]]; 345 | 346 | [self retrieveImage:^(Screenshot *currentScreenshot) { 347 | 348 | if (title.length > 0) 349 | [currentScreenshot setTitle:title]; 350 | 351 | NSData* imageData = UIImagePNGRepresentation(currentScreenshot.screenshot); 352 | NSString* fileName = currentScreenshot.title; 353 | 354 | if (![fileName containsString:@".png"]) 355 | fileName = [fileName stringByAppendingString:@".png"]; 356 | 357 | [mfViewController addAttachmentData:imageData mimeType:@"image/png" fileName:fileName]; 358 | 359 | [self presentViewController:mfViewController animated:YES completion:nil]; 360 | }]; 361 | } 362 | else 363 | { 364 | [[[UIAlertView alloc] initWithTitle:@"Mail Error" message:@"Your mail client is not configured with any accounts" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles: nil] show]; 365 | } 366 | } 367 | 368 | #pragma mark - 369 | #pragma mark MFMailComposeViewControllerDelegate Methods 370 | 371 | - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { 372 | [controller dismissViewControllerAnimated:YES completion:nil]; 373 | } 374 | 375 | 376 | 377 | #pragma mark - 378 | #pragma mark - UIImagePickerController Delegate Methods 379 | 380 | - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 381 | { 382 | _activeScreenshot = [[Screenshot alloc] initWithImage:info[UIImagePickerControllerOriginalImage]]; 383 | [_screenshotContainer configureForScreenshot:_activeScreenshot]; 384 | 385 | [picker dismissViewControllerAnimated:YES completion:nil]; 386 | } 387 | 388 | @end -------------------------------------------------------------------------------- /ScreenShotPrep/Capture Screenshot/LayeredDeviceView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LayeredDeviceView.swift 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/14/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class LayeredDeviceView: UIView, UIGestureRecognizerDelegate { 12 | 13 | var forceScreenshotLayout = false 14 | 15 | let deviceImageView = UIImageView() 16 | let screenshotImageView = UIImageView() 17 | var bezelWidth = 20.0 18 | var bezelHeight = 100.0 19 | 20 | var originalScreenCenter:CGPoint? 21 | 22 | // MARK:- Configuration Methods 23 | 24 | /** 25 | Responsible for setting up the screenshot image view to display the newly provided Screenshots image 26 | 27 | :param: screenshot The Screenshot object that is responsible for feeding this objects display 28 | */ 29 | func configureForScreenshot(screenshot:Screenshot) 30 | { 31 | screenshotImageView.image = screenshot.screenshot 32 | forceScreenshotLayout = true 33 | setNeedsLayout() 34 | } 35 | 36 | /** 37 | Responsible for setting up the device view for the currently active device type. Sets up the corresponding UIImageView 38 | 39 | :param: currentDevice The DEVDevice that is being worked with 40 | */ 41 | func configureForDevice(currentDevice:DEVDevice) 42 | { 43 | deviceImageView.image = currentDevice.deviceImage 44 | bezelWidth = Double(currentDevice.bezelWidth) 45 | bezelHeight = Double(currentDevice.bezelHeight) 46 | deviceImageView.reloadInputViews() 47 | 48 | // currentDevice.getSomething() 49 | } 50 | 51 | /** 52 | Responsible for configure the display to show the saved screenshot that the user selected 53 | 54 | :param: savedSCreenshot The saved Screenshot object that the user wants to review 55 | */ 56 | func configureFromSavedScreenshot(savedSCreenshot:Screenshot) 57 | { 58 | deviceImageView.image = savedSCreenshot.screenshot 59 | screenshotImageView.removeFromSuperview() 60 | setNeedsLayout() 61 | } 62 | 63 | // MARK:- View LIfecycle Functions 64 | 65 | override func awakeFromNib() { 66 | 67 | super.awakeFromNib() 68 | backgroundColor = UIColor.clearColor() 69 | deviceImageView.contentMode = .ScaleAspectFit 70 | deviceImageView.image = UIImage(named: "iPhone5cBlue") 71 | screenshotImageView.contentMode = .ScaleToFill 72 | 73 | let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:")) 74 | panGestureRecognizer.delegate = self 75 | screenshotImageView.addGestureRecognizer(panGestureRecognizer) 76 | screenshotImageView.userInteractionEnabled = true 77 | 78 | self.addSubview(deviceImageView) 79 | self.addSubview(screenshotImageView) 80 | } 81 | 82 | override func layoutSubviews() { 83 | 84 | super.layoutSubviews() 85 | deviceImageView.frame = self.bounds 86 | 87 | // Auto layout the screenshot image view based off of how the device image falls in the view 88 | if forceScreenshotLayout 89 | { 90 | if let deviceImage = deviceImageView.image { 91 | 92 | var imageHeight = deviceImage.size.height 93 | var imageWidth = deviceImage.size.width 94 | let imageAspectRatio = (imageHeight / imageWidth) 95 | 96 | let parentHeight = deviceImageView.bounds.size.height 97 | let parentWidth = deviceImageView.bounds.size.width 98 | 99 | // if (parentHeight < imageHeight) 100 | // { 101 | imageHeight = parentHeight 102 | imageWidth = (imageHeight / imageAspectRatio) 103 | // } 104 | 105 | let xSpace = fabs((parentWidth - imageWidth) + CGFloat(bezelWidth)) 106 | let ySpace = fabs((parentHeight - imageHeight) + CGFloat(bezelHeight)) 107 | 108 | imageHeight = parentHeight - ySpace; 109 | imageWidth = parentWidth - xSpace; 110 | 111 | screenshotImageView.frame = CGRectMake(xSpace/2, ySpace/2, imageWidth, imageHeight) 112 | screenshotImageView.center = CGPointMake(deviceImageView.center.x, deviceImageView.center.y - 1) 113 | 114 | forceScreenshotLayout = false 115 | } 116 | } 117 | } 118 | 119 | // MARK: - Pan Gesture Methods 120 | 121 | func handlePan(recognizer:UIPanGestureRecognizer) 122 | { 123 | if recognizer.state == .Began { 124 | originalScreenCenter = screenshotImageView.center 125 | } 126 | else if recognizer.state == .Changed { 127 | 128 | if let originalCenter = originalScreenCenter { 129 | 130 | let translation = recognizer.translationInView(self) 131 | let newCenter = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y) 132 | if (newCenter.x - (CGRectGetWidth(screenshotImageView.bounds) / 2) > 0 && (newCenter.y - (CGRectGetHeight(screenshotImageView.bounds) / 2)) > 0) 133 | { 134 | screenshotImageView.center = newCenter 135 | } 136 | } 137 | } 138 | } 139 | 140 | override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 141 | return true 142 | } 143 | 144 | // MARK: - Image Manipulation Methods 145 | 146 | /** 147 | Responsible for manipulating the image view that holds the screenshot 148 | 149 | :param: editOptionType The type of editing that will take place 150 | :param: delta The value of the change that will take place to the screenshot image 151 | */ 152 | func manipulateScreenshot(editOptionType:ImageEditOption, delta:CGFloat)-> Void 153 | { 154 | switch editOptionType 155 | { 156 | case .XPosition: 157 | screenshotImageView.frame = CGRectMake(screenshotImageView.frame.origin.x + delta, screenshotImageView.frame.origin.y, CGRectGetWidth(screenshotImageView.frame), CGRectGetHeight(screenshotImageView.frame)) 158 | 159 | case .YPosition: 160 | screenshotImageView.frame = CGRectMake(screenshotImageView.frame.origin.x, screenshotImageView.frame.origin.y + delta, CGRectGetWidth(screenshotImageView.frame), CGRectGetHeight(screenshotImageView.frame)) 161 | 162 | case .Width: 163 | screenshotImageView.frame = CGRectMake(screenshotImageView.frame.origin.x, screenshotImageView.frame.origin.y, (CGRectGetWidth(screenshotImageView.frame) + delta), CGRectGetHeight(screenshotImageView.frame)) 164 | 165 | case .Height: 166 | screenshotImageView.frame = CGRectMake(screenshotImageView.frame.origin.x, screenshotImageView.frame.origin.y, CGRectGetWidth(screenshotImageView.frame), (CGRectGetHeight(screenshotImageView.frame) + delta)) 167 | } 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /ScreenShotPrep/Capture Screenshot/PreviewSettingsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PreviewSettingsViewController.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/16/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | 10 | @class PreviewSettingsViewController; 11 | 12 | @protocol PreviewSettingsDelegate 13 | 14 | - (void) previewSettings:(PreviewSettingsViewController*) previewSettings didChangeAspectMode:(UIViewContentMode) aspectStyle; 15 | - (void) previewSettings:(PreviewSettingsViewController*) previewSettings didChangeScale:(NSInteger) aspectScale; 16 | - (void) previewSettings:(PreviewSettingsViewController*) previewSettings changedName:(NSString*) imageName; 17 | 18 | @end 19 | 20 | @interface PreviewSettingsViewController : UITableViewController 21 | 22 | // Current Setting Values 23 | @property UIViewContentMode aspectStyle; 24 | @property NSInteger aspectScale; 25 | @property (nonatomic, strong) NSString* outputName; 26 | 27 | @property (nonatomic, strong) id delegate; 28 | 29 | //+ (UIViewContentMode) getAspectMode:(UIViewContentMode) aspectStyle; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ScreenShotPrep/Capture Screenshot/PreviewSettingsViewController.m: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | CURRENTLY NOT ACTIVE 4 | 5 | */ 6 | 7 | // 8 | // PreviewSettingsViewController.m 9 | // ScreenShotPrep 10 | // 11 | // Created by Jason Loewy on 1/16/13. 12 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 13 | // 14 | 15 | #import "PreviewSettingsViewController.h" 16 | 17 | @interface PreviewSettingsViewController () 18 | 19 | @property NSInteger selectedRow; 20 | 21 | @property (weak, nonatomic) IBOutlet UITextField *imageName; 22 | 23 | @property (weak, nonatomic) IBOutlet UIStepper *scaleStepper; 24 | @property (weak, nonatomic) IBOutlet UILabel *scaleIndicator; 25 | 26 | @end 27 | 28 | @implementation PreviewSettingsViewController 29 | 30 | #pragma mark - 31 | #pragma mark - UIViewController Lifecycle Methods 32 | 33 | - (void)viewDidLoad 34 | { 35 | [super viewDidLoad]; 36 | 37 | [_scaleIndicator setText:[NSString stringWithFormat:@"%ld", _aspectScale]]; 38 | [_scaleStepper setValue:((double) _aspectScale)]; 39 | 40 | if (_outputName != NULL) 41 | [_imageName setText:_outputName]; 42 | 43 | // Uncomment the following line to preserve selection between presentations. 44 | // self.clearsSelectionOnViewWillAppear = NO; 45 | 46 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 47 | // self.navigationItem.rightBarButtonItem = self.editButtonItem; 48 | } 49 | 50 | - (void)didReceiveMemoryWarning 51 | { 52 | [super didReceiveMemoryWarning]; 53 | // Dispose of any resources that can be recreated. 54 | } 55 | 56 | - (IBAction)backPressed:(id)sender 57 | { 58 | if (_imageName.text.length > 0) 59 | [_delegate previewSettings:self changedName:_imageName.text]; 60 | 61 | [self dismissViewControllerAnimated:YES completion:nil]; 62 | } 63 | 64 | #pragma mark - 65 | #pragma mark - Aspect Scale Interaction Methods 66 | 67 | - (IBAction)scaleValueChanged:(id)sender 68 | { 69 | _aspectScale = ((UIStepper*)sender).value; 70 | [_scaleIndicator setText:[NSString stringWithFormat:@"%ld", _aspectScale]]; 71 | [_delegate previewSettings:self didChangeScale:_aspectScale]; 72 | } 73 | 74 | #pragma mark - 75 | #pragma mark - Image Name Interaction Methods 76 | 77 | /* 78 | Responsible for reacting to the submission of the new image name text field 79 | Responsible for resigning the textfield first responder and calling the delegate method to update the image name 80 | */ 81 | - (IBAction)nameTextFieldDonePressed:(id)sender 82 | { 83 | [_imageName resignFirstResponder]; 84 | } 85 | - (IBAction)nameFieldDone:(id)sender 86 | { 87 | [_imageName resignFirstResponder]; 88 | } 89 | 90 | #pragma mark - Table view delegate 91 | 92 | - (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 93 | 94 | if (indexPath.section == 1) 95 | { 96 | if (indexPath.row == 0 && _aspectStyle == UIViewContentModeScaleToFill) 97 | { 98 | [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 99 | _selectedRow = indexPath.row; 100 | } 101 | else if (indexPath.row == 1 && _aspectStyle == UIViewContentModeScaleAspectFit) 102 | { 103 | [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 104 | _selectedRow = indexPath.row; 105 | } 106 | else if (indexPath.row == 2 && _aspectStyle == UIViewContentModeScaleAspectFill) 107 | { 108 | [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 109 | _selectedRow = indexPath.row; 110 | } 111 | else 112 | [cell setAccessoryType:UITableViewCellAccessoryNone]; 113 | } 114 | } 115 | 116 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 117 | { 118 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 119 | 120 | if (indexPath.section == 1) 121 | { 122 | if (indexPath.row != _selectedRow) 123 | { 124 | [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark]; 125 | [[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:_selectedRow inSection:1]] setAccessoryType:UITableViewCellAccessoryNone]; 126 | 127 | _selectedRow = indexPath.row; 128 | [_delegate previewSettings:self didChangeAspectMode:_selectedRow]; 129 | } 130 | } 131 | } 132 | 133 | @end 134 | -------------------------------------------------------------------------------- /ScreenShotPrep/DEVTabBarViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DEVTabBarViewController.swift 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/15/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class DEVTabBarViewController: UITabBarController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Add the bg color view to the tab bar 17 | let bgView = UIView(frame: tabBar.bounds) 18 | bgView.backgroundColor = UIColor(red: CGFloat(230.0/255.0), green: CGFloat(230.0/255.0), blue: CGFloat(230.0/255.0), alpha: 1.0) 19 | tabBar.insertSubview(bgView, atIndex: 0) 20 | 21 | // Vertically center the images 22 | if let tabBarItems = tabBar.items as? [UITabBarItem]{ 23 | 24 | for currentItem in tabBarItems { 25 | currentItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0) 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ScreenShotPrep/Data Objects/Screenshot.h: -------------------------------------------------------------------------------- 1 | // 2 | // Screenshot.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #define SSTitle @"name" 10 | #define SSImageName @"fileName" 11 | #define SSTimestamp @"date" 12 | 13 | @interface Screenshot : NSObject 14 | 15 | @property (nonatomic, strong) NSString* title; 16 | @property (nonatomic, strong, readonly) NSString* fileName; 17 | @property (nonatomic, strong, readonly) UIImage* screenshot; 18 | 19 | - (id) initWithDictionary:(NSDictionary*) initDict; 20 | 21 | /** 22 | * Responsible for initializing a new screenshot for the specified image. With this initialization there will be no title or any other information, just the screnshot set 23 | * 24 | * @param screenshotImage The Image that will be live in the Screenshot object 25 | * 26 | * @return An initliazed Screenshot 27 | */ 28 | - (id) initWithImage:(UIImage*) screenshotImage; 29 | 30 | - (NSString*) getTimeStamp; 31 | 32 | /** 33 | * Responsible for saving the screenshot to persistant storage for later use 34 | */ 35 | - (void) saveScreenshot; 36 | 37 | /** 38 | * Responsible for deleting the current screenshot from the users NSDocumentDirectory 39 | * 40 | * @return a boolean flag on if the deletion was successful or not 41 | */ 42 | - (BOOL) deleteScreenshot; 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /ScreenShotPrep/Data Objects/Screenshot.m: -------------------------------------------------------------------------------- 1 | // 2 | // Screenshot.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "Screenshot.h" 10 | 11 | @interface Screenshot () 12 | 13 | @property (nonatomic, strong) NSDate* timestamp; 14 | 15 | @end 16 | 17 | @implementation Screenshot 18 | 19 | #pragma mark - 20 | #pragma mark - Initialization Methods 21 | 22 | - (id) initWithDictionary:(NSDictionary *)initDict 23 | { 24 | if (self = [super init]) 25 | { 26 | _fileName = initDict.allKeys[0]; 27 | _screenshot = [UIImage imageWithContentsOfFile:[DataResourceHandler getPathToFile:_fileName inDirectory:NSDocumentDirectory]]; 28 | 29 | initDict = initDict[_fileName]; 30 | if ([initDict objectForKey:SSTitle]) 31 | _title = initDict[SSTitle]; 32 | 33 | if ([initDict objectForKey:SSTimestamp]) 34 | _timestamp = initDict[SSTimestamp]; 35 | } 36 | 37 | return self; 38 | } 39 | 40 | - (id) initWithImage:(UIImage *)screenshotImage 41 | { 42 | if (self = [super init]) 43 | _screenshot = screenshotImage; 44 | 45 | return self; 46 | } 47 | 48 | #pragma mark - 49 | #pragma mark - Accessor Images 50 | 51 | - (NSString*) getTimeStamp 52 | { 53 | NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; 54 | [formatter setDateStyle:NSDateFormatterMediumStyle]; 55 | 56 | return [formatter stringFromDate:_timestamp]; 57 | } 58 | 59 | #pragma mark - 60 | #pragma mark - Storage Methods 61 | 62 | - (void) saveScreenshot 63 | { 64 | NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; 65 | NSString* saveName = [NSString stringWithFormat:@"%@",@(timeStamp)]; 66 | if ([saveName rangeOfString:@"."].location != NSNotFound) 67 | saveName = [saveName substringToIndex:[saveName rangeOfString:@"."].location]; 68 | 69 | saveName = [saveName stringByAppendingString:@".png"]; 70 | _title = [_title stringByReplacingOccurrencesOfString:@"/" withString:@"-"]; 71 | 72 | NSDictionary* savedImageDict = @{saveName : @{@"name" : _title, @"date" : [[NSDate alloc] init]}}; 73 | 74 | NSMutableArray* savedImages = [[[NSUserDefaults standardUserDefaults] arrayForKey:kSavedImagesKey] mutableCopy]; 75 | [savedImages insertObject:savedImageDict atIndex:0]; 76 | 77 | [[NSUserDefaults standardUserDefaults] setValue:savedImages forKey:kSavedImagesKey]; 78 | [[NSUserDefaults standardUserDefaults] synchronize]; 79 | 80 | NSString* dirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 81 | NSString* filePath = [dirPath stringByAppendingPathComponent:saveName]; 82 | [UIImagePNGRepresentation(_screenshot) writeToFile:filePath atomically:YES]; 83 | 84 | // Save the image to the users photos 85 | UIImageWriteToSavedPhotosAlbum(_screenshot, nil, nil, nil); 86 | 87 | [[NSNotificationCenter defaultCenter] postNotificationName:kNewImageSavedAlert object:nil]; 88 | } 89 | 90 | - (BOOL) deleteScreenshot 91 | { 92 | NSString* filePath = [DataResourceHandler getPathToFile:_fileName inDirectory:NSDocumentDirectory]; 93 | NSError* error; 94 | 95 | BOOL successful; 96 | if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 97 | { 98 | [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 99 | successful = (error) ? NO : YES; 100 | } 101 | else 102 | successful = YES; 103 | 104 | // If the deletion was successful then remove it from the userdefaults 105 | if (successful) 106 | { 107 | // Find the index of the screenshot 108 | NSMutableArray* recentScreenshots = [[[NSUserDefaults standardUserDefaults] arrayForKey:kSavedImagesKey] mutableCopy]; 109 | NSInteger screenshotIdx = NSNotFound; 110 | for (NSDictionary* currentScreenshot in recentScreenshots) 111 | { 112 | if ([[currentScreenshot.allKeys firstObject] isEqualToString:_fileName]) 113 | { 114 | screenshotIdx = [recentScreenshots indexOfObject:currentScreenshot]; 115 | break; 116 | } 117 | 118 | } 119 | 120 | if (screenshotIdx != NSNotFound) 121 | { 122 | // Remove the screenshot from the persistent storage 123 | [recentScreenshots removeObjectAtIndex:screenshotIdx]; 124 | [[NSUserDefaults standardUserDefaults] setValue:recentScreenshots forKey:kSavedImagesKey]; 125 | [[NSUserDefaults standardUserDefaults] synchronize]; 126 | } 127 | } 128 | 129 | return successful; 130 | } 131 | 132 | @end 133 | -------------------------------------------------------------------------------- /ScreenShotPrep/DataResourceHandler.h: -------------------------------------------------------------------------------- 1 | // 2 | // DataResourceHandler.h 3 | // LSATMax 4 | // 5 | // Created by Jason Loewy on 6/11/12. 6 | // Copyright (c) 2012 Jason Loewy. All rights reserved. 7 | // 8 | 9 | @interface DataResourceHandler : NSObject 10 | 11 | + (void) checkOrCopyFile:(NSString *)fileName toDirectory:(NSInteger)directory ofType:(NSString *)fileType forceCopy:(BOOL) forceCopy; 12 | 13 | + (NSString*) getPathToFile:(NSString*) fileName inDirectory:(NSInteger) directoryName; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ScreenShotPrep/DataResourceHandler.m: -------------------------------------------------------------------------------- 1 | // 2 | // DataResourceHandler.m 3 | // LSATMax 4 | // 5 | // Created by Jason Loewy on 6/11/12. 6 | // Copyright (c) 2012 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "DataResourceHandler.h" 10 | 11 | #define PostExam_URL [NSURL URLWithString:@"http://www.lsatmaxadmin.us/6l0LsrKn523VCel/P4fzn2t64URp8sU/userPostExam.php"] 12 | 13 | @interface DataResourceHandler () 14 | 15 | 16 | @end 17 | 18 | @implementation DataResourceHandler 19 | 20 | /* 21 | Responsible for checking if a resource exists in the directory specified by the parameter 22 | If it does, returns 23 | If it does not it attempts to copy it over from the main bundle 24 | PARAMETERS: 25 | fileName => The name of the file that your checking to see if it exists in the target directoy 26 | directory => The name of the directory that you are check 27 | fileType => The extention of the fileName that you are targeting 28 | */ 29 | + (void) checkOrCopyFile:(NSString *)fileName toDirectory:(NSInteger)directory ofType:(NSString *)fileType forceCopy:(BOOL) forceCopy{ 30 | 31 | NSString* dirPath = [NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES) objectAtIndex:0]; 32 | 33 | NSString* filePath = [dirPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",fileName, fileType]]; 34 | if (![[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:NO] || forceCopy) 35 | { // Enter here if the file doesn't exists, means you need to copy it over 36 | 37 | if (forceCopy && [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:NO]) 38 | { // The file exists and it wants to override it 39 | NSError* error; 40 | [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; 41 | if (error) 42 | NSLog(@"ERROR: %@", [error description]); 43 | } 44 | 45 | NSString* databasePathFromApp = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType]; 46 | if (databasePathFromApp) 47 | [[NSFileManager defaultManager] copyItemAtPath:databasePathFromApp toPath:filePath error:nil]; 48 | } 49 | } 50 | 51 | 52 | 53 | /* 54 | Generic helper method to get the filepath to the specified file in the specified directory 55 | Returns an empty string if the file was not found at the path 56 | */ 57 | + (NSString*) getPathToFile:(NSString *)fileName inDirectory:(NSInteger) directoryName { 58 | 59 | NSString* dirPath = [NSSearchPathForDirectoriesInDomains(directoryName, NSUserDomainMask, YES) objectAtIndex:0]; 60 | NSString* filePath = [dirPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",fileName]]; 61 | 62 | if (![[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:NO]) 63 | filePath = @""; 64 | 65 | return filePath; 66 | } 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /ScreenShotPrep/Device Selection/DEVDeviceSelectionCollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DEVDeviceSelectionCollectionViewController.swift 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/18/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | let reuseIdentifier = "Device-Cell" 12 | let deviceTypes = [DEVDevice.forDevice(.TypeiPhone6Black), DEVDevice.forDevice(.TypeiPhone6PlusBlack), DEVDevice.forDevice(DeviceType.TypeiPadAir2PrtBlack), DEVDevice.forDevice(.TypeiPadMini3Prt), DEVDevice.forDevice(.TypeIPhone5), DEVDevice.forDevice(.TypeiPhone5cBlue), DEVDevice.forDevice(.TypeiPad4), DEVDevice.forDevice(.TypeiPadMini)] 13 | 14 | class DEVDeviceSelectionCollectionViewController: UICollectionViewController { 15 | 16 | // MARK: - View Controller Lifecycle 17 | 18 | override func viewDidLoad() { 19 | super.viewDidLoad() 20 | self.collectionView!.collectionViewLayout = DeviceLayout() 21 | } 22 | 23 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 24 | 25 | if segue.identifier == "Present-Image-Picker" 26 | { 27 | let imagePickerController = (segue.destinationViewController as! UINavigationController).viewControllers[0]as! ImagePickerPreviewViewController 28 | 29 | let index:Int = Int(self.collectionView!.contentOffset.x / CGRectGetWidth(self.collectionView!.bounds)) 30 | imagePickerController.configureForDevice(deviceTypes[index]) 31 | } 32 | 33 | } 34 | 35 | // MARK: UICollectionViewDataSource 36 | 37 | override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } 38 | 39 | override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return deviceTypes.count } 40 | 41 | override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 42 | 43 | let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)as! DEVDeviceCollectionViewCell 44 | cell.configureForDevice(deviceTypes[indexPath.row]) 45 | 46 | return cell 47 | } 48 | } 49 | 50 | // MARK: - Flow Layout Implementation 51 | 52 | class DeviceLayout : UICollectionViewFlowLayout { 53 | 54 | var layoutInfo = [UICollectionViewLayoutAttributes]() 55 | 56 | override func prepareLayout() { 57 | 58 | let collectionViewBounds = CGRectGetWidth(self.collectionView!.bounds) 59 | for i in 0...(deviceTypes.count - 1) 60 | { 61 | let currentLayoutAttribute = UICollectionViewLayoutAttributes(forCellWithIndexPath: NSIndexPath(forRow: i, inSection: 0)) 62 | currentLayoutAttribute.frame = CGRectMake(collectionViewBounds * CGFloat(i), 0, collectionViewBounds, CGRectGetHeight(self.collectionView!.bounds)) 63 | 64 | layoutInfo.append(currentLayoutAttribute) 65 | } 66 | } 67 | 68 | override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! { 69 | return layoutInfo[indexPath.row] 70 | } 71 | 72 | override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? { 73 | 74 | var attributes = [UICollectionViewLayoutAttributes]() 75 | for currentAttribute in layoutInfo 76 | { 77 | if CGRectIntersectsRect(rect, currentAttribute.frame) { 78 | attributes.append(currentAttribute) 79 | } 80 | } 81 | 82 | return attributes 83 | } 84 | 85 | override func collectionViewContentSize() -> CGSize { 86 | 87 | return CGSizeMake(CGRectGetWidth(self.collectionView!.bounds) * CGFloat(deviceTypes.count), (CGRectGetHeight(self.collectionView!.bounds) - 100.0)); 88 | } 89 | 90 | } -------------------------------------------------------------------------------- /ScreenShotPrep/Device Selection/Data/DEVDevice.h: -------------------------------------------------------------------------------- 1 | // 2 | // DEVDevice.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/13/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | typedef NS_ENUM(NSInteger, DeviceType) { 10 | 11 | DeviceTypeiPhone5cBlue, 12 | 13 | DeviceTypeiPhone6Black, 14 | DeviceTypeiPhone6Silver, 15 | 16 | DeviceTypeiPhone6PlusBlack, 17 | DeviceTypeiPhone6PlusSilver, 18 | 19 | DeviceTypeiPadAir2LscpBlack, 20 | DeviceTypeiPadAir2LscpSilver, 21 | DeviceTypeiPadAir2PrtBlack, 22 | DeviceTypeiPadAir2PrtSilver, 23 | 24 | DeviceTypeiPadMini3Prt, 25 | DeviceTypeiPadMini3Lscp, 26 | 27 | DeviceTypeIPhone5, 28 | DeviceTypeiPad4, 29 | DeviceTypeiPadMini, 30 | DeviceTypeiPhone4, 31 | }; 32 | 33 | @interface DEVDevice : NSObject 34 | 35 | @property (readonly) BOOL isIpadType; 36 | 37 | @property (nonatomic, strong, readonly) NSString* displayName; 38 | @property (nonatomic, strong, readonly) UIImage* deviceImage; 39 | 40 | @property (readonly) CGFloat bezelWidth, bezelHeight; 41 | 42 | @property (nonatomic, readonly) DeviceType currentType; 43 | 44 | /** 45 | * Responsible for initializing a DEVDevice type for a specific DeviceType 46 | * 47 | * @param deviceType The DeviceType that this object will be initialized for 48 | * 49 | * @return an initialized DEVDevice object 50 | */ 51 | + (DEVDevice*) forDevice:(DeviceType) deviceType; 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /ScreenShotPrep/Device Selection/Data/DEVDevice.m: -------------------------------------------------------------------------------- 1 | // 2 | // DEVDevice.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/13/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "DEVDevice.h" 10 | 11 | @implementation DEVDevice 12 | 13 | #pragma mark - 14 | #pragma mark - Initialization Methods 15 | 16 | - (id) initForDevice:(DeviceType) deviceType 17 | { 18 | if (self = [super init]) 19 | { 20 | const CGFloat bezelHeightMultiplier = (CGRectGetHeight([UIScreen mainScreen].bounds) / 667.0f); 21 | const CGFloat bezelWidthMultiplier = (CGRectGetWidth([UIScreen mainScreen].bounds) / 375.0f); 22 | 23 | _isIpadType = NO; 24 | _currentType = deviceType; 25 | switch (deviceType) { 26 | case DeviceTypeiPhone6Black: 27 | case DeviceTypeiPhone6Silver: 28 | { 29 | NSString* imageName = (deviceType == DeviceTypeiPhone6Silver) ? @"iPhone6PrtSlv" : @"iPhone6PrtBlack"; 30 | 31 | _deviceImage = [UIImage imageNamed:imageName]; 32 | _displayName = @"iPhone 6"; 33 | _bezelWidth = 36; 34 | _bezelHeight = 135; 35 | break; 36 | } 37 | case DeviceTypeiPhone6PlusBlack: 38 | { 39 | NSString* imageName = (deviceType == DeviceTypeiPhone6PlusSilver) ? @"iPhone6+Slv" : @"iPhone6+Black"; 40 | _displayName = @"iPhone 6+"; 41 | _deviceImage = [UIImage imageNamed:imageName]; 42 | _bezelWidth = 32; 43 | _bezelHeight = 118; 44 | break; 45 | } 46 | case DeviceTypeiPadAir2LscpBlack: 47 | case DeviceTypeiPadAir2LscpSilver: 48 | case DeviceTypeiPadAir2PrtBlack: 49 | case DeviceTypeiPadAir2PrtSilver: 50 | 51 | _bezelHeight = 140; 52 | _bezelWidth = 80; 53 | _isIpadType = YES; 54 | _displayName = @"iPad Air 2"; 55 | if (deviceType == DeviceTypeiPadAir2LscpBlack) 56 | _deviceImage = [UIImage imageNamed:@"iPadAir2LandscapeBlck"]; 57 | else if (deviceType == DeviceTypeiPadAir2LscpSilver) 58 | _deviceImage = [UIImage imageNamed:@"iPadAir2LanscapeSlv"]; 59 | else if (deviceType == DeviceTypeiPadAir2PrtBlack) 60 | _deviceImage = [UIImage imageNamed:@"iPadAir2PrtBlck"]; 61 | else if (deviceType == DeviceTypeiPadAir2PrtSilver) 62 | _deviceImage = [UIImage imageNamed:@"iPadAir2PrtSlv"]; 63 | 64 | break; 65 | 66 | case DeviceTypeiPadMini3Lscp: 67 | _isIpadType = YES; 68 | _displayName = @"iPad Mini Retina"; 69 | _deviceImage = [UIImage imageNamed:@"iPadMini3LandscapeBlack"]; 70 | break; 71 | case DeviceTypeiPadMini3Prt: 72 | 73 | _bezelHeight = 96; 74 | _bezelWidth = 34; 75 | _isIpadType = YES; 76 | _displayName = @"iPad Mini Retina"; 77 | _deviceImage = [UIImage imageNamed:@"iPadMini3VertBlack"]; 78 | break; 79 | case DeviceTypeiPad4: 80 | 81 | _bezelHeight = 134; 82 | _bezelWidth = 110; 83 | 84 | _isIpadType = YES; 85 | _displayName = @"iPad 4"; 86 | _deviceImage = [UIImage imageNamed:@"iPad4"]; 87 | break; 88 | case DeviceTypeiPadMini: 89 | 90 | _bezelWidth = 34; 91 | _bezelHeight = 96; 92 | 93 | _isIpadType = YES; 94 | _displayName = @"iPad Mini"; 95 | _deviceImage = [UIImage imageNamed:@"iPadMini"]; 96 | break; 97 | case DeviceTypeiPhone4: 98 | _displayName = @"iPhone 4s"; 99 | _deviceImage = [UIImage imageNamed:@"iPhone4s"]; 100 | break; 101 | case DeviceTypeIPhone5: 102 | 103 | _bezelWidth = 34; 104 | _bezelHeight = 128; 105 | _displayName = @"iPhone 5s"; 106 | _deviceImage = [UIImage imageNamed:@"iPhone5"]; 107 | break; 108 | case DeviceTypeiPhone5cBlue: 109 | 110 | _bezelWidth = 34; 111 | _bezelHeight = 128; 112 | _displayName = @"iPhone 5c"; 113 | _deviceImage = [UIImage imageNamed:@"iPhone5cBlue"]; 114 | break; 115 | default: 116 | _displayName = @""; 117 | _deviceImage = [UIImage imageNamed:@""]; 118 | break; 119 | } 120 | 121 | _bezelWidth *= bezelWidthMultiplier; 122 | _bezelHeight *= bezelHeightMultiplier; 123 | } 124 | 125 | return self; 126 | } 127 | 128 | + (DEVDevice*) forDevice:(DeviceType)deviceType 129 | { 130 | return [[DEVDevice alloc] initForDevice:deviceType]; 131 | } 132 | 133 | @end -------------------------------------------------------------------------------- /ScreenShotPrep/Device Selection/View/DEVDeviceCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DEVDeviceCollectionViewCell.swift 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 11/18/14. 6 | // Copyright (c) 2014 Jason Loewy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class DEVDeviceCollectionViewCell: UICollectionViewCell { 12 | 13 | @IBOutlet var deviceImageView: UIImageView! 14 | @IBOutlet var deviceTitle: UILabel! 15 | 16 | /** 17 | Responsible for configuring the UI of the collection view cell 18 | 19 | :param: currentDevice the DEVDevice that is being displayed on this cell 20 | */ 21 | func configureForDevice(currentDevice:DEVDevice) 22 | { 23 | deviceImageView.image = currentDevice.deviceImage 24 | deviceTitle.text = currentDevice.displayName 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ScreenShotPrep/Recent Screenshots/RecentShotsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RecentShotsViewController.h 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | @interface RecentShotsViewController : UITableViewController 10 | 11 | @end -------------------------------------------------------------------------------- /ScreenShotPrep/Recent Screenshots/RecentShotsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RecentShotsViewController.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import "RecentShotsViewController.h" 10 | 11 | #import "ImagePickerPreviewViewController.h" 12 | 13 | /// Data Objects 14 | #import "Screenshot.h" 15 | 16 | @interface RecentShotsViewController () 17 | 18 | @property (nonatomic, strong) NSMutableArray* recentShots; 19 | 20 | @end 21 | 22 | @implementation RecentShotsViewController 23 | 24 | #pragma mark - 25 | #pragma mark - Initialization Methods 26 | 27 | - (id) initWithCoder:(NSCoder *)aDecoder 28 | { 29 | if (self = [super initWithCoder:aDecoder]) 30 | { 31 | // Perform the initial recent screenshot retrieval and add the observer to react to new saved screenshtos 32 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fillContent:) name:kNewImageSavedAlert object:nil]; 33 | [self fillContent:nil]; 34 | } 35 | 36 | return self; 37 | } 38 | 39 | #pragma mark - 40 | #pragma mark - Initialization Methods 41 | 42 | /** 43 | * Responsible for fetching all of the local saved screenshots to display 44 | * 45 | * @param notif The NSNotification that coule be responsible for firing this method 46 | */ 47 | - (void) fillContent:(NSNotification*) notif 48 | { 49 | NSArray* currentSavedImages = [[NSUserDefaults standardUserDefaults] arrayForKey:kSavedImagesKey]; 50 | _recentShots = [[NSMutableArray alloc] initWithCapacity:currentSavedImages.count]; 51 | 52 | for (NSDictionary* savedImage in currentSavedImages) 53 | _recentShots[[currentSavedImages indexOfObject:savedImage]] = [[Screenshot alloc] initWithDictionary:savedImage]; 54 | 55 | // Only reaload the tableview if this screenshot was saved after the iniitial recentShots fill 56 | if (notif) 57 | [self.tableView reloadData]; 58 | } 59 | 60 | #pragma mark - 61 | #pragma mark - UIViewController Lifecycle Methods 62 | 63 | - (void)viewDidLoad 64 | { 65 | [super viewDidLoad]; 66 | [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"No-Saved-Id"]; 67 | } 68 | 69 | - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 70 | { 71 | if ([segue.identifier isEqualToString:@"RecentImageSelected"] && [segue.destinationViewController isKindOfClass:[UINavigationController class]]) 72 | { 73 | // Enter here to prepare the image picker to display the recent screenshot that was tapped 74 | ImagePickerPreviewViewController* prevVC = [((UINavigationController*)segue.destinationViewController).viewControllers firstObject]; 75 | Screenshot* selectedShot = _recentShots[[self.tableView indexPathForSelectedRow].row]; 76 | [prevVC displayForRecent:selectedShot]; 77 | } 78 | } 79 | 80 | #pragma mark - Table view data source 81 | 82 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } 83 | 84 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 85 | { 86 | return MAX(_recentShots.count, 1); 87 | } 88 | 89 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 90 | { 91 | //---- 92 | // Check the exit conditions for if there is no recent screenshots saved 93 | // This means that it should go to the default screenshot 94 | //---- 95 | if (_recentShots.count == 0) 96 | { 97 | UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"No-Saved-Id" forIndexPath:indexPath]; 98 | [cell.textLabel setFont:[UIFont fontWithName:@"SourceSansPro-Regular" size:18.0f]]; 99 | [cell.textLabel setText:@"No Saved Screenshots"]; 100 | [cell.textLabel setTextAlignment:NSTextAlignmentCenter]; 101 | [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 102 | 103 | return cell; 104 | } 105 | 106 | // Create the standard recent screenshot cell 107 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RecentShotCell" forIndexPath:indexPath]; 108 | Screenshot* currentScreenshot = _recentShots[indexPath.row]; 109 | 110 | [cell.imageView setImage:currentScreenshot.screenshot]; 111 | [cell.textLabel setText:currentScreenshot.title]; 112 | [cell.detailTextLabel setText:[currentScreenshot getTimeStamp]]; 113 | 114 | return cell; 115 | } 116 | 117 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 118 | { 119 | return (_recentShots.count > 0); 120 | } 121 | 122 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 123 | { 124 | if (_recentShots.count > 0) 125 | { 126 | if (editingStyle == UITableViewCellEditingStyleDelete) 127 | { 128 | // Delete the image from the users documents directory 129 | Screenshot* screenshotToDelete = _recentShots[indexPath.row]; 130 | if ([screenshotToDelete deleteScreenshot]) 131 | { 132 | // Update the table content and display 133 | [_recentShots removeObjectAtIndex:indexPath.row]; 134 | if (_recentShots.count > 0) 135 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 136 | else 137 | [tableView reloadData]; 138 | } 139 | else 140 | { 141 | UIAlertView* deleteError = [[UIAlertView alloc] initWithTitle:@"Delete Error" message:@"We're sorry, there was an error when trying to delete this screenshot" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles: nil]; 142 | [deleteError show]; 143 | } 144 | } 145 | } 146 | } 147 | 148 | - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 149 | { 150 | return (_recentShots.count > 0) ? 60.0f : 44.0f; 151 | } 152 | 153 | @end 154 | -------------------------------------------------------------------------------- /ScreenShotPrep/ScreenShotPrep-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import 6 | #import 7 | 8 | /// View Controllers 9 | #import "ImagePickerPreviewViewController.h" 10 | 11 | /// Data Objects 12 | #import "DEVDevice.h" 13 | #import "Screenshot.h" -------------------------------------------------------------------------------- /ScreenShotPrep/ScreenShotPrep-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Dev Frames 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIcons 12 | 13 | CFBundleIcons~ipad 14 | 15 | CFBundleIdentifier 16 | com.jloewy.ScreenShotPrep.${PRODUCT_NAME:rfc1034identifier} 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | ${PRODUCT_NAME} 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 2.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 6 29 | LSRequiresIPhoneOS 30 | 31 | UIAppFonts 32 | 33 | SourceSansPro-Semibold.ttf 34 | SourceSansPro-Bold.ttf 35 | SourceSansPro-ExtraLight.ttf 36 | SourceSansPro-Light.ttf 37 | SourceSansPro-Regular.ttf 38 | 39 | UIMainStoryboardFile 40 | MainStoryboard_iPhone 41 | UIMainStoryboardFile~ipad 42 | MainStoryboard_iPhone 43 | UIPrerenderedIcon 44 | 45 | UIRequiredDeviceCapabilities 46 | 47 | armv7 48 | 49 | UIStatusBarHidden 50 | 51 | UISupportedInterfaceOrientations 52 | 53 | UIInterfaceOrientationPortrait 54 | 55 | UISupportedInterfaceOrientations~ipad 56 | 57 | UIInterfaceOrientationPortrait 58 | UIInterfaceOrientationPortraitUpsideDown 59 | 60 | UIViewControllerBasedStatusBarAppearance 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /ScreenShotPrep/ScreenShotPrep-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ScreenShotPrep' target in the 'ScreenShotPrep' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_5_0 8 | #warning "This project uses features only available in iOS SDK 5.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #import "DataResourceHandler.h" 15 | #endif 16 | 17 | #define isIpad UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 18 | #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) 19 | 20 | #define Color(r,g,b,a) [UIColor colorWithRed:(r/(float)255) green:(g/(float)255) blue:(b/(float)255) alpha:a] 21 | 22 | /// Saved Image Macros 23 | #define kSavedImagesKey @"saved_images" 24 | #define kNewImageSavedAlert @"NewImageSaved" -------------------------------------------------------------------------------- /ScreenShotPrep/SourceSansPro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep/SourceSansPro-Bold.ttf -------------------------------------------------------------------------------- /ScreenShotPrep/SourceSansPro-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep/SourceSansPro-ExtraLight.ttf -------------------------------------------------------------------------------- /ScreenShotPrep/SourceSansPro-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep/SourceSansPro-Light.ttf -------------------------------------------------------------------------------- /ScreenShotPrep/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /ScreenShotPrep/SourceSansPro-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JLoewy/DevFrames/4b3adcb1a19627949f55482a6cb283702764e7ce/ScreenShotPrep/SourceSansPro-Semibold.ttf -------------------------------------------------------------------------------- /ScreenShotPrep/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ScreenShotPrep/en.lproj/MainStoryboard_iPhone.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | SourceSansPro-Light 10 | 11 | 12 | SourceSansPro-Regular 13 | SourceSansPro-Regular 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 133 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 346 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 437 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | -------------------------------------------------------------------------------- /ScreenShotPrep/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ScreenShotPrep 4 | // 5 | // Created by Jason Loewy on 1/7/13. 6 | // Copyright (c) 2013 Jason Loewy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | --------------------------------------------------------------------------------