├── .gitignore ├── CoreFramed ├── CoreFramed.h ├── FMDDeviceModel.h ├── FMDDeviceModel.m ├── FMDRenderer.h ├── FMDRenderer.m ├── FMDResourceManager.h ├── FMDResourceManager.m └── Info.plist ├── Design.sketch ├── Framed.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── cyandev.xcuserdatad │ └── xcschemes │ ├── Framed.xcscheme │ └── xcschememanagement.plist ├── Framed ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── AppIcon.png │ │ ├── AppIcon@2x.png │ │ └── Contents.json ├── Base.lproj │ └── Main.storyboard ├── FMDDeviceModelItem.h ├── FMDDeviceModelItem.m ├── FMDDeviceModelItem.xib ├── FMDMainViewController.h ├── FMDMainViewController.m ├── FMDMainWindow.h ├── FMDMainWindow.m ├── FMDPreviewViewController.h ├── FMDPreviewViewController.m ├── Framed.entitlements ├── FramedResources.bundle │ └── Contents │ │ ├── Info.plist │ │ ├── Resources │ │ ├── 7-B.png │ │ ├── 7-W.png │ │ ├── 7P-B.png │ │ ├── 7P-W.png │ │ ├── AW-B.png │ │ ├── AW-W.png │ │ ├── PA-B.png │ │ ├── PA-W.png │ │ ├── PM-B.png │ │ ├── PM-W.png │ │ ├── PP-B.png │ │ ├── PP-W.png │ │ ├── SE-B.png │ │ ├── SE-W.png │ │ └── manifest.plist │ │ └── _CodeSignature │ │ ├── CodeDirectory │ │ ├── CodeRequirements │ │ ├── CodeRequirements-1 │ │ ├── CodeResources │ │ └── CodeSignature ├── Info.plist └── main.m ├── FramedResources ├── 7-B.png ├── 7-W.png ├── 7P-B.png ├── 7P-W.png ├── AW-B.png ├── AW-W.png ├── Info.plist ├── PA-B.png ├── PA-W.png ├── PM-B.png ├── PM-W.png ├── PP-B.png ├── PP-W.png ├── SE-B.png ├── SE-W.png └── manifest.plist ├── LICENSE ├── README.md ├── Releases └── Framed.dmg └── Screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | 20 | ## Other 21 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | *.xcscheme 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | # Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | # Carthage/Checkouts 43 | 44 | Carthage/Build 45 | 46 | # fastlane 47 | # 48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 49 | # screenshots whenever they are needed. 50 | # For more information about the recommended setup visit: 51 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md 52 | 53 | fastlane/report.xml 54 | fastlane/screenshots 55 | -------------------------------------------------------------------------------- /CoreFramed/CoreFramed.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreFramed.h 3 | // CoreFramed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for CoreFramed. 12 | FOUNDATION_EXPORT double CoreFramedVersionNumber; 13 | 14 | //! Project version string for CoreFramed. 15 | FOUNDATION_EXPORT const unsigned char CoreFramedVersionString[]; 16 | 17 | #import "FMDResourceManager.h" 18 | #import "FMDDeviceModel.h" 19 | #import "FMDRenderer.h" 20 | -------------------------------------------------------------------------------- /CoreFramed/FMDDeviceModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDDeviceModel.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FMDDeviceModel : NSObject 12 | 13 | @property (copy, nonatomic) NSString *name; 14 | @property (copy, nonatomic) NSString *idString; 15 | @property (copy, nonatomic) NSString *frameRectString; 16 | @property (copy, nonatomic) NSURL *frameResourceURL; 17 | @property (assign, nonatomic) uint8_t role; 18 | @property (assign, nonatomic) uint8_t color; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /CoreFramed/FMDDeviceModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDDeviceModel.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "FMDDeviceModel.h" 10 | 11 | @implementation FMDDeviceModel 12 | 13 | - (id)copyWithZone:(NSZone *)zone { 14 | FMDDeviceModel *instance = [[FMDDeviceModel allocWithZone:zone] init]; 15 | instance.name = self.name; 16 | instance.idString = self.idString; 17 | instance.frameRectString = self.frameRectString; 18 | instance.frameResourceURL = self.frameResourceURL; 19 | instance.role = self.role; 20 | instance.color = self.color; 21 | 22 | return instance; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /CoreFramed/FMDRenderer.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDRenderer.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/21. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | #import "FMDDeviceModel.h" 13 | 14 | @interface FMDRenderer : NSObject 15 | 16 | + (CGImageRef)createImageWithDeviceModel:(FMDDeviceModel *)model contentImage:(CGImageRef)image; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /CoreFramed/FMDRenderer.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDRenderer.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/21. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "FMDRenderer.h" 12 | 13 | @implementation FMDRenderer 14 | 15 | + (CGImageRef)createImageWithDeviceModel:(FMDDeviceModel *)model contentImage:(CGImageRef)image { 16 | CGImageSourceRef frameImageSource = CGImageSourceCreateWithURL((__bridge CFURLRef) model.frameResourceURL, NULL); 17 | CGImageRef frameImage = CGImageSourceCreateImageAtIndex(frameImageSource, 0, NULL); 18 | 19 | if (!frameImage) { 20 | return nil; 21 | } 22 | 23 | NSRect screenFrame = NSRectFromString(model.frameRectString); 24 | 25 | CGFloat width = CGImageGetWidth(frameImage); 26 | CGFloat height = CGImageGetHeight(frameImage); 27 | 28 | CGFloat contentWidth = CGImageGetWidth(image); 29 | CGFloat contentHeight = CGImageGetHeight(image); 30 | 31 | CGFloat ratio = CGRectGetWidth(screenFrame) / CGRectGetHeight(screenFrame); 32 | CGFloat contentRatio = contentWidth / contentHeight; 33 | BOOL shouldRotate = NO; 34 | 35 | if (fabs(ratio - contentRatio) > 0.01) { 36 | if (fabs(ratio - 1.0 / contentRatio) > 0.01) { 37 | return NULL; 38 | } 39 | shouldRotate = YES; 40 | } 41 | 42 | // Scale the image via Core Image. 43 | // CIImage *contentCIImage = [CIImage imageWithCGImage:image]; 44 | // CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; 45 | // [scaleFilter setValue:contentCIImage forKey:kCIInputImageKey]; 46 | // [scaleFilter setValue:@(1) forKey:@"inputScale"]; 47 | // [scaleFilter setValue:@(1) forKey:@"inputAspectRatio"]; 48 | // CIImage *scaledContentCIImage = scaleFilter.outputImage; 49 | // CIContext *ciContext = [[CIContext alloc] initWithOptions:nil]; 50 | // CGImageRef scaledContentImage = [ciContext createCGImage:scaledContentCIImage fromRect:scaledContentCIImage.extent]; 51 | 52 | // TODO: Actually, I can't tell the filtered image from the original. 53 | CGImageRef scaledContentImage = image; 54 | 55 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 56 | 57 | CGContextRef context = CGBitmapContextCreate(NULL, shouldRotate ? height : width, shouldRotate ? width : height, 8, (shouldRotate ? height : width) * 4, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); 58 | CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 59 | 60 | CGContextSaveGState(context); 61 | 62 | if (shouldRotate) { 63 | CGContextTranslateCTM(context, height / 2, -width / 2); 64 | CGContextRotateCTM(context, M_PI_2); 65 | CGContextDrawImage(context, CGRectMake(width / 2, -height / 2, width, height), frameImage); 66 | } else { 67 | CGContextTranslateCTM(context, width / 2, -height / 2); 68 | CGContextDrawImage(context, CGRectMake(-width / 2, height / 2, width, height), frameImage); 69 | } 70 | 71 | CGContextRestoreGState(context); 72 | 73 | if (shouldRotate) { 74 | CGContextDrawImage(context, CGRectMake(screenFrame.origin.y, screenFrame.origin.x, screenFrame.size.height, screenFrame.size.width), scaledContentImage); 75 | } else { 76 | CGContextDrawImage(context, CGRectMake(screenFrame.origin.x, screenFrame.origin.y + 3, screenFrame.size.width, screenFrame.size.height), scaledContentImage); 77 | } 78 | 79 | CGImageRef resultImage = CGBitmapContextCreateImage(context); 80 | 81 | // CGImageRelease(scaledContentImage); 82 | CGContextRelease(context); 83 | CGColorSpaceRelease(colorSpace); 84 | CGImageRelease(frameImage); 85 | CFRelease(frameImageSource); 86 | 87 | return resultImage; 88 | } 89 | 90 | @end 91 | -------------------------------------------------------------------------------- /CoreFramed/FMDResourceManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDResourceManager.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class FMDDeviceModel; 12 | 13 | typedef NS_OPTIONS(NSUInteger, FMDResourceDeviceColor) { 14 | FMDResourceDeviceColorSpaceGray = 1, 15 | FMDResourceDeviceColorSilver = 1 << 1 16 | }; 17 | 18 | typedef NS_OPTIONS(NSUInteger, FMDResourceDeviceRole) { 19 | FMDResourceDeviceRoleAll = 7, 20 | FMDResourceDeviceRolePhone = 1, 21 | FMDResourceDeviceRolePad = 1 << 1, 22 | FMDResourceDeviceRoleWatch = 1 << 2, 23 | }; 24 | 25 | @interface FMDResourceManager : NSObject 26 | 27 | @property (assign, nonatomic) FMDResourceDeviceColor deviceColors; 28 | @property (assign, nonatomic) FMDResourceDeviceRole deviceRoles; 29 | 30 | - (instancetype)initWithBundle:(NSBundle *)bundle; 31 | 32 | - (NSUInteger)numberOfDeviceModels; 33 | - (FMDDeviceModel *)deviceModelAtIndex:(NSUInteger)idx; 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /CoreFramed/FMDResourceManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDResourceManager.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "FMDResourceManager.h" 10 | #import "FMDDeviceModel.h" 11 | 12 | @interface FMDResourceManager () { 13 | NSBundle *_bundle; 14 | NSArray *_models; 15 | NSArray *_filteredModels; 16 | } 17 | 18 | @end 19 | 20 | @implementation FMDResourceManager 21 | 22 | - (instancetype)initWithBundle:(NSBundle *)bundle { 23 | self = [super init]; 24 | if (self) { 25 | _bundle = bundle; 26 | [self loadData]; 27 | } 28 | return self; 29 | } 30 | 31 | - (void)loadData { 32 | NSURL *manifestPlistURL = [_bundle URLForResource:@"manifest" withExtension:@"plist"]; 33 | NSData *manifestPlistData = [NSData dataWithContentsOfURL:manifestPlistURL]; 34 | NSArray *manifestPlist = [NSPropertyListSerialization propertyListWithData:manifestPlistData options:NSPropertyListImmutable format:nil error:nil]; 35 | 36 | NSMutableArray *models = [NSMutableArray array]; 37 | [manifestPlist enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 38 | FMDDeviceModel *spaceGrayModel = [[FMDDeviceModel alloc] init]; 39 | spaceGrayModel.name = [obj objectForKey:@"FMDModelName"]; 40 | spaceGrayModel.idString = [obj objectForKey:@"FMDModelID"]; 41 | spaceGrayModel.frameRectString = [obj objectForKey:@"FMDContentFrame"]; 42 | spaceGrayModel.frameResourceURL = [_bundle URLForResource:[NSString stringWithFormat:@"%@-B", spaceGrayModel.idString] withExtension:@"png"]; 43 | spaceGrayModel.role = [[obj objectForKey:@"FMDModelRole"] unsignedCharValue]; 44 | spaceGrayModel.color = FMDResourceDeviceColorSpaceGray; 45 | 46 | FMDDeviceModel *silverModel = [spaceGrayModel copy]; 47 | silverModel.frameResourceURL = [_bundle URLForResource:[NSString stringWithFormat:@"%@-W", silverModel.idString] withExtension:@"png"]; 48 | silverModel.color = FMDResourceDeviceColorSilver; 49 | 50 | [models addObject:spaceGrayModel]; 51 | [models addObject:silverModel]; 52 | }]; 53 | 54 | _models = [models copy]; 55 | } 56 | 57 | - (void)reloadFilteredData { 58 | NSMutableArray *filteredModels = [NSMutableArray array]; 59 | [_models enumerateObjectsUsingBlock:^(FMDDeviceModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 60 | BOOL qualified = YES; 61 | 62 | if (!(obj.color & _deviceColors)) { 63 | qualified = NO; 64 | } 65 | 66 | if (!(obj.role & _deviceRoles)) { 67 | qualified = NO; 68 | } 69 | 70 | if (qualified) { 71 | [filteredModels addObject:obj]; 72 | } 73 | }]; 74 | 75 | _filteredModels = [filteredModels copy]; 76 | } 77 | 78 | - (void)setDeviceRoles:(FMDResourceDeviceRole)deviceRoles { 79 | if (_deviceRoles != deviceRoles) { 80 | _deviceRoles = deviceRoles; 81 | [self reloadFilteredData]; 82 | } 83 | } 84 | 85 | - (void)setDeviceColors:(FMDResourceDeviceColor)deviceColors { 86 | if (_deviceColors != deviceColors) { 87 | _deviceColors = deviceColors; 88 | [self reloadFilteredData]; 89 | } 90 | } 91 | 92 | - (NSUInteger)numberOfDeviceModels { 93 | return _filteredModels.count; 94 | } 95 | 96 | - (FMDDeviceModel *)deviceModelAtIndex:(NSUInteger)idx { 97 | return [_filteredModels objectAtIndex:idx]; 98 | } 99 | 100 | @end 101 | -------------------------------------------------------------------------------- /CoreFramed/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2017年 Cyandev. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Design.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Design.sketch -------------------------------------------------------------------------------- /Framed.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | FA1C9FD31E5BFE5B0014B715 /* FMDRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1C9FD11E5BFE5B0014B715 /* FMDRenderer.h */; }; 11 | FA1C9FD41E5BFE5B0014B715 /* FMDRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = FA1C9FD21E5BFE5B0014B715 /* FMDRenderer.m */; }; 12 | FA1C9FD91E5C02130014B715 /* FMDPreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA1C9FD81E5C02130014B715 /* FMDPreviewViewController.m */; }; 13 | FA1C9FDC1E5C4A3E0014B715 /* 7P-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FDA1E5C4A3E0014B715 /* 7P-B.png */; }; 14 | FA1C9FDD1E5C4A3E0014B715 /* 7P-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FDB1E5C4A3E0014B715 /* 7P-W.png */; }; 15 | FA1C9FE01E5C7BBF0014B715 /* PP-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FDF1E5C7BBF0014B715 /* PP-W.png */; }; 16 | FA1C9FE21E5C7BC50014B715 /* PP-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FE11E5C7BC50014B715 /* PP-B.png */; }; 17 | FA1C9FE61E5C7C530014B715 /* PA-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FE51E5C7C530014B715 /* PA-W.png */; }; 18 | FA1C9FEA1E5C7CA00014B715 /* PA-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FE91E5C7CA00014B715 /* PA-B.png */; }; 19 | FA1C9FEC1E5C7CEC0014B715 /* 7-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FEB1E5C7CEC0014B715 /* 7-B.png */; }; 20 | FA1C9FEE1E5C7D190014B715 /* 7-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FED1E5C7D190014B715 /* 7-W.png */; }; 21 | FA1C9FF51E5C861A0014B715 /* FramedResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FA1C9FF41E5C861A0014B715 /* FramedResources.bundle */; }; 22 | FABAD23C1E59A4850026AAA2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FABAD23B1E59A4850026AAA2 /* AppDelegate.m */; }; 23 | FABAD23F1E59A4850026AAA2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FABAD23E1E59A4850026AAA2 /* main.m */; }; 24 | FABAD2441E59A4850026AAA2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FABAD2431E59A4850026AAA2 /* Assets.xcassets */; }; 25 | FABAD2471E59A4850026AAA2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FABAD2451E59A4850026AAA2 /* Main.storyboard */; }; 26 | FABAD2591E59A4D50026AAA2 /* manifest.plist in Resources */ = {isa = PBXBuildFile; fileRef = FABAD2581E59A4D50026AAA2 /* manifest.plist */; }; 27 | FABAD25C1E59A6040026AAA2 /* AW-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FABAD25A1E59A6040026AAA2 /* AW-B.png */; }; 28 | FABAD25D1E59A6040026AAA2 /* AW-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FABAD25B1E59A6040026AAA2 /* AW-W.png */; }; 29 | FABAD2671E59A6320026AAA2 /* CoreFramed.h in Headers */ = {isa = PBXBuildFile; fileRef = FABAD2651E59A6310026AAA2 /* CoreFramed.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30 | FABAD26A1E59A6320026AAA2 /* CoreFramed.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FABAD2631E59A6310026AAA2 /* CoreFramed.framework */; }; 31 | FABAD26B1E59A6320026AAA2 /* CoreFramed.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FABAD2631E59A6310026AAA2 /* CoreFramed.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 32 | FABAD2721E59A65D0026AAA2 /* FMDResourceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FABAD2701E59A65D0026AAA2 /* FMDResourceManager.h */; }; 33 | FABAD2731E59A65D0026AAA2 /* FMDResourceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FABAD2711E59A65D0026AAA2 /* FMDResourceManager.m */; }; 34 | FADD4D7A1E59C7EC0072C193 /* FMDDeviceModel.h in Headers */ = {isa = PBXBuildFile; fileRef = FADD4D781E59C7EC0072C193 /* FMDDeviceModel.h */; }; 35 | FADD4D7B1E59C7EC0072C193 /* FMDDeviceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = FADD4D791E59C7EC0072C193 /* FMDDeviceModel.m */; }; 36 | FADD4D7F1E59CDFE0072C193 /* FMDMainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = FADD4D7E1E59CDFE0072C193 /* FMDMainWindow.m */; }; 37 | FADD4D831E59CFAE0072C193 /* FMDMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FADD4D821E59CFAE0072C193 /* FMDMainViewController.m */; }; 38 | FADD4D8A1E59D33E0072C193 /* FMDDeviceModelItem.m in Sources */ = {isa = PBXBuildFile; fileRef = FADD4D881E59D33E0072C193 /* FMDDeviceModelItem.m */; }; 39 | FADD4D8B1E59D33E0072C193 /* FMDDeviceModelItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = FADD4D891E59D33E0072C193 /* FMDDeviceModelItem.xib */; }; 40 | FADD4D961E59DDE80072C193 /* PM-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FADD4D951E59DDE80072C193 /* PM-B.png */; }; 41 | FADD4D981E59DDEE0072C193 /* PM-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FADD4D971E59DDEE0072C193 /* PM-W.png */; }; 42 | FADD4D9A1E59DE880072C193 /* SE-B.png in Resources */ = {isa = PBXBuildFile; fileRef = FADD4D991E59DE880072C193 /* SE-B.png */; }; 43 | FADD4D9C1E59DE8E0072C193 /* SE-W.png in Resources */ = {isa = PBXBuildFile; fileRef = FADD4D9B1E59DE8E0072C193 /* SE-W.png */; }; 44 | /* End PBXBuildFile section */ 45 | 46 | /* Begin PBXContainerItemProxy section */ 47 | FABAD2681E59A6320026AAA2 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = FABAD22F1E59A4850026AAA2 /* Project object */; 50 | proxyType = 1; 51 | remoteGlobalIDString = FABAD2621E59A6310026AAA2; 52 | remoteInfo = CoreFramed; 53 | }; 54 | /* End PBXContainerItemProxy section */ 55 | 56 | /* Begin PBXCopyFilesBuildPhase section */ 57 | FABAD26F1E59A6320026AAA2 /* Embed Frameworks */ = { 58 | isa = PBXCopyFilesBuildPhase; 59 | buildActionMask = 2147483647; 60 | dstPath = ""; 61 | dstSubfolderSpec = 10; 62 | files = ( 63 | FABAD26B1E59A6320026AAA2 /* CoreFramed.framework in Embed Frameworks */, 64 | ); 65 | name = "Embed Frameworks"; 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | /* End PBXCopyFilesBuildPhase section */ 69 | 70 | /* Begin PBXFileReference section */ 71 | FA1C9FD11E5BFE5B0014B715 /* FMDRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDRenderer.h; sourceTree = ""; }; 72 | FA1C9FD21E5BFE5B0014B715 /* FMDRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDRenderer.m; sourceTree = ""; }; 73 | FA1C9FD71E5C02130014B715 /* FMDPreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDPreviewViewController.h; sourceTree = ""; }; 74 | FA1C9FD81E5C02130014B715 /* FMDPreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDPreviewViewController.m; sourceTree = ""; }; 75 | FA1C9FDA1E5C4A3E0014B715 /* 7P-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "7P-B.png"; sourceTree = ""; }; 76 | FA1C9FDB1E5C4A3E0014B715 /* 7P-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "7P-W.png"; sourceTree = ""; }; 77 | FA1C9FDE1E5C74300014B715 /* Framed.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Framed.entitlements; sourceTree = ""; }; 78 | FA1C9FDF1E5C7BBF0014B715 /* PP-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PP-W.png"; sourceTree = ""; }; 79 | FA1C9FE11E5C7BC50014B715 /* PP-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PP-B.png"; sourceTree = ""; }; 80 | FA1C9FE51E5C7C530014B715 /* PA-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PA-W.png"; sourceTree = ""; }; 81 | FA1C9FE91E5C7CA00014B715 /* PA-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PA-B.png"; sourceTree = ""; }; 82 | FA1C9FEB1E5C7CEC0014B715 /* 7-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "7-B.png"; sourceTree = ""; }; 83 | FA1C9FED1E5C7D190014B715 /* 7-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "7-W.png"; sourceTree = ""; }; 84 | FA1C9FF41E5C861A0014B715 /* FramedResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = FramedResources.bundle; sourceTree = ""; }; 85 | FABAD2371E59A4850026AAA2 /* Framed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Framed.app; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | FABAD23A1E59A4850026AAA2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 87 | FABAD23B1E59A4850026AAA2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 88 | FABAD23E1E59A4850026AAA2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 89 | FABAD2431E59A4850026AAA2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 90 | FABAD2461E59A4850026AAA2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 91 | FABAD2481E59A4850026AAA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 92 | FABAD2521E59A4B80026AAA2 /* FramedResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FramedResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 93 | FABAD2541E59A4B80026AAA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 94 | FABAD2581E59A4D50026AAA2 /* manifest.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = manifest.plist; sourceTree = ""; }; 95 | FABAD25A1E59A6040026AAA2 /* AW-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AW-B.png"; sourceTree = ""; }; 96 | FABAD25B1E59A6040026AAA2 /* AW-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AW-W.png"; sourceTree = ""; }; 97 | FABAD2631E59A6310026AAA2 /* CoreFramed.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CoreFramed.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 98 | FABAD2651E59A6310026AAA2 /* CoreFramed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreFramed.h; sourceTree = ""; }; 99 | FABAD2661E59A6320026AAA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 100 | FABAD2701E59A65D0026AAA2 /* FMDResourceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDResourceManager.h; sourceTree = ""; }; 101 | FABAD2711E59A65D0026AAA2 /* FMDResourceManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDResourceManager.m; sourceTree = ""; }; 102 | FADD4D781E59C7EC0072C193 /* FMDDeviceModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDDeviceModel.h; sourceTree = ""; }; 103 | FADD4D791E59C7EC0072C193 /* FMDDeviceModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDDeviceModel.m; sourceTree = ""; }; 104 | FADD4D7D1E59CDFE0072C193 /* FMDMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDMainWindow.h; sourceTree = ""; }; 105 | FADD4D7E1E59CDFE0072C193 /* FMDMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDMainWindow.m; sourceTree = ""; }; 106 | FADD4D811E59CFAE0072C193 /* FMDMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDMainViewController.h; sourceTree = ""; }; 107 | FADD4D821E59CFAE0072C193 /* FMDMainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDMainViewController.m; sourceTree = ""; }; 108 | FADD4D871E59D33E0072C193 /* FMDDeviceModelItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDDeviceModelItem.h; sourceTree = ""; }; 109 | FADD4D881E59D33E0072C193 /* FMDDeviceModelItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDDeviceModelItem.m; sourceTree = ""; }; 110 | FADD4D891E59D33E0072C193 /* FMDDeviceModelItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FMDDeviceModelItem.xib; sourceTree = ""; }; 111 | FADD4D951E59DDE80072C193 /* PM-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PM-B.png"; sourceTree = ""; }; 112 | FADD4D971E59DDEE0072C193 /* PM-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PM-W.png"; sourceTree = ""; }; 113 | FADD4D991E59DE880072C193 /* SE-B.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SE-B.png"; sourceTree = ""; }; 114 | FADD4D9B1E59DE8E0072C193 /* SE-W.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SE-W.png"; sourceTree = ""; }; 115 | /* End PBXFileReference section */ 116 | 117 | /* Begin PBXFrameworksBuildPhase section */ 118 | FABAD2341E59A4850026AAA2 /* Frameworks */ = { 119 | isa = PBXFrameworksBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | FABAD26A1E59A6320026AAA2 /* CoreFramed.framework in Frameworks */, 123 | ); 124 | runOnlyForDeploymentPostprocessing = 0; 125 | }; 126 | FABAD24F1E59A4B80026AAA2 /* Frameworks */ = { 127 | isa = PBXFrameworksBuildPhase; 128 | buildActionMask = 2147483647; 129 | files = ( 130 | ); 131 | runOnlyForDeploymentPostprocessing = 0; 132 | }; 133 | FABAD25F1E59A6310026AAA2 /* Frameworks */ = { 134 | isa = PBXFrameworksBuildPhase; 135 | buildActionMask = 2147483647; 136 | files = ( 137 | ); 138 | runOnlyForDeploymentPostprocessing = 0; 139 | }; 140 | /* End PBXFrameworksBuildPhase section */ 141 | 142 | /* Begin PBXGroup section */ 143 | FA1C9FD51E5C01F30014B715 /* Main */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | FADD4D811E59CFAE0072C193 /* FMDMainViewController.h */, 147 | FADD4D821E59CFAE0072C193 /* FMDMainViewController.m */, 148 | FADD4D871E59D33E0072C193 /* FMDDeviceModelItem.h */, 149 | FADD4D881E59D33E0072C193 /* FMDDeviceModelItem.m */, 150 | FADD4D891E59D33E0072C193 /* FMDDeviceModelItem.xib */, 151 | ); 152 | name = Main; 153 | sourceTree = ""; 154 | }; 155 | FA1C9FD61E5C01FB0014B715 /* Preview */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | FA1C9FD71E5C02130014B715 /* FMDPreviewViewController.h */, 159 | FA1C9FD81E5C02130014B715 /* FMDPreviewViewController.m */, 160 | ); 161 | name = Preview; 162 | sourceTree = ""; 163 | }; 164 | FABAD22E1E59A4850026AAA2 = { 165 | isa = PBXGroup; 166 | children = ( 167 | FABAD2391E59A4850026AAA2 /* Framed */, 168 | FABAD2531E59A4B80026AAA2 /* FramedResources */, 169 | FABAD2641E59A6310026AAA2 /* CoreFramed */, 170 | FABAD2381E59A4850026AAA2 /* Products */, 171 | ); 172 | sourceTree = ""; 173 | }; 174 | FABAD2381E59A4850026AAA2 /* Products */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | FABAD2371E59A4850026AAA2 /* Framed.app */, 178 | FABAD2521E59A4B80026AAA2 /* FramedResources.bundle */, 179 | FABAD2631E59A6310026AAA2 /* CoreFramed.framework */, 180 | ); 181 | name = Products; 182 | sourceTree = ""; 183 | }; 184 | FABAD2391E59A4850026AAA2 /* Framed */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | FA1C9FDE1E5C74300014B715 /* Framed.entitlements */, 188 | FADD4D7C1E59CDD90072C193 /* Windows & Views */, 189 | FADD4D801E59CF790072C193 /* View Controllers */, 190 | FABAD23A1E59A4850026AAA2 /* AppDelegate.h */, 191 | FABAD23B1E59A4850026AAA2 /* AppDelegate.m */, 192 | FABAD2431E59A4850026AAA2 /* Assets.xcassets */, 193 | FABAD2451E59A4850026AAA2 /* Main.storyboard */, 194 | FABAD2481E59A4850026AAA2 /* Info.plist */, 195 | FA1C9FF41E5C861A0014B715 /* FramedResources.bundle */, 196 | FABAD23D1E59A4850026AAA2 /* Supporting Files */, 197 | ); 198 | path = Framed; 199 | sourceTree = ""; 200 | }; 201 | FABAD23D1E59A4850026AAA2 /* Supporting Files */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | FABAD23E1E59A4850026AAA2 /* main.m */, 205 | ); 206 | name = "Supporting Files"; 207 | sourceTree = ""; 208 | }; 209 | FABAD2531E59A4B80026AAA2 /* FramedResources */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | FA1C9FEB1E5C7CEC0014B715 /* 7-B.png */, 213 | FA1C9FED1E5C7D190014B715 /* 7-W.png */, 214 | FA1C9FDA1E5C4A3E0014B715 /* 7P-B.png */, 215 | FA1C9FDB1E5C4A3E0014B715 /* 7P-W.png */, 216 | FADD4D991E59DE880072C193 /* SE-B.png */, 217 | FADD4D9B1E59DE8E0072C193 /* SE-W.png */, 218 | FADD4D951E59DDE80072C193 /* PM-B.png */, 219 | FADD4D971E59DDEE0072C193 /* PM-W.png */, 220 | FA1C9FE11E5C7BC50014B715 /* PP-B.png */, 221 | FA1C9FDF1E5C7BBF0014B715 /* PP-W.png */, 222 | FA1C9FE91E5C7CA00014B715 /* PA-B.png */, 223 | FA1C9FE51E5C7C530014B715 /* PA-W.png */, 224 | FABAD25A1E59A6040026AAA2 /* AW-B.png */, 225 | FABAD25B1E59A6040026AAA2 /* AW-W.png */, 226 | FABAD2581E59A4D50026AAA2 /* manifest.plist */, 227 | FABAD2541E59A4B80026AAA2 /* Info.plist */, 228 | ); 229 | path = FramedResources; 230 | sourceTree = ""; 231 | }; 232 | FABAD2641E59A6310026AAA2 /* CoreFramed */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | FADD4D781E59C7EC0072C193 /* FMDDeviceModel.h */, 236 | FADD4D791E59C7EC0072C193 /* FMDDeviceModel.m */, 237 | FABAD2701E59A65D0026AAA2 /* FMDResourceManager.h */, 238 | FABAD2711E59A65D0026AAA2 /* FMDResourceManager.m */, 239 | FA1C9FD11E5BFE5B0014B715 /* FMDRenderer.h */, 240 | FA1C9FD21E5BFE5B0014B715 /* FMDRenderer.m */, 241 | FABAD2651E59A6310026AAA2 /* CoreFramed.h */, 242 | FABAD2661E59A6320026AAA2 /* Info.plist */, 243 | ); 244 | path = CoreFramed; 245 | sourceTree = ""; 246 | }; 247 | FADD4D7C1E59CDD90072C193 /* Windows & Views */ = { 248 | isa = PBXGroup; 249 | children = ( 250 | FADD4D7D1E59CDFE0072C193 /* FMDMainWindow.h */, 251 | FADD4D7E1E59CDFE0072C193 /* FMDMainWindow.m */, 252 | ); 253 | name = "Windows & Views"; 254 | sourceTree = ""; 255 | }; 256 | FADD4D801E59CF790072C193 /* View Controllers */ = { 257 | isa = PBXGroup; 258 | children = ( 259 | FA1C9FD51E5C01F30014B715 /* Main */, 260 | FA1C9FD61E5C01FB0014B715 /* Preview */, 261 | ); 262 | name = "View Controllers"; 263 | sourceTree = ""; 264 | }; 265 | /* End PBXGroup section */ 266 | 267 | /* Begin PBXHeadersBuildPhase section */ 268 | FABAD2601E59A6310026AAA2 /* Headers */ = { 269 | isa = PBXHeadersBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | FABAD2721E59A65D0026AAA2 /* FMDResourceManager.h in Headers */, 273 | FA1C9FD31E5BFE5B0014B715 /* FMDRenderer.h in Headers */, 274 | FADD4D7A1E59C7EC0072C193 /* FMDDeviceModel.h in Headers */, 275 | FABAD2671E59A6320026AAA2 /* CoreFramed.h in Headers */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | /* End PBXHeadersBuildPhase section */ 280 | 281 | /* Begin PBXNativeTarget section */ 282 | FABAD2361E59A4850026AAA2 /* Framed */ = { 283 | isa = PBXNativeTarget; 284 | buildConfigurationList = FABAD24B1E59A4850026AAA2 /* Build configuration list for PBXNativeTarget "Framed" */; 285 | buildPhases = ( 286 | FABAD2331E59A4850026AAA2 /* Sources */, 287 | FABAD2341E59A4850026AAA2 /* Frameworks */, 288 | FABAD2351E59A4850026AAA2 /* Resources */, 289 | FABAD26F1E59A6320026AAA2 /* Embed Frameworks */, 290 | ); 291 | buildRules = ( 292 | ); 293 | dependencies = ( 294 | FABAD2691E59A6320026AAA2 /* PBXTargetDependency */, 295 | ); 296 | name = Framed; 297 | productName = Framed; 298 | productReference = FABAD2371E59A4850026AAA2 /* Framed.app */; 299 | productType = "com.apple.product-type.application"; 300 | }; 301 | FABAD2511E59A4B80026AAA2 /* FramedResources */ = { 302 | isa = PBXNativeTarget; 303 | buildConfigurationList = FABAD2551E59A4B80026AAA2 /* Build configuration list for PBXNativeTarget "FramedResources" */; 304 | buildPhases = ( 305 | FABAD24E1E59A4B80026AAA2 /* Sources */, 306 | FABAD24F1E59A4B80026AAA2 /* Frameworks */, 307 | FABAD2501E59A4B80026AAA2 /* Resources */, 308 | ); 309 | buildRules = ( 310 | ); 311 | dependencies = ( 312 | ); 313 | name = FramedResources; 314 | productName = FramedResources; 315 | productReference = FABAD2521E59A4B80026AAA2 /* FramedResources.bundle */; 316 | productType = "com.apple.product-type.bundle"; 317 | }; 318 | FABAD2621E59A6310026AAA2 /* CoreFramed */ = { 319 | isa = PBXNativeTarget; 320 | buildConfigurationList = FABAD26C1E59A6320026AAA2 /* Build configuration list for PBXNativeTarget "CoreFramed" */; 321 | buildPhases = ( 322 | FABAD25E1E59A6310026AAA2 /* Sources */, 323 | FABAD25F1E59A6310026AAA2 /* Frameworks */, 324 | FABAD2601E59A6310026AAA2 /* Headers */, 325 | FABAD2611E59A6310026AAA2 /* Resources */, 326 | ); 327 | buildRules = ( 328 | ); 329 | dependencies = ( 330 | ); 331 | name = CoreFramed; 332 | productName = CoreFramed; 333 | productReference = FABAD2631E59A6310026AAA2 /* CoreFramed.framework */; 334 | productType = "com.apple.product-type.framework"; 335 | }; 336 | /* End PBXNativeTarget section */ 337 | 338 | /* Begin PBXProject section */ 339 | FABAD22F1E59A4850026AAA2 /* Project object */ = { 340 | isa = PBXProject; 341 | attributes = { 342 | LastUpgradeCheck = 0820; 343 | ORGANIZATIONNAME = Cyandev; 344 | TargetAttributes = { 345 | FABAD2361E59A4850026AAA2 = { 346 | CreatedOnToolsVersion = 8.2; 347 | DevelopmentTeam = 9ZS3K56XF5; 348 | ProvisioningStyle = Automatic; 349 | SystemCapabilities = { 350 | com.apple.Sandbox = { 351 | enabled = 1; 352 | }; 353 | }; 354 | }; 355 | FABAD2511E59A4B80026AAA2 = { 356 | CreatedOnToolsVersion = 8.2; 357 | DevelopmentTeam = 9ZS3K56XF5; 358 | ProvisioningStyle = Automatic; 359 | }; 360 | FABAD2621E59A6310026AAA2 = { 361 | CreatedOnToolsVersion = 8.2; 362 | DevelopmentTeam = 9ZS3K56XF5; 363 | ProvisioningStyle = Automatic; 364 | }; 365 | }; 366 | }; 367 | buildConfigurationList = FABAD2321E59A4850026AAA2 /* Build configuration list for PBXProject "Framed" */; 368 | compatibilityVersion = "Xcode 3.2"; 369 | developmentRegion = English; 370 | hasScannedForEncodings = 0; 371 | knownRegions = ( 372 | en, 373 | Base, 374 | ); 375 | mainGroup = FABAD22E1E59A4850026AAA2; 376 | productRefGroup = FABAD2381E59A4850026AAA2 /* Products */; 377 | projectDirPath = ""; 378 | projectRoot = ""; 379 | targets = ( 380 | FABAD2361E59A4850026AAA2 /* Framed */, 381 | FABAD2511E59A4B80026AAA2 /* FramedResources */, 382 | FABAD2621E59A6310026AAA2 /* CoreFramed */, 383 | ); 384 | }; 385 | /* End PBXProject section */ 386 | 387 | /* Begin PBXResourcesBuildPhase section */ 388 | FABAD2351E59A4850026AAA2 /* Resources */ = { 389 | isa = PBXResourcesBuildPhase; 390 | buildActionMask = 2147483647; 391 | files = ( 392 | FA1C9FF51E5C861A0014B715 /* FramedResources.bundle in Resources */, 393 | FABAD2441E59A4850026AAA2 /* Assets.xcassets in Resources */, 394 | FADD4D8B1E59D33E0072C193 /* FMDDeviceModelItem.xib in Resources */, 395 | FABAD2471E59A4850026AAA2 /* Main.storyboard in Resources */, 396 | ); 397 | runOnlyForDeploymentPostprocessing = 0; 398 | }; 399 | FABAD2501E59A4B80026AAA2 /* Resources */ = { 400 | isa = PBXResourcesBuildPhase; 401 | buildActionMask = 2147483647; 402 | files = ( 403 | FABAD25D1E59A6040026AAA2 /* AW-W.png in Resources */, 404 | FA1C9FEA1E5C7CA00014B715 /* PA-B.png in Resources */, 405 | FADD4D9A1E59DE880072C193 /* SE-B.png in Resources */, 406 | FA1C9FDC1E5C4A3E0014B715 /* 7P-B.png in Resources */, 407 | FA1C9FEC1E5C7CEC0014B715 /* 7-B.png in Resources */, 408 | FA1C9FDD1E5C4A3E0014B715 /* 7P-W.png in Resources */, 409 | FADD4D9C1E59DE8E0072C193 /* SE-W.png in Resources */, 410 | FADD4D961E59DDE80072C193 /* PM-B.png in Resources */, 411 | FABAD25C1E59A6040026AAA2 /* AW-B.png in Resources */, 412 | FA1C9FEE1E5C7D190014B715 /* 7-W.png in Resources */, 413 | FA1C9FE01E5C7BBF0014B715 /* PP-W.png in Resources */, 414 | FA1C9FE21E5C7BC50014B715 /* PP-B.png in Resources */, 415 | FADD4D981E59DDEE0072C193 /* PM-W.png in Resources */, 416 | FABAD2591E59A4D50026AAA2 /* manifest.plist in Resources */, 417 | FA1C9FE61E5C7C530014B715 /* PA-W.png in Resources */, 418 | ); 419 | runOnlyForDeploymentPostprocessing = 0; 420 | }; 421 | FABAD2611E59A6310026AAA2 /* Resources */ = { 422 | isa = PBXResourcesBuildPhase; 423 | buildActionMask = 2147483647; 424 | files = ( 425 | ); 426 | runOnlyForDeploymentPostprocessing = 0; 427 | }; 428 | /* End PBXResourcesBuildPhase section */ 429 | 430 | /* Begin PBXSourcesBuildPhase section */ 431 | FABAD2331E59A4850026AAA2 /* Sources */ = { 432 | isa = PBXSourcesBuildPhase; 433 | buildActionMask = 2147483647; 434 | files = ( 435 | FADD4D831E59CFAE0072C193 /* FMDMainViewController.m in Sources */, 436 | FABAD23F1E59A4850026AAA2 /* main.m in Sources */, 437 | FADD4D7F1E59CDFE0072C193 /* FMDMainWindow.m in Sources */, 438 | FA1C9FD91E5C02130014B715 /* FMDPreviewViewController.m in Sources */, 439 | FADD4D8A1E59D33E0072C193 /* FMDDeviceModelItem.m in Sources */, 440 | FABAD23C1E59A4850026AAA2 /* AppDelegate.m in Sources */, 441 | ); 442 | runOnlyForDeploymentPostprocessing = 0; 443 | }; 444 | FABAD24E1E59A4B80026AAA2 /* Sources */ = { 445 | isa = PBXSourcesBuildPhase; 446 | buildActionMask = 2147483647; 447 | files = ( 448 | ); 449 | runOnlyForDeploymentPostprocessing = 0; 450 | }; 451 | FABAD25E1E59A6310026AAA2 /* Sources */ = { 452 | isa = PBXSourcesBuildPhase; 453 | buildActionMask = 2147483647; 454 | files = ( 455 | FABAD2731E59A65D0026AAA2 /* FMDResourceManager.m in Sources */, 456 | FA1C9FD41E5BFE5B0014B715 /* FMDRenderer.m in Sources */, 457 | FADD4D7B1E59C7EC0072C193 /* FMDDeviceModel.m in Sources */, 458 | ); 459 | runOnlyForDeploymentPostprocessing = 0; 460 | }; 461 | /* End PBXSourcesBuildPhase section */ 462 | 463 | /* Begin PBXTargetDependency section */ 464 | FABAD2691E59A6320026AAA2 /* PBXTargetDependency */ = { 465 | isa = PBXTargetDependency; 466 | target = FABAD2621E59A6310026AAA2 /* CoreFramed */; 467 | targetProxy = FABAD2681E59A6320026AAA2 /* PBXContainerItemProxy */; 468 | }; 469 | /* End PBXTargetDependency section */ 470 | 471 | /* Begin PBXVariantGroup section */ 472 | FABAD2451E59A4850026AAA2 /* Main.storyboard */ = { 473 | isa = PBXVariantGroup; 474 | children = ( 475 | FABAD2461E59A4850026AAA2 /* Base */, 476 | ); 477 | name = Main.storyboard; 478 | sourceTree = ""; 479 | }; 480 | /* End PBXVariantGroup section */ 481 | 482 | /* Begin XCBuildConfiguration section */ 483 | FABAD2491E59A4850026AAA2 /* Debug */ = { 484 | isa = XCBuildConfiguration; 485 | buildSettings = { 486 | ALWAYS_SEARCH_USER_PATHS = NO; 487 | CLANG_ANALYZER_NONNULL = YES; 488 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 489 | CLANG_CXX_LIBRARY = "libc++"; 490 | CLANG_ENABLE_MODULES = YES; 491 | CLANG_ENABLE_OBJC_ARC = YES; 492 | CLANG_WARN_BOOL_CONVERSION = YES; 493 | CLANG_WARN_CONSTANT_CONVERSION = YES; 494 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 495 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 496 | CLANG_WARN_EMPTY_BODY = YES; 497 | CLANG_WARN_ENUM_CONVERSION = YES; 498 | CLANG_WARN_INFINITE_RECURSION = YES; 499 | CLANG_WARN_INT_CONVERSION = YES; 500 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 501 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 502 | CLANG_WARN_UNREACHABLE_CODE = YES; 503 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 504 | CODE_SIGN_IDENTITY = "-"; 505 | COPY_PHASE_STRIP = NO; 506 | DEBUG_INFORMATION_FORMAT = dwarf; 507 | ENABLE_STRICT_OBJC_MSGSEND = YES; 508 | ENABLE_TESTABILITY = YES; 509 | GCC_C_LANGUAGE_STANDARD = gnu99; 510 | GCC_DYNAMIC_NO_PIC = NO; 511 | GCC_NO_COMMON_BLOCKS = YES; 512 | GCC_OPTIMIZATION_LEVEL = 0; 513 | GCC_PREPROCESSOR_DEFINITIONS = ( 514 | "DEBUG=1", 515 | "$(inherited)", 516 | ); 517 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 518 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 519 | GCC_WARN_UNDECLARED_SELECTOR = YES; 520 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 521 | GCC_WARN_UNUSED_FUNCTION = YES; 522 | GCC_WARN_UNUSED_VARIABLE = YES; 523 | MACOSX_DEPLOYMENT_TARGET = 10.12; 524 | MTL_ENABLE_DEBUG_INFO = YES; 525 | ONLY_ACTIVE_ARCH = YES; 526 | SDKROOT = macosx; 527 | }; 528 | name = Debug; 529 | }; 530 | FABAD24A1E59A4850026AAA2 /* Release */ = { 531 | isa = XCBuildConfiguration; 532 | buildSettings = { 533 | ALWAYS_SEARCH_USER_PATHS = NO; 534 | CLANG_ANALYZER_NONNULL = YES; 535 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 536 | CLANG_CXX_LIBRARY = "libc++"; 537 | CLANG_ENABLE_MODULES = YES; 538 | CLANG_ENABLE_OBJC_ARC = YES; 539 | CLANG_WARN_BOOL_CONVERSION = YES; 540 | CLANG_WARN_CONSTANT_CONVERSION = YES; 541 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 542 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 543 | CLANG_WARN_EMPTY_BODY = YES; 544 | CLANG_WARN_ENUM_CONVERSION = YES; 545 | CLANG_WARN_INFINITE_RECURSION = YES; 546 | CLANG_WARN_INT_CONVERSION = YES; 547 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 548 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 549 | CLANG_WARN_UNREACHABLE_CODE = YES; 550 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 551 | CODE_SIGN_IDENTITY = "-"; 552 | COPY_PHASE_STRIP = NO; 553 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 554 | ENABLE_NS_ASSERTIONS = NO; 555 | ENABLE_STRICT_OBJC_MSGSEND = YES; 556 | GCC_C_LANGUAGE_STANDARD = gnu99; 557 | GCC_NO_COMMON_BLOCKS = YES; 558 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 559 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 560 | GCC_WARN_UNDECLARED_SELECTOR = YES; 561 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 562 | GCC_WARN_UNUSED_FUNCTION = YES; 563 | GCC_WARN_UNUSED_VARIABLE = YES; 564 | MACOSX_DEPLOYMENT_TARGET = 10.12; 565 | MTL_ENABLE_DEBUG_INFO = NO; 566 | SDKROOT = macosx; 567 | }; 568 | name = Release; 569 | }; 570 | FABAD24C1E59A4850026AAA2 /* Debug */ = { 571 | isa = XCBuildConfiguration; 572 | buildSettings = { 573 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 574 | CODE_SIGN_ENTITLEMENTS = Framed/Framed.entitlements; 575 | CODE_SIGN_IDENTITY = "Mac Developer"; 576 | COMBINE_HIDPI_IMAGES = YES; 577 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 578 | INFOPLIST_FILE = Framed/Info.plist; 579 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 580 | MACOSX_DEPLOYMENT_TARGET = 10.10; 581 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.framed; 582 | PRODUCT_NAME = "$(TARGET_NAME)"; 583 | }; 584 | name = Debug; 585 | }; 586 | FABAD24D1E59A4850026AAA2 /* Release */ = { 587 | isa = XCBuildConfiguration; 588 | buildSettings = { 589 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 590 | CODE_SIGN_ENTITLEMENTS = Framed/Framed.entitlements; 591 | CODE_SIGN_IDENTITY = "Mac Developer"; 592 | COMBINE_HIDPI_IMAGES = YES; 593 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 594 | INFOPLIST_FILE = Framed/Info.plist; 595 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 596 | MACOSX_DEPLOYMENT_TARGET = 10.10; 597 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.framed; 598 | PRODUCT_NAME = "$(TARGET_NAME)"; 599 | }; 600 | name = Release; 601 | }; 602 | FABAD2561E59A4B80026AAA2 /* Debug */ = { 603 | isa = XCBuildConfiguration; 604 | buildSettings = { 605 | CODE_SIGN_IDENTITY = "Mac Developer"; 606 | COMBINE_HIDPI_IMAGES = YES; 607 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 608 | INFOPLIST_FILE = FramedResources/Info.plist; 609 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 610 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.framedresources; 611 | PRODUCT_NAME = "$(TARGET_NAME)"; 612 | SKIP_INSTALL = YES; 613 | WRAPPER_EXTENSION = bundle; 614 | }; 615 | name = Debug; 616 | }; 617 | FABAD2571E59A4B80026AAA2 /* Release */ = { 618 | isa = XCBuildConfiguration; 619 | buildSettings = { 620 | CODE_SIGN_IDENTITY = "Mac Developer"; 621 | COMBINE_HIDPI_IMAGES = YES; 622 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 623 | INFOPLIST_FILE = FramedResources/Info.plist; 624 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 625 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.framedresources; 626 | PRODUCT_NAME = "$(TARGET_NAME)"; 627 | SKIP_INSTALL = YES; 628 | WRAPPER_EXTENSION = bundle; 629 | }; 630 | name = Release; 631 | }; 632 | FABAD26D1E59A6320026AAA2 /* Debug */ = { 633 | isa = XCBuildConfiguration; 634 | buildSettings = { 635 | CODE_SIGN_IDENTITY = ""; 636 | COMBINE_HIDPI_IMAGES = YES; 637 | CURRENT_PROJECT_VERSION = 1; 638 | DEFINES_MODULE = YES; 639 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 640 | DYLIB_COMPATIBILITY_VERSION = 1; 641 | DYLIB_CURRENT_VERSION = 1; 642 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 643 | FRAMEWORK_VERSION = A; 644 | INFOPLIST_FILE = CoreFramed/Info.plist; 645 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 646 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 647 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.CoreFramed; 648 | PRODUCT_NAME = "$(TARGET_NAME)"; 649 | SKIP_INSTALL = YES; 650 | VERSIONING_SYSTEM = "apple-generic"; 651 | VERSION_INFO_PREFIX = ""; 652 | }; 653 | name = Debug; 654 | }; 655 | FABAD26E1E59A6320026AAA2 /* Release */ = { 656 | isa = XCBuildConfiguration; 657 | buildSettings = { 658 | CODE_SIGN_IDENTITY = ""; 659 | COMBINE_HIDPI_IMAGES = YES; 660 | CURRENT_PROJECT_VERSION = 1; 661 | DEFINES_MODULE = YES; 662 | DEVELOPMENT_TEAM = 9ZS3K56XF5; 663 | DYLIB_COMPATIBILITY_VERSION = 1; 664 | DYLIB_CURRENT_VERSION = 1; 665 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 666 | FRAMEWORK_VERSION = A; 667 | INFOPLIST_FILE = CoreFramed/Info.plist; 668 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 669 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 670 | PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.xplatform.CoreFramed; 671 | PRODUCT_NAME = "$(TARGET_NAME)"; 672 | SKIP_INSTALL = YES; 673 | VERSIONING_SYSTEM = "apple-generic"; 674 | VERSION_INFO_PREFIX = ""; 675 | }; 676 | name = Release; 677 | }; 678 | /* End XCBuildConfiguration section */ 679 | 680 | /* Begin XCConfigurationList section */ 681 | FABAD2321E59A4850026AAA2 /* Build configuration list for PBXProject "Framed" */ = { 682 | isa = XCConfigurationList; 683 | buildConfigurations = ( 684 | FABAD2491E59A4850026AAA2 /* Debug */, 685 | FABAD24A1E59A4850026AAA2 /* Release */, 686 | ); 687 | defaultConfigurationIsVisible = 0; 688 | defaultConfigurationName = Release; 689 | }; 690 | FABAD24B1E59A4850026AAA2 /* Build configuration list for PBXNativeTarget "Framed" */ = { 691 | isa = XCConfigurationList; 692 | buildConfigurations = ( 693 | FABAD24C1E59A4850026AAA2 /* Debug */, 694 | FABAD24D1E59A4850026AAA2 /* Release */, 695 | ); 696 | defaultConfigurationIsVisible = 0; 697 | defaultConfigurationName = Release; 698 | }; 699 | FABAD2551E59A4B80026AAA2 /* Build configuration list for PBXNativeTarget "FramedResources" */ = { 700 | isa = XCConfigurationList; 701 | buildConfigurations = ( 702 | FABAD2561E59A4B80026AAA2 /* Debug */, 703 | FABAD2571E59A4B80026AAA2 /* Release */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | FABAD26C1E59A6320026AAA2 /* Build configuration list for PBXNativeTarget "CoreFramed" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | FABAD26D1E59A6320026AAA2 /* Debug */, 712 | FABAD26E1E59A6320026AAA2 /* Release */, 713 | ); 714 | defaultConfigurationIsVisible = 0; 715 | defaultConfigurationName = Release; 716 | }; 717 | /* End XCConfigurationList section */ 718 | }; 719 | rootObject = FABAD22F1E59A4850026AAA2 /* Project object */; 720 | } 721 | -------------------------------------------------------------------------------- /Framed.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Framed.xcodeproj/xcuserdata/cyandev.xcuserdatad/xcschemes/Framed.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Framed.xcodeproj/xcuserdata/cyandev.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreFramed.xcscheme 8 | 9 | orderHint 10 | 2 11 | 12 | Framed.xcscheme 13 | 14 | orderHint 15 | 0 16 | 17 | FramedResources.xcscheme 18 | 19 | orderHint 20 | 1 21 | 22 | 23 | SuppressBuildableAutocreation 24 | 25 | FABAD2361E59A4850026AAA2 26 | 27 | primary 28 | 29 | 30 | FABAD2511E59A4B80026AAA2 31 | 32 | primary 33 | 34 | 35 | FABAD2621E59A6310026AAA2 36 | 37 | primary 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Framed/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class FMDResourceManager; 12 | 13 | @interface AppDelegate : NSObject 14 | 15 | @property (readonly) FMDResourceManager *resourceManager; 16 | 17 | + (instancetype)sharedDelegate; 18 | 19 | @end 20 | 21 | -------------------------------------------------------------------------------- /Framed/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "FMDResourceManager.h" 11 | 12 | @interface AppDelegate () { 13 | FMDResourceManager *_resourceManager; 14 | } 15 | 16 | @end 17 | 18 | @implementation AppDelegate 19 | 20 | + (instancetype)sharedDelegate { 21 | return NSApp.delegate; 22 | } 23 | 24 | - (FMDResourceManager *)resourceManager { 25 | if (!_resourceManager) { 26 | NSURL *resourceBundleURL = [[NSBundle mainBundle] URLForResource:@"FramedResources" withExtension:@"bundle"]; 27 | _resourceManager = [[FMDResourceManager alloc] initWithBundle:[NSBundle bundleWithURL:resourceBundleURL]]; 28 | _resourceManager.deviceRoles = FMDResourceDeviceRoleAll; 29 | _resourceManager.deviceColors = FMDResourceDeviceColorSpaceGray; 30 | } 31 | 32 | return _resourceManager; 33 | } 34 | 35 | - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { 36 | return YES; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /Framed/Assets.xcassets/AppIcon.appiconset/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/Assets.xcassets/AppIcon.appiconset/AppIcon.png -------------------------------------------------------------------------------- /Framed/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png -------------------------------------------------------------------------------- /Framed/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "512x512", 45 | "idiom" : "mac", 46 | "filename" : "AppIcon.png", 47 | "scale" : "1x" 48 | }, 49 | { 50 | "size" : "512x512", 51 | "idiom" : "mac", 52 | "filename" : "AppIcon@2x.png", 53 | "scale" : "2x" 54 | } 55 | ], 56 | "info" : { 57 | "version" : 1, 58 | "author" : "xcode" 59 | } 60 | } -------------------------------------------------------------------------------- /Framed/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 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 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 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 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 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 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 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 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | -------------------------------------------------------------------------------- /Framed/FMDDeviceModelItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDDeviceModelItem.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | OBJC_EXTERN NSNotificationName const FMDDeviceModelItemDidClickNotification; 12 | 13 | @interface FMDDeviceModelItem : NSCollectionViewItem 14 | 15 | @property (weak) IBOutlet NSImageView *thumbnailImageView; 16 | @property (weak) IBOutlet NSTextField *nameLabel; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Framed/FMDDeviceModelItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDDeviceModelItem.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "FMDDeviceModelItem.h" 12 | 13 | NSNotificationName const FMDDeviceModelItemDidClickNotification = @"FMDDeviceModelItemDidClickNotification"; 14 | 15 | @interface FMDDeviceModelItem () { 16 | CAShapeLayer *_highlightedBackgroundLayer; 17 | BOOL _highlighted; 18 | } 19 | 20 | @end 21 | 22 | @implementation FMDDeviceModelItem 23 | 24 | - (void)awakeFromNib { 25 | [super awakeFromNib]; 26 | 27 | _highlightedBackgroundLayer = [CAShapeLayer layer]; 28 | _highlightedBackgroundLayer.fillColor = [NSColor colorWithRed:0.93 green:0.93 blue:0.93 alpha:1.00].CGColor; 29 | _highlightedBackgroundLayer.opacity = 0; 30 | 31 | [self.view.layer insertSublayer:_highlightedBackgroundLayer atIndex:0]; 32 | } 33 | 34 | - (void)viewDidLayout { 35 | [super viewDidLayout]; 36 | 37 | _highlightedBackgroundLayer.frame = self.view.bounds; 38 | CGPathRef path = CGPathCreateWithRoundedRect(self.view.bounds, 4, 4, nil); 39 | _highlightedBackgroundLayer.path = path; 40 | CGPathRelease(path); 41 | } 42 | 43 | - (void)mouseDown:(NSEvent *)event { 44 | _highlighted = YES; 45 | [CATransaction begin]; 46 | [CATransaction setDisableActions:YES]; 47 | _highlightedBackgroundLayer.opacity = 1; 48 | [CATransaction commit]; 49 | } 50 | 51 | - (void)mouseUp:(NSEvent *)event { 52 | if (_highlighted) { 53 | [[NSNotificationCenter defaultCenter] postNotificationName:FMDDeviceModelItemDidClickNotification object:self]; 54 | } 55 | 56 | _highlightedBackgroundLayer.opacity = 0; 57 | _highlighted = NO; 58 | } 59 | 60 | - (void)mouseDragged:(NSEvent *)event { 61 | CGPoint location = [event locationInWindow]; 62 | location = [self.view convertPoint:location fromView:nil]; 63 | _highlighted = CGRectContainsPoint(self.view.bounds, location); 64 | [CATransaction begin]; 65 | [CATransaction setAnimationDuration:0.5]; 66 | _highlightedBackgroundLayer.opacity = _highlighted ? 1 : 0; 67 | [CATransaction commit]; 68 | } 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /Framed/FMDDeviceModelItem.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 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 | -------------------------------------------------------------------------------- /Framed/FMDMainViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDMainViewController.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FMDMainViewController : NSViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Framed/FMDMainViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDMainViewController.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "FMDMainViewController.h" 10 | #import "FMDPreviewViewController.h" 11 | #import "FMDDeviceModelItem.h" 12 | #import "FMDResourceManager.h" 13 | #import "FMDDeviceModel.h" 14 | #import "FMDRenderer.h" 15 | #import "AppDelegate.h" 16 | 17 | static NSString * const CellIdentifier = @"FMDDeviceModelItem"; 18 | 19 | @interface FMDMainViewController () 20 | 21 | @property (weak) IBOutlet NSCollectionView *collectionView; 22 | 23 | @property (weak) FMDResourceManager *resourceManager; 24 | @property (strong, nonatomic) NSCache *imageCache; 25 | 26 | @property (strong) NSMutableArray *retainPreviewWindow; 27 | 28 | @end 29 | 30 | @implementation FMDMainViewController 31 | 32 | - (void)dealloc { 33 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 34 | } 35 | 36 | - (void)viewDidLoad { 37 | [super viewDidLoad]; 38 | 39 | self.resourceManager = [AppDelegate sharedDelegate].resourceManager; 40 | self.imageCache = [[NSCache alloc] init]; 41 | 42 | _retainPreviewWindow = [NSMutableArray array]; 43 | 44 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(collectionItemDidClick:) name:FMDDeviceModelItemDidClickNotification object:nil]; 45 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(previewWindowWillClose:) name:NSWindowWillCloseNotification object:nil]; 46 | } 47 | 48 | - (void)viewWillAppear { 49 | [super viewWillAppear]; 50 | 51 | NSClipView *clipView = (id) self.collectionView.superview; 52 | [clipView scrollToPoint:NSMakePoint(-18, -72)]; 53 | [((NSScrollView *) clipView.superview) reflectScrolledClipView:clipView]; 54 | } 55 | 56 | - (NSImage *)createImageWithModel:(FMDDeviceModel *)model contentURL:(NSURL *)URL { 57 | CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef) URL, NULL); 58 | CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); 59 | if (!image) { 60 | return nil; 61 | } 62 | 63 | CGImageRef resultImage = [FMDRenderer createImageWithDeviceModel:model contentImage:image]; 64 | 65 | CGImageRelease(image); 66 | CFRelease(imageSource); 67 | 68 | if (!resultImage) { 69 | return nil; 70 | } 71 | 72 | NSImage *resultCocoaImage = [[NSImage alloc] initWithCGImage:resultImage size:NSMakeSize(CGImageGetWidth(resultImage), CGImageGetHeight(resultImage))]; 73 | 74 | CGImageRelease(resultImage); 75 | 76 | return resultCocoaImage; 77 | } 78 | 79 | - (void)showPreviewWindowWithImage:(NSImage *)image deviceColor:(uint8_t)color { 80 | NSWindow *panel = [NSWindow new]; 81 | [panel setTitlebarAppearsTransparent:YES]; 82 | [panel setAppearance:[NSAppearance appearanceNamed:color != 1 ? NSAppearanceNameVibrantLight : NSAppearanceNameVibrantDark]]; 83 | panel.styleMask |= NSWindowStyleMaskClosable; 84 | panel.styleMask |= NSWindowStyleMaskFullSizeContentView; 85 | panel.animationBehavior = NSWindowAnimationBehaviorDocumentWindow; 86 | 87 | NSWindowController *wc = [[NSWindowController alloc] initWithWindow:panel]; 88 | wc.contentViewController = [self.storyboard instantiateControllerWithIdentifier:@"FMDPreviewViewController"]; 89 | ((FMDPreviewViewController *) wc.contentViewController).imageView.image = image; 90 | [wc.window setContentSize:NSMakeSize(image.size.width / 1.5, image.size.height / 1.5)]; 91 | [wc.window center]; 92 | 93 | [wc showWindow:nil]; 94 | 95 | [self.retainPreviewWindow addObject:wc.window]; 96 | } 97 | 98 | - (void)previewWindowWillClose:(NSNotification *)note { 99 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 100 | [self.retainPreviewWindow removeObject:note.object]; 101 | }]; 102 | } 103 | 104 | - (void)collectionItemDidClick:(NSNotification *)note { 105 | NSIndexPath *indexPath = [self.collectionView indexPathForItem:note.object]; 106 | FMDDeviceModel *model = [self.resourceManager deviceModelAtIndex:indexPath.item]; 107 | 108 | [self beginCreatingImageWithModel:model]; 109 | } 110 | 111 | #pragma mark - Actions 112 | 113 | - (IBAction)colorCategoryDidChange:(id)sender { 114 | NSSegmentedControl *control = sender; 115 | self.resourceManager.deviceColors = control.selectedSegment == 0 ? FMDResourceDeviceColorSpaceGray : FMDResourceDeviceColorSilver; 116 | 117 | [self.collectionView performBatchUpdates:^{ 118 | [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; 119 | } completionHandler:nil]; 120 | } 121 | 122 | - (void)beginCreatingImageWithModel:(FMDDeviceModel *)model { 123 | NSOpenPanel *panel = [NSOpenPanel openPanel]; 124 | panel.allowedFileTypes = @[@"png"]; 125 | 126 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) { 127 | if (result == NSModalResponseOK) { 128 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 129 | NSImage *image = [self createImageWithModel:model contentURL:panel.URL]; 130 | if (!image) { 131 | NSAlert *alert = [[NSAlert alloc] init]; 132 | [alert setAlertStyle:NSAlertStyleCritical]; 133 | [alert setMessageText:@"Failed to synthetize."]; 134 | [alert setInformativeText:@"Screenshot is invalid.\n\nHint: You can use alternative images that has similar aspect ratio with actual devices'."]; 135 | [alert beginSheetModalForWindow:self.view.window completionHandler:nil]; 136 | } 137 | 138 | [self showPreviewWindowWithImage:image deviceColor:model.color]; 139 | }]; 140 | } 141 | }]; 142 | } 143 | 144 | #pragma mark - Collection view data source 145 | 146 | - (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 147 | return [self.resourceManager numberOfDeviceModels]; 148 | } 149 | 150 | - (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath { 151 | FMDDeviceModel *model = [self.resourceManager deviceModelAtIndex:indexPath.item]; 152 | NSImage *image; 153 | if (!(image = [self.imageCache objectForKey:model.frameResourceURL])) { 154 | image = [[NSImage alloc] initWithContentsOfURL:model.frameResourceURL]; 155 | [self.imageCache setObject:image forKey:model.frameResourceURL]; 156 | } 157 | 158 | FMDDeviceModelItem *item = [collectionView makeItemWithIdentifier:CellIdentifier forIndexPath:indexPath]; 159 | 160 | item.thumbnailImageView.image = image; 161 | item.nameLabel.stringValue = model.name; 162 | 163 | return item; 164 | } 165 | 166 | @end 167 | -------------------------------------------------------------------------------- /Framed/FMDMainWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDMainWindow.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FMDMainWindow : NSWindow 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Framed/FMDMainWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDMainWindow.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "FMDMainWindow.h" 10 | 11 | @implementation FMDMainWindow 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | 16 | self.backgroundColor = [NSColor whiteColor]; 17 | self.titlebarAppearsTransparent = YES; 18 | self.styleMask |= NSWindowStyleMaskFullSizeContentView; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Framed/FMDPreviewViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FMDPreviewViewController.h 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/21. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FMDPreviewViewController : NSViewController 12 | 13 | @property (weak) IBOutlet NSImageView *imageView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Framed/FMDPreviewViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FMDPreviewViewController.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/21. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import "FMDPreviewViewController.h" 10 | 11 | @interface FMDPreviewViewController () 12 | 13 | @property (copy) NSArray *sharingServices; 14 | 15 | @end 16 | 17 | @implementation FMDPreviewViewController 18 | 19 | - (NSData *)dataRepresentation { 20 | NSImage *image = self.imageView.image; 21 | NSData *tiffData = [image TIFFRepresentation]; 22 | return [[NSBitmapImageRep imageRepWithData:tiffData] representationUsingType:NSPNGFileType properties:@{}]; 23 | } 24 | 25 | - (IBAction)share:(id)sender { 26 | if (!self.sharingServices) 27 | self.sharingServices = [NSSharingService sharingServicesForItems:@[self.imageView.image]]; 28 | 29 | NSMenu *shareMenu = [[NSMenu alloc] init]; 30 | [shareMenu addItemWithTitle:@"Save" action:@selector(save:) keyEquivalent:@""]; 31 | [shareMenu addItem:[NSMenuItem separatorItem]]; 32 | 33 | [self.sharingServices enumerateObjectsUsingBlock:^(NSSharingService * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 34 | NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:obj.menuItemTitle action:@selector(shareItem:) keyEquivalent:@""]; 35 | menuItem.image = obj.image; 36 | menuItem.tag = idx; 37 | [shareMenu addItem:menuItem]; 38 | }]; 39 | 40 | [shareMenu popUpMenuPositioningItem:nil atLocation:NSMakePoint(0, 20) inView:sender]; 41 | } 42 | 43 | - (void)shareItem:(id)sender { 44 | NSSharingService *ss = [self.sharingServices objectAtIndex:[sender tag]]; 45 | [ss performWithItems:@[self.imageView.image]]; 46 | } 47 | 48 | - (void)copy:(id)sender { 49 | NSPasteboard *pb = [NSPasteboard generalPasteboard]; 50 | [pb clearContents]; 51 | [pb writeObjects:@[self.imageView.image]]; 52 | } 53 | 54 | - (void)save:(id)sender { 55 | NSSavePanel *panel = [NSSavePanel savePanel]; 56 | panel.allowedFileTypes = @[@"png"]; 57 | 58 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) { 59 | if (result == NSModalResponseOK) { 60 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 61 | [[self dataRepresentation] writeToURL:panel.URL atomically:YES]; 62 | }]; 63 | } 64 | }]; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /Framed/Framed.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.assets.pictures.read-write 8 | 9 | com.apple.security.files.downloads.read-write 10 | 11 | com.apple.security.files.user-selected.read-write 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 16C67 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleIdentifier 10 | com.cyandev.xplatform.framedresources 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | FramedResources 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSupportedPlatforms 20 | 21 | MacOSX 22 | 23 | CFBundleVersion 24 | 2 25 | DTCompiler 26 | com.apple.compilers.llvm.clang.1_0 27 | DTPlatformBuild 28 | 8C38 29 | DTPlatformVersion 30 | GM 31 | DTSDKBuild 32 | 16C58 33 | DTSDKName 34 | macosx10.12 35 | DTXcode 36 | 0820 37 | DTXcodeBuild 38 | 8C38 39 | NSHumanReadableCopyright 40 | Copyright © 2017年 Cyandev. All rights reserved. 41 | 42 | 43 | -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/7-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/7-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/7-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/7-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/7P-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/7P-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/7P-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/7P-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/AW-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/AW-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/AW-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/AW-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PA-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PA-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PA-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PA-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PM-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PM-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PM-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PM-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PP-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PP-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/PP-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/PP-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/SE-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/SE-B.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/SE-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/Resources/SE-W.png -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/Resources/manifest.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | FMDContentFrame 7 | {{68, 214}, {276, 345}} 8 | FMDModelID 9 | AW 10 | FMDModelRole 11 | 4 12 | FMDModelName 13 | Apple Watch 38mm 14 | 15 | 16 | FMDContentFrame 17 | {{48, 178}, {484, 859}} 18 | FMDModelID 19 | SE 20 | FMDModelRole 21 | 1 22 | FMDModelName 23 | iPhone SE 24 | 25 | 26 | FMDContentFrame 27 | {{30, 105}, {360, 642}} 28 | FMDModelID 29 | 7 30 | FMDModelRole 31 | 1 32 | FMDModelName 33 | iPhone 7 34 | 35 | 36 | FMDContentFrame 37 | {{32, 113}, {421, 750}} 38 | FMDModelID 39 | 7P 40 | FMDModelRole 41 | 1 42 | FMDModelName 43 | iPhone 7 Plus 44 | 45 | 46 | FMDContentFrame 47 | {{47, 135}, {737, 983}} 48 | FMDModelID 49 | PM 50 | FMDModelRole 51 | 2 52 | FMDModelName 53 | iPad mini 54 | 55 | 56 | FMDContentFrame 57 | {{61, 120}, {808, 1076}} 58 | FMDModelID 59 | PA 60 | FMDModelRole 61 | 2 62 | FMDModelName 63 | iPad Pro 9.7 64 | 65 | 66 | FMDContentFrame 67 | {{71, 133}, {898, 1195}} 68 | FMDModelID 69 | PP 70 | FMDModelRole 71 | 2 72 | FMDModelName 73 | iPad Pro 12.9 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Resources/7-B.png 8 | 9 | Qhfb85afVzpjk/LJFJOtX7peDmI= 10 | 11 | Resources/7-W.png 12 | 13 | uhoTtooWcKZ9ge2iBvtWftFb56k= 14 | 15 | Resources/7P-B.png 16 | 17 | RLI4hggnXmD0S1ELpoIgvhhVJPQ= 18 | 19 | Resources/7P-W.png 20 | 21 | wsjeV9bydXulJm0dfAu8vw1oc70= 22 | 23 | Resources/AW-B.png 24 | 25 | A8jmQC5DjVl2ZNmHnWhx2atpWVE= 26 | 27 | Resources/AW-W.png 28 | 29 | RDStn8XIW0YnH1HKmfHaGgMgkXY= 30 | 31 | Resources/PA-B.png 32 | 33 | oHfoG0nNtpsFAr/2yuwx3C7QHLE= 34 | 35 | Resources/PA-W.png 36 | 37 | c0kUUadGWGApR95OG8EtX/v1KvE= 38 | 39 | Resources/PM-B.png 40 | 41 | OA0ZFVhT9bY4aEEW8xZzW4wi0oI= 42 | 43 | Resources/PM-W.png 44 | 45 | qzoHRfLVDOLEiXqHaLdUVnGLzGI= 46 | 47 | Resources/PP-B.png 48 | 49 | z9OiYQIEJ77/pX0BtZPrVT5cs1M= 50 | 51 | Resources/PP-W.png 52 | 53 | rWrQk147a6QesKcODxRO9Fa4Gjw= 54 | 55 | Resources/SE-B.png 56 | 57 | e5H+rQ0Zp6Rq5E8CNCBbrunBOJg= 58 | 59 | Resources/SE-W.png 60 | 61 | Jy2D0MH5+bNvWqaRA/q5Je1HwV8= 62 | 63 | Resources/manifest.plist 64 | 65 | Ci0sG4OjsnNojPFY7kmYyOjogLs= 66 | 67 | 68 | files2 69 | 70 | Resources/7-B.png 71 | 72 | hash 73 | 74 | Qhfb85afVzpjk/LJFJOtX7peDmI= 75 | 76 | hash2 77 | 78 | n2T10hz4gCddwFCddoZbEVPyWBigQHk5YMI6pTKnwBU= 79 | 80 | 81 | Resources/7-W.png 82 | 83 | hash 84 | 85 | uhoTtooWcKZ9ge2iBvtWftFb56k= 86 | 87 | hash2 88 | 89 | yG0M4gNoKqHbA/8JmkE6+F4hE1DXPcfZ6WFGacQSaXs= 90 | 91 | 92 | Resources/7P-B.png 93 | 94 | hash 95 | 96 | RLI4hggnXmD0S1ELpoIgvhhVJPQ= 97 | 98 | hash2 99 | 100 | I+4QJ1Mez2Lw0s63Xy0iWLV6wQHNcHnfYJDC+mJGrQ8= 101 | 102 | 103 | Resources/7P-W.png 104 | 105 | hash 106 | 107 | wsjeV9bydXulJm0dfAu8vw1oc70= 108 | 109 | hash2 110 | 111 | YlehI67WyOupv1N3mppdY5RgQ017DdLKsbJdibSgAKo= 112 | 113 | 114 | Resources/AW-B.png 115 | 116 | hash 117 | 118 | A8jmQC5DjVl2ZNmHnWhx2atpWVE= 119 | 120 | hash2 121 | 122 | 8UK5Ln2hUV9HcmIeQBgKJebgEBdMFOfVYo/ipw4ZKUE= 123 | 124 | 125 | Resources/AW-W.png 126 | 127 | hash 128 | 129 | RDStn8XIW0YnH1HKmfHaGgMgkXY= 130 | 131 | hash2 132 | 133 | SAbVbTACvhM9AGzj5D2ecXKsCsPt12JLu0Brqb91ldw= 134 | 135 | 136 | Resources/PA-B.png 137 | 138 | hash 139 | 140 | oHfoG0nNtpsFAr/2yuwx3C7QHLE= 141 | 142 | hash2 143 | 144 | 06MVfZNKzAUSskn4IZLNbr4lDTEL5PDZnKp2gguaF4M= 145 | 146 | 147 | Resources/PA-W.png 148 | 149 | hash 150 | 151 | c0kUUadGWGApR95OG8EtX/v1KvE= 152 | 153 | hash2 154 | 155 | IVDnOJropBzlK+J2MMDlmg/jB4HUWO9PeknssjKX1LY= 156 | 157 | 158 | Resources/PM-B.png 159 | 160 | hash 161 | 162 | OA0ZFVhT9bY4aEEW8xZzW4wi0oI= 163 | 164 | hash2 165 | 166 | 0QuT+giFWzsL0xIcA4SQuERb9qJdhqM8bse8AjgO5gE= 167 | 168 | 169 | Resources/PM-W.png 170 | 171 | hash 172 | 173 | qzoHRfLVDOLEiXqHaLdUVnGLzGI= 174 | 175 | hash2 176 | 177 | veDPi4PYNaJE7cAPrg8AJs2m8DDRzjExfZGplNKZRr8= 178 | 179 | 180 | Resources/PP-B.png 181 | 182 | hash 183 | 184 | z9OiYQIEJ77/pX0BtZPrVT5cs1M= 185 | 186 | hash2 187 | 188 | s9NViiWrAn+dCT/6ZgeiI7G0aZinjdEFhbsGrItTZw4= 189 | 190 | 191 | Resources/PP-W.png 192 | 193 | hash 194 | 195 | rWrQk147a6QesKcODxRO9Fa4Gjw= 196 | 197 | hash2 198 | 199 | 40FfafXxPOjPwVqhxvb0DFpLAnRb/iYci1Qi4mHreF8= 200 | 201 | 202 | Resources/SE-B.png 203 | 204 | hash 205 | 206 | e5H+rQ0Zp6Rq5E8CNCBbrunBOJg= 207 | 208 | hash2 209 | 210 | 7DM9Q2+UISCzdcUQURJnWZ4xvj3FWXdV7hyktw8UQ6Y= 211 | 212 | 213 | Resources/SE-W.png 214 | 215 | hash 216 | 217 | Jy2D0MH5+bNvWqaRA/q5Je1HwV8= 218 | 219 | hash2 220 | 221 | QB+meDreOIaOakq63Q6LhUwVPOW8ybUJfGA3n2P68l0= 222 | 223 | 224 | Resources/manifest.plist 225 | 226 | hash 227 | 228 | Ci0sG4OjsnNojPFY7kmYyOjogLs= 229 | 230 | hash2 231 | 232 | zjb9MoHlKhuEiEu2DgRUDyujO4GEYqGBRWB/DtjlQvs= 233 | 234 | 235 | 236 | rules 237 | 238 | ^Resources/ 239 | 240 | ^Resources/.*\.lproj/ 241 | 242 | optional 243 | 244 | weight 245 | 1000 246 | 247 | ^Resources/.*\.lproj/locversion.plist$ 248 | 249 | omit 250 | 251 | weight 252 | 1100 253 | 254 | ^Resources/Base\.lproj/ 255 | 256 | weight 257 | 1010 258 | 259 | ^version.plist$ 260 | 261 | 262 | rules2 263 | 264 | .*\.dSYM($|/) 265 | 266 | weight 267 | 11 268 | 269 | ^(.*/)?\.DS_Store$ 270 | 271 | omit 272 | 273 | weight 274 | 2000 275 | 276 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 277 | 278 | nested 279 | 280 | weight 281 | 10 282 | 283 | ^.* 284 | 285 | ^Info\.plist$ 286 | 287 | omit 288 | 289 | weight 290 | 20 291 | 292 | ^PkgInfo$ 293 | 294 | omit 295 | 296 | weight 297 | 20 298 | 299 | ^Resources/ 300 | 301 | weight 302 | 20 303 | 304 | ^Resources/.*\.lproj/ 305 | 306 | optional 307 | 308 | weight 309 | 1000 310 | 311 | ^Resources/.*\.lproj/locversion.plist$ 312 | 313 | omit 314 | 315 | weight 316 | 1100 317 | 318 | ^Resources/Base\.lproj/ 319 | 320 | weight 321 | 1010 322 | 323 | ^[^/]+$ 324 | 325 | nested 326 | 327 | weight 328 | 10 329 | 330 | ^embedded\.provisionprofile$ 331 | 332 | weight 333 | 20 334 | 335 | ^version\.plist$ 336 | 337 | weight 338 | 20 339 | 340 | 341 | 342 | 343 | -------------------------------------------------------------------------------- /Framed/FramedResources.bundle/Contents/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Framed/FramedResources.bundle/Contents/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /Framed/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 5 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2017年 Cyandev. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Framed/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Framed 4 | // 5 | // Created by 杨弘宇 on 2017/2/19. 6 | // Copyright © 2017年 Cyandev. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /FramedResources/7-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/7-B.png -------------------------------------------------------------------------------- /FramedResources/7-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/7-W.png -------------------------------------------------------------------------------- /FramedResources/7P-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/7P-B.png -------------------------------------------------------------------------------- /FramedResources/7P-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/7P-W.png -------------------------------------------------------------------------------- /FramedResources/AW-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/AW-B.png -------------------------------------------------------------------------------- /FramedResources/AW-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/AW-W.png -------------------------------------------------------------------------------- /FramedResources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | $(PRODUCT_BUNDLE_IDENTIFIER) 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | $(PRODUCT_NAME) 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleVersion 18 | 2 19 | NSHumanReadableCopyright 20 | Copyright © 2017年 Cyandev. All rights reserved. 21 | 22 | 23 | -------------------------------------------------------------------------------- /FramedResources/PA-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PA-B.png -------------------------------------------------------------------------------- /FramedResources/PA-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PA-W.png -------------------------------------------------------------------------------- /FramedResources/PM-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PM-B.png -------------------------------------------------------------------------------- /FramedResources/PM-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PM-W.png -------------------------------------------------------------------------------- /FramedResources/PP-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PP-B.png -------------------------------------------------------------------------------- /FramedResources/PP-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/PP-W.png -------------------------------------------------------------------------------- /FramedResources/SE-B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/SE-B.png -------------------------------------------------------------------------------- /FramedResources/SE-W.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/FramedResources/SE-W.png -------------------------------------------------------------------------------- /FramedResources/manifest.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | FMDContentFrame 7 | {{68, 214}, {276, 345}} 8 | FMDModelID 9 | AW 10 | FMDModelRole 11 | 4 12 | FMDModelName 13 | Apple Watch 38mm 14 | 15 | 16 | FMDContentFrame 17 | {{48, 178}, {484, 859}} 18 | FMDModelID 19 | SE 20 | FMDModelRole 21 | 1 22 | FMDModelName 23 | iPhone SE 24 | 25 | 26 | FMDContentFrame 27 | {{30, 105}, {360, 642}} 28 | FMDModelID 29 | 7 30 | FMDModelRole 31 | 1 32 | FMDModelName 33 | iPhone 7 34 | 35 | 36 | FMDContentFrame 37 | {{32, 113}, {421, 750}} 38 | FMDModelID 39 | 7P 40 | FMDModelRole 41 | 1 42 | FMDModelName 43 | iPhone 7 Plus 44 | 45 | 46 | FMDContentFrame 47 | {{47, 135}, {737, 983}} 48 | FMDModelID 49 | PM 50 | FMDModelRole 51 | 2 52 | FMDModelName 53 | iPad mini 54 | 55 | 56 | FMDContentFrame 57 | {{61, 120}, {808, 1076}} 58 | FMDModelID 59 | PA 60 | FMDModelRole 61 | 2 62 | FMDModelName 63 | iPad Pro 9.7 64 | 65 | 66 | FMDContentFrame 67 | {{71, 133}, {898, 1195}} 68 | FMDModelID 69 | PP 70 | FMDModelRole 71 | 2 72 | FMDModelName 73 | iPad Pro 12.9 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Cyandev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Framed 2 | Embed your screenshots into device frames. 3 | 4 | ## Screenshot 5 | ![](https://github.com/unixzii/Framed/raw/master/Screenshot.png) 6 | 7 | ## Supported Devices 8 | **Each with two finishes: Space Gray and Silver.** 9 | * Apple Watch 38mm 10 | * iPhone 5 / 5c / 5s / SE (4') 11 | * iPhone 6 / 6s / 7 / 7s (4.7') 12 | * iPhone 6 Plus / 6s Plus / 7 Plus / 7s Plus (5.5') 13 | * iPad mini 14 | * iPad 15 | * iPad Pro (12.9') 16 | 17 | > All image resources' is from Apple Developer. 18 | 19 | ## Installing 20 | * Via App Store (Current status: Rejected) 21 | * [Download latest build](https://github.com/unixzii/Framed/releases/download/v1.0/Framed.dmg) 22 | * Clone this repo and build yourself: 23 | ```bash 24 | git clone https://github.com/unixzii/Framed.git 25 | ``` 26 | 27 | ## License 28 | The project is available under the MIT license. See the LICENSE file for more info. 29 | -------------------------------------------------------------------------------- /Releases/Framed.dmg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Releases/Framed.dmg -------------------------------------------------------------------------------- /Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixzii/Framed/8aff100d0211e51ba48b83ae37301010509ae3c3/Screenshot.png --------------------------------------------------------------------------------