├── .gitignore ├── RKCard ├── RKCard │ ├── RKCard-Bridging-Header.h │ ├── Images.xcassets │ │ ├── exampleProfile.imageset │ │ │ ├── yhJf065H.jpg │ │ │ ├── yhJf065H-1.jpg │ │ │ ├── yhJf065H-1-1.jpg │ │ │ └── Contents.json │ │ ├── exampleCover.imageset │ │ │ ├── 1503887_10152207410423064_1744981207_n.jpg │ │ │ ├── 1503887_10152207410423064_1744981207_n-1.jpg │ │ │ ├── 1503887_10152207410423064_1744981207_n-1-1.jpg │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── RKCardView.swift │ ├── ViewController.h │ ├── AppDelegate.h │ ├── main.m │ ├── Info.plist │ ├── ViewController.m │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.xib │ ├── RKCardView.h │ ├── AppDelegate.m │ └── RKCardView.m ├── RKCard.xcodeproj │ ├── xcuserdata │ │ └── cwrichardkim93.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── RKCard.xcscheme │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcuserdata │ │ │ └── cwrichardkim93.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcshareddata │ │ │ └── RKCard.xccheckout │ └── project.pbxproj └── RKCardTests │ ├── Info.plist │ └── RKCardTests.m ├── LICENSE ├── README.md └── RKCardView.podspec /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.xcuserstate 3 | 4 | *.xcscheme 5 | 6 | xcschememanagement.plist 7 | 8 | -------------------------------------------------------------------------------- /RKCard/RKCard/RKCard-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H.jpg -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H-1.jpg -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H-1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleProfile.imageset/yhJf065H-1-1.jpg -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/xcuserdata/cwrichardkim93.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n.jpg -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n-1.jpg -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n-1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard/Images.xcassets/exampleCover.imageset/1503887_10152207410423064_1744981207_n-1-1.jpg -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/project.xcworkspace/xcuserdata/cwrichardkim93.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cwRichardKim/RKCardView/HEAD/RKCard/RKCard.xcodeproj/project.xcworkspace/xcuserdata/cwrichardkim93.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RKCard/RKCard/RKCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RKCardView.swift 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/18/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class RKCardView: UIView { 13 | var profileImageView:UIImageView? 14 | 15 | } -------------------------------------------------------------------------------- /RKCard/RKCard/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RKCardView.h" 11 | 12 | @interface ViewController : UIViewController 13 | 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /RKCard/RKCard/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /RKCard/RKCard/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleProfile.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "yhJf065H.jpg" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "yhJf065H-1.jpg" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "yhJf065H-1-1.jpg" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/exampleCover.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "1503887_10152207410423064_1744981207_n.jpg" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "1503887_10152207410423064_1744981207_n-1.jpg" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "1503887_10152207410423064_1744981207_n-1-1.jpg" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/xcuserdata/cwrichardkim93.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RKCard.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 99B7F25A1A0AAB4E00E8EC51 16 | 17 | primary 18 | 19 | 20 | 99B7F2731A0AAB4E00E8EC51 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RKCard/RKCard/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /RKCard/RKCardTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.cwRichardKim.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /RKCard/RKCardTests/RKCardTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RKCardTests.m 3 | // RKCardTests 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface RKCardTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation RKCardTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Choong-Won Richard Kim 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /RKCard/RKCard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.cwRichardKim.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /RKCard/RKCard/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "RKCardView.h" 11 | 12 | #define BUFFERX 20 //distance from side to the card (higher makes thinner card) 13 | #define BUFFERY 40 //distance from top to the card (higher makes shorter card) 14 | 15 | @interface ViewController () 16 | 17 | @end 18 | 19 | @implementation ViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | self.view.backgroundColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1]; 24 | 25 | 26 | RKCardView* cardView= [[RKCardView alloc]initWithFrame:CGRectMake(BUFFERX, BUFFERY, self.view.frame.size.width-2*BUFFERX, self.view.frame.size.height-2*BUFFERY)]; 27 | 28 | cardView.coverImageView.image = [UIImage imageNamed:@"exampleCover"]; 29 | cardView.profileImageView.image = [UIImage imageNamed:@"exampleProfile"]; 30 | cardView.titleLabel.text = @"Richard Kim"; 31 | cardView.delegate = self; 32 | // [cardView addBlur]; 33 | // [cardView addShadow]; 34 | [self.view addSubview:cardView]; 35 | } 36 | 37 | - (void)didReceiveMemoryWarning { 38 | [super didReceiveMemoryWarning]; 39 | // Dispose of any resources that can be recreated. 40 | } 41 | 42 | 43 | // Optional RKCardViewDelegate methods 44 | 45 | -(void)nameTap { 46 | NSLog(@"Taped on name"); 47 | } 48 | 49 | -(void)coverPhotoTap { 50 | NSLog(@"Taped on cover photo"); 51 | } 52 | 53 | -(void)profilePhotoTap { 54 | NSLog(@"Taped on profile photo"); 55 | } 56 | @end 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RKCardView 2 | ========== 3 | Beautiful Twitter / Facebook style cards (built with [@JaredTMoskowitz](https://twitter.com/jaredtmoskowitz)) 4 | 5 | [Support](http://cwrichardkim.com) or [Twitter @cwRichardKim](https://twitter.com/cwRichardKim) 6 | 7 | Or [Check out my Medium posts on UI / UX](https://medium.com/@cwRichardKim) 8 | 9 | This is a **template** for making beautiful cards 10 | 11 | ![Anatomy](http://i.imgur.com/bRZpKIZ.png) 12 | 13 | ![Methods](http://i.imgur.com/j86bi2u.png) 14 | 15 | ## Responsive Design! 16 | Change the size and the card responds in turn 17 | 18 | ![responsive](http://i.imgur.com/JjogZGtl.png) 19 | ![responsive2](http://i.imgur.com/shA68PXl.png) 20 | 21 | ## Examples 22 | An example of RKCardView used in a real project 23 | 24 | ![Example](http://i.imgur.com/YVaSExwl.png) 25 | 26 | ## Usage 27 | __Pod__ 28 | ```objc-c 29 | pod 'RKCardView' 30 | ``` 31 | 32 | ```obj-c 33 | RKCardView* cardView= [[RKCardView alloc]initWithFrame:CGRectMake(x origin, y origin, card width, card height)]; 34 | 35 | cardView.coverImageView.image = [UIImage imageNamed:@"your cover photo"]; 36 | cardView.profileImageView.image = [UIImage imageNamed:@"your profile picture"]; 37 | cardView.titleLabel.text = @"Richard Kim"; 38 | [cardView addBlur]; // comment this out if you don't want blur 39 | [cardView addShadow]; // comment this out if you don't want a shadow 40 | [self.view addSubview:cardView]; 41 | ``` 42 | 43 | ### Areas for Improvement / Involvement 44 | * More rigorous responsive design (making it look nicer with a wider range of dimensions) 45 | * Other custom properties (eg: tap to expand, double sided, tap to flip) 46 | -------------------------------------------------------------------------------- /RKCard/RKCard/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 | -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/project.xcworkspace/xcshareddata/RKCard.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 8869377D-F030-4240-8E87-6A436A3B63A2 9 | IDESourceControlProjectName 10 | RKCard 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | A26D9AD7A2EBFFD7CA8A637BE813CBA50A83E49C 14 | https://github.com/cwRichardKim/RKCardView.git 15 | 16 | IDESourceControlProjectPath 17 | RKCard/RKCard.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | A26D9AD7A2EBFFD7CA8A637BE813CBA50A83E49C 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/cwRichardKim/RKCardView.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | A26D9AD7A2EBFFD7CA8A637BE813CBA50A83E49C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | A26D9AD7A2EBFFD7CA8A637BE813CBA50A83E49C 36 | IDESourceControlWCCName 37 | RKCardView 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RKCard/RKCard/RKCardView.h: -------------------------------------------------------------------------------- 1 | // 2 | // RKCardView.h 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | /* 10 | 11 | Copyright (c) 2014 Choong-Won Richard Kim 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is furnished 18 | to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 | THE SOFTWARE. 30 | 31 | */ 32 | #import 33 | 34 | @protocol RKCardViewDelegate 35 | @optional 36 | - (void)nameTap; 37 | - (void)coverPhotoTap; 38 | - (void)profilePhotoTap; 39 | @end 40 | 41 | 42 | @interface RKCardView : UIView 43 | 44 | @property (nonatomic, weak) IBOutlet id delegate; 45 | @property (nonatomic)UIImageView *profileImageView; 46 | @property (nonatomic)UIImageView *coverImageView; 47 | @property (nonatomic)UILabel *titleLabel; 48 | 49 | - (void)addBlur; 50 | - (void)removeBlur; 51 | - (void)addShadow; 52 | - (void)removeShadow; 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /RKCard/RKCard/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /RKCard/RKCard/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /RKCardView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 4 | # 5 | # These will help people to find your library, and whilst it 6 | # can feel like a chore to fill in it's definitely to your advantage. The 7 | # summary should be tweet-length, and the description more in depth. 8 | # 9 | 10 | s.name = "RKCardView" 11 | s.version = "0.1.0" 12 | s.summary = "iOS: Simple and beautiful Twitter / Facebook style card template" 13 | 14 | s.description = "A template for all projects that use cards. Works especially well with the Twitter or Facebook API', -cardView, -Card, -UI, -Tinder, -iphone, -xcode" 15 | 16 | s.homepage = "https://github.com/cwRichardKim/RKCardView" 17 | s.screenshots = "http://i.imgur.com/shA68PXl.png" 18 | 19 | 20 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 21 | # 22 | # Licensing your code is important. See http://choosealicense.com for more info. 23 | # CocoaPods will detect a license file if there is a named LICENSE* 24 | # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. 25 | # 26 | 27 | # s.license = "MIT (example)" 28 | s.license = { :type => "MIT", :file => "LICENSE" } 29 | 30 | 31 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 32 | # 33 | # Specify the authors of the library, with email addresses. Email addresses 34 | # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also 35 | # accepts just a name if you'd rather not provide an email address. 36 | # 37 | # Specify a social_media_url where others can refer to, for example a twitter 38 | # profile URL. 39 | # 40 | 41 | s.author = "cwrichardkim" 42 | # s.authors = { "cwrichardkim93" => "cwrichardkim93@gmail.com" } 43 | s.social_media_url = "http://twitter.com/cwrichardkim" 44 | 45 | # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 46 | # 47 | # If this Pod runs only on iOS or OS X, then specify the platform and 48 | # the deployment target. You can optionally include the target after the platform. 49 | # 50 | 51 | # s.platform = :ios 52 | s.platform = :ios, "7.0" 53 | 54 | # When using multiple platforms 55 | # s.ios.deployment_target = "5.0" 56 | # s.osx.deployment_target = "10.7" 57 | 58 | 59 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 60 | # 61 | # Specify the location from where the source should be retrieved. 62 | # Supports git, hg, bzr, svn and HTTP. 63 | # 64 | 65 | s.source = { :git => "https://github.com/cwRichardKim/RKCardView.git", :tag => s.version.to_s } 66 | 67 | 68 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 69 | # 70 | # CocoaPods is smart about how it includes source code. For source files 71 | # giving a folder will include any h, m, mm, c & cpp files. For header 72 | # files it will include any header in the folder. 73 | # Not including the public_header_files will make all headers public. 74 | # 75 | 76 | s.source_files = 'RKCard/RKCard/RKCardView.h', 'RKCard/RKCard/RKCardView.m' 77 | 78 | # s.public_header_files = "Classes/**/*.h" 79 | 80 | 81 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 82 | # 83 | # A list of resources included with the Pod. These are copied into the 84 | # target bundle with a build phase script. Anything else will be cleaned. 85 | # You can preserve files from being cleaned, please don't preserve 86 | # non-essential files like tests, examples and documentation. 87 | # 88 | 89 | # s.resource = "icon.png" 90 | # s.resources = "Resources/*.png" 91 | 92 | 93 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 94 | # 95 | # Link your library with frameworks, or libraries. Libraries do not include 96 | # the lib prefix of their name. 97 | # 98 | 99 | # s.framework = "SomeFramework" 100 | # s.frameworks = "SomeFramework", "AnotherFramework" 101 | 102 | # s.library = "iconv" 103 | # s.libraries = "iconv", "xml2" 104 | 105 | 106 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 107 | # 108 | # If your library depends on compiler flags you can set them in the xcconfig hash 109 | # where they will only apply to your library. If you depend on other Podspecs 110 | # you can include multiple dependencies to ensure it works. 111 | 112 | s.requires_arc = true 113 | 114 | # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } 115 | # s.dependency "JSONKit", "~> 1.4" 116 | 117 | end 118 | -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/xcuserdata/cwrichardkim93.xcuserdatad/xcschemes/RKCard.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /RKCard/RKCard/RKCardView.m: -------------------------------------------------------------------------------- 1 | // 2 | // RKCardView.m 3 | // RKCard 4 | // 5 | // Created by Richard Kim on 11/5/14. 6 | // Copyright (c) 2014 Richard Kim. All rights reserved. 7 | // 8 | 9 | /* 10 | 11 | Copyright (c) 2014 Choong-Won Richard Kim 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is furnished 18 | to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 | THE SOFTWARE. 30 | 31 | */ 32 | 33 | 34 | 35 | #import "RKCardView.h" 36 | 37 | // Responsive view ratio values 38 | #define CORNER_RATIO 0.015 39 | #define CP_RATIO 0.38 40 | #define PP_RATIO 0.247 41 | #define PP_X_RATIO 0.03 42 | #define PP_Y_RATIO 0.213 43 | #define PP_BUFF 3 44 | #define LABEL_Y_RATIO .012 45 | 46 | @implementation RKCardView { 47 | UIVisualEffectView *visualEffectView; 48 | } 49 | @synthesize delegate; 50 | @synthesize profileImageView; 51 | @synthesize coverImageView; 52 | @synthesize titleLabel; 53 | 54 | - (id)initWithFrame:(CGRect)frame 55 | { 56 | self = [super initWithFrame:frame]; 57 | if (self) { 58 | [self setupView]; 59 | } 60 | return self; 61 | } 62 | 63 | -(id)initWithCoder:(NSCoder *)aDecoder 64 | { 65 | self = [super initWithCoder:aDecoder]; 66 | if(self) { 67 | [self setupView]; 68 | } 69 | return self; 70 | } 71 | 72 | - (void)addShadow 73 | { 74 | self.layer.shadowOpacity = 0.15; 75 | } 76 | 77 | - (void)removeShadow 78 | { 79 | self.layer.shadowOpacity = 0; 80 | } 81 | 82 | -(void)setupView 83 | { 84 | self.backgroundColor = [UIColor whiteColor]; 85 | self.layer.cornerRadius = self.frame.size.width * CORNER_RATIO; 86 | self.layer.shadowRadius = 3; 87 | self.layer.shadowOpacity = 0; 88 | self.layer.shadowOffset = CGSizeMake(1, 1); 89 | [self setupPhotos]; 90 | } 91 | 92 | -(void)setupPhotos 93 | { 94 | CGFloat height = self.frame.size.height; 95 | CGFloat width = self.frame.size.width; 96 | UIView *cp_mask = [[UIView alloc]initWithFrame:CGRectMake(0, 0, width, height * CP_RATIO)]; 97 | UIView *pp_mask = [[UIView alloc]initWithFrame:CGRectMake(width * PP_X_RATIO, height * PP_Y_RATIO, height * PP_RATIO, height *PP_RATIO)]; 98 | UIView *pp_circle = [[UIView alloc]initWithFrame:CGRectMake(pp_mask.frame.origin.x - PP_BUFF, pp_mask.frame.origin.y - PP_BUFF, pp_mask.frame.size.width + 2* PP_BUFF, pp_mask.frame.size.height + 2*PP_BUFF)]; 99 | pp_circle.backgroundColor = [UIColor whiteColor]; 100 | pp_circle.layer.cornerRadius = pp_circle.frame.size.height/2; 101 | pp_mask.layer.cornerRadius = pp_mask.frame.size.height/2; 102 | cp_mask.backgroundColor = [UIColor colorWithRed:0.98 green:0.98 blue:0.98 alpha:1]; 103 | 104 | CGFloat cornerRadius = self.layer.cornerRadius; 105 | UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:cp_mask.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(cornerRadius, cornerRadius)]; 106 | CAShapeLayer *maskLayer = [CAShapeLayer layer]; 107 | maskLayer.frame = cp_mask.bounds; 108 | maskLayer.path = maskPath.CGPath; 109 | cp_mask.layer.mask = maskLayer; 110 | 111 | 112 | UIBlurEffect* blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 113 | visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 114 | 115 | visualEffectView.frame = cp_mask.frame; 116 | visualEffectView.alpha = 0; 117 | 118 | profileImageView = [[UIImageView alloc]init]; 119 | profileImageView.frame = CGRectMake(0, 0, pp_mask.frame.size.width, pp_mask.frame.size.height); 120 | coverImageView = [[UIImageView alloc]init]; 121 | coverImageView.frame = cp_mask.frame; 122 | [coverImageView setContentMode:UIViewContentModeScaleAspectFill]; 123 | 124 | [cp_mask addSubview:coverImageView]; 125 | [pp_mask addSubview:profileImageView]; 126 | cp_mask.clipsToBounds = YES; 127 | pp_mask.clipsToBounds = YES; 128 | 129 | // Setup the label 130 | CGFloat titleLabelX = pp_circle.frame.origin.x+pp_circle.frame.size.width; 131 | titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(titleLabelX, cp_mask.frame.size.height + 7, self.frame.size.width - titleLabelX, 26)]; 132 | titleLabel.adjustsFontSizeToFitWidth = NO; 133 | titleLabel.lineBreakMode = NSLineBreakByClipping; 134 | [titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:20]]; 135 | [titleLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.8]]; 136 | titleLabel.text = @"Title Label"; 137 | 138 | // Register touch events on the label 139 | titleLabel.userInteractionEnabled = YES; 140 | UITapGestureRecognizer *tapGesture = 141 | [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleLabelTap)]; 142 | [titleLabel addGestureRecognizer:tapGesture]; 143 | 144 | // Register touch events on the cover image 145 | coverImageView.userInteractionEnabled = YES; 146 | UITapGestureRecognizer *tapGestureCover = 147 | [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(coverPhotoTap)]; 148 | [coverImageView addGestureRecognizer:tapGestureCover]; 149 | 150 | // Register touch events on the profile imate 151 | profileImageView.userInteractionEnabled = YES; 152 | UITapGestureRecognizer *tapGestureProfile = 153 | [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(profilePhotoTap)]; 154 | [profileImageView addGestureRecognizer:tapGestureProfile]; 155 | 156 | // building upp the views 157 | [self addSubview:titleLabel]; 158 | [self addSubview:cp_mask]; 159 | [self addSubview:pp_circle]; 160 | [self addSubview:pp_mask]; 161 | [coverImageView addSubview:visualEffectView]; 162 | } 163 | 164 | -(void)titleLabelTap{ 165 | if (self.delegate != nil && [self.delegate respondsToSelector:@selector(nameTap)]) { 166 | [self.delegate nameTap]; 167 | } 168 | } 169 | 170 | -(void)coverPhotoTap{ 171 | if (self.delegate != nil && [self.delegate respondsToSelector:@selector(coverPhotoTap)]) { 172 | [self.delegate coverPhotoTap]; 173 | } 174 | } 175 | 176 | -(void)profilePhotoTap{ 177 | if (self.delegate != nil && [self.delegate respondsToSelector:@selector(profilePhotoTap)]) { 178 | [self.delegate profilePhotoTap]; 179 | } 180 | } 181 | 182 | 183 | -(void)addBlur 184 | { 185 | visualEffectView.alpha = 1; 186 | } 187 | 188 | -(void)removeBlur 189 | { 190 | visualEffectView.alpha = 0; 191 | } 192 | 193 | @end 194 | -------------------------------------------------------------------------------- /RKCard/RKCard.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 998810FE1A1BB522005045C3 /* RKCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 998810FD1A1BB522005045C3 /* RKCardView.swift */; }; 11 | 99B7F2611A0AAB4E00E8EC51 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B7F2601A0AAB4E00E8EC51 /* main.m */; }; 12 | 99B7F2641A0AAB4E00E8EC51 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B7F2631A0AAB4E00E8EC51 /* AppDelegate.m */; }; 13 | 99B7F2671A0AAB4E00E8EC51 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B7F2661A0AAB4E00E8EC51 /* ViewController.m */; }; 14 | 99B7F26A1A0AAB4E00E8EC51 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 99B7F2681A0AAB4E00E8EC51 /* Main.storyboard */; }; 15 | 99B7F26C1A0AAB4E00E8EC51 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 99B7F26B1A0AAB4E00E8EC51 /* Images.xcassets */; }; 16 | 99B7F26F1A0AAB4E00E8EC51 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 99B7F26D1A0AAB4E00E8EC51 /* LaunchScreen.xib */; }; 17 | 99B7F27B1A0AAB4E00E8EC51 /* RKCardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B7F27A1A0AAB4E00E8EC51 /* RKCardTests.m */; }; 18 | 99B7F2861A0AABC100E8EC51 /* RKCardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B7F2851A0AABC100E8EC51 /* RKCardView.m */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 99B7F2751A0AAB4E00E8EC51 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 99B7F2531A0AAB4D00E8EC51 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 99B7F25A1A0AAB4E00E8EC51; 27 | remoteInfo = RKCard; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 998810FC1A1BB521005045C3 /* RKCard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RKCard-Bridging-Header.h"; sourceTree = ""; }; 33 | 998810FD1A1BB522005045C3 /* RKCardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RKCardView.swift; sourceTree = ""; }; 34 | 99B7F25B1A0AAB4E00E8EC51 /* RKCard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RKCard.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 99B7F25F1A0AAB4E00E8EC51 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 99B7F2601A0AAB4E00E8EC51 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 37 | 99B7F2621A0AAB4E00E8EC51 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | 99B7F2631A0AAB4E00E8EC51 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | 99B7F2651A0AAB4E00E8EC51 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | 99B7F2661A0AAB4E00E8EC51 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | 99B7F2691A0AAB4E00E8EC51 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 99B7F26B1A0AAB4E00E8EC51 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 43 | 99B7F26E1A0AAB4E00E8EC51 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 44 | 99B7F2741A0AAB4E00E8EC51 /* RKCardTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RKCardTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 99B7F2791A0AAB4E00E8EC51 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | 99B7F27A1A0AAB4E00E8EC51 /* RKCardTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RKCardTests.m; sourceTree = ""; }; 47 | 99B7F2841A0AABC100E8EC51 /* RKCardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RKCardView.h; sourceTree = ""; }; 48 | 99B7F2851A0AABC100E8EC51 /* RKCardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RKCardView.m; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 99B7F2581A0AAB4E00E8EC51 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | 99B7F2711A0AAB4E00E8EC51 /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | ); 64 | runOnlyForDeploymentPostprocessing = 0; 65 | }; 66 | /* End PBXFrameworksBuildPhase section */ 67 | 68 | /* Begin PBXGroup section */ 69 | 998810FF1A1BB52A005045C3 /* Swift */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 998810FC1A1BB521005045C3 /* RKCard-Bridging-Header.h */, 73 | 998810FD1A1BB522005045C3 /* RKCardView.swift */, 74 | ); 75 | name = Swift; 76 | sourceTree = ""; 77 | }; 78 | 99B7F2521A0AAB4D00E8EC51 = { 79 | isa = PBXGroup; 80 | children = ( 81 | 99B7F25D1A0AAB4E00E8EC51 /* RKCard */, 82 | 99B7F2771A0AAB4E00E8EC51 /* RKCardTests */, 83 | 99B7F25C1A0AAB4E00E8EC51 /* Products */, 84 | ); 85 | sourceTree = ""; 86 | }; 87 | 99B7F25C1A0AAB4E00E8EC51 /* Products */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | 99B7F25B1A0AAB4E00E8EC51 /* RKCard.app */, 91 | 99B7F2741A0AAB4E00E8EC51 /* RKCardTests.xctest */, 92 | ); 93 | name = Products; 94 | sourceTree = ""; 95 | }; 96 | 99B7F25D1A0AAB4E00E8EC51 /* RKCard */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 99B7F2621A0AAB4E00E8EC51 /* AppDelegate.h */, 100 | 99B7F2631A0AAB4E00E8EC51 /* AppDelegate.m */, 101 | 99B7F2651A0AAB4E00E8EC51 /* ViewController.h */, 102 | 99B7F2661A0AAB4E00E8EC51 /* ViewController.m */, 103 | 99B7F2841A0AABC100E8EC51 /* RKCardView.h */, 104 | 99B7F2851A0AABC100E8EC51 /* RKCardView.m */, 105 | 998810FF1A1BB52A005045C3 /* Swift */, 106 | 99B7F2681A0AAB4E00E8EC51 /* Main.storyboard */, 107 | 99B7F26B1A0AAB4E00E8EC51 /* Images.xcassets */, 108 | 99B7F26D1A0AAB4E00E8EC51 /* LaunchScreen.xib */, 109 | 99B7F25E1A0AAB4E00E8EC51 /* Supporting Files */, 110 | ); 111 | path = RKCard; 112 | sourceTree = ""; 113 | }; 114 | 99B7F25E1A0AAB4E00E8EC51 /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 99B7F25F1A0AAB4E00E8EC51 /* Info.plist */, 118 | 99B7F2601A0AAB4E00E8EC51 /* main.m */, 119 | ); 120 | name = "Supporting Files"; 121 | sourceTree = ""; 122 | }; 123 | 99B7F2771A0AAB4E00E8EC51 /* RKCardTests */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 99B7F27A1A0AAB4E00E8EC51 /* RKCardTests.m */, 127 | 99B7F2781A0AAB4E00E8EC51 /* Supporting Files */, 128 | ); 129 | path = RKCardTests; 130 | sourceTree = ""; 131 | }; 132 | 99B7F2781A0AAB4E00E8EC51 /* Supporting Files */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 99B7F2791A0AAB4E00E8EC51 /* Info.plist */, 136 | ); 137 | name = "Supporting Files"; 138 | sourceTree = ""; 139 | }; 140 | /* End PBXGroup section */ 141 | 142 | /* Begin PBXNativeTarget section */ 143 | 99B7F25A1A0AAB4E00E8EC51 /* RKCard */ = { 144 | isa = PBXNativeTarget; 145 | buildConfigurationList = 99B7F27E1A0AAB4E00E8EC51 /* Build configuration list for PBXNativeTarget "RKCard" */; 146 | buildPhases = ( 147 | 99B7F2571A0AAB4E00E8EC51 /* Sources */, 148 | 99B7F2581A0AAB4E00E8EC51 /* Frameworks */, 149 | 99B7F2591A0AAB4E00E8EC51 /* Resources */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | ); 155 | name = RKCard; 156 | productName = RKCard; 157 | productReference = 99B7F25B1A0AAB4E00E8EC51 /* RKCard.app */; 158 | productType = "com.apple.product-type.application"; 159 | }; 160 | 99B7F2731A0AAB4E00E8EC51 /* RKCardTests */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = 99B7F2811A0AAB4E00E8EC51 /* Build configuration list for PBXNativeTarget "RKCardTests" */; 163 | buildPhases = ( 164 | 99B7F2701A0AAB4E00E8EC51 /* Sources */, 165 | 99B7F2711A0AAB4E00E8EC51 /* Frameworks */, 166 | 99B7F2721A0AAB4E00E8EC51 /* Resources */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | 99B7F2761A0AAB4E00E8EC51 /* PBXTargetDependency */, 172 | ); 173 | name = RKCardTests; 174 | productName = RKCardTests; 175 | productReference = 99B7F2741A0AAB4E00E8EC51 /* RKCardTests.xctest */; 176 | productType = "com.apple.product-type.bundle.unit-test"; 177 | }; 178 | /* End PBXNativeTarget section */ 179 | 180 | /* Begin PBXProject section */ 181 | 99B7F2531A0AAB4D00E8EC51 /* Project object */ = { 182 | isa = PBXProject; 183 | attributes = { 184 | LastUpgradeCheck = 0610; 185 | ORGANIZATIONNAME = "Richard Kim"; 186 | TargetAttributes = { 187 | 99B7F25A1A0AAB4E00E8EC51 = { 188 | CreatedOnToolsVersion = 6.1; 189 | }; 190 | 99B7F2731A0AAB4E00E8EC51 = { 191 | CreatedOnToolsVersion = 6.1; 192 | TestTargetID = 99B7F25A1A0AAB4E00E8EC51; 193 | }; 194 | }; 195 | }; 196 | buildConfigurationList = 99B7F2561A0AAB4D00E8EC51 /* Build configuration list for PBXProject "RKCard" */; 197 | compatibilityVersion = "Xcode 3.2"; 198 | developmentRegion = English; 199 | hasScannedForEncodings = 0; 200 | knownRegions = ( 201 | en, 202 | Base, 203 | ); 204 | mainGroup = 99B7F2521A0AAB4D00E8EC51; 205 | productRefGroup = 99B7F25C1A0AAB4E00E8EC51 /* Products */; 206 | projectDirPath = ""; 207 | projectRoot = ""; 208 | targets = ( 209 | 99B7F25A1A0AAB4E00E8EC51 /* RKCard */, 210 | 99B7F2731A0AAB4E00E8EC51 /* RKCardTests */, 211 | ); 212 | }; 213 | /* End PBXProject section */ 214 | 215 | /* Begin PBXResourcesBuildPhase section */ 216 | 99B7F2591A0AAB4E00E8EC51 /* Resources */ = { 217 | isa = PBXResourcesBuildPhase; 218 | buildActionMask = 2147483647; 219 | files = ( 220 | 99B7F26A1A0AAB4E00E8EC51 /* Main.storyboard in Resources */, 221 | 99B7F26F1A0AAB4E00E8EC51 /* LaunchScreen.xib in Resources */, 222 | 99B7F26C1A0AAB4E00E8EC51 /* Images.xcassets in Resources */, 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | }; 226 | 99B7F2721A0AAB4E00E8EC51 /* Resources */ = { 227 | isa = PBXResourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXResourcesBuildPhase section */ 234 | 235 | /* Begin PBXSourcesBuildPhase section */ 236 | 99B7F2571A0AAB4E00E8EC51 /* Sources */ = { 237 | isa = PBXSourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | 99B7F2671A0AAB4E00E8EC51 /* ViewController.m in Sources */, 241 | 99B7F2861A0AABC100E8EC51 /* RKCardView.m in Sources */, 242 | 99B7F2641A0AAB4E00E8EC51 /* AppDelegate.m in Sources */, 243 | 998810FE1A1BB522005045C3 /* RKCardView.swift in Sources */, 244 | 99B7F2611A0AAB4E00E8EC51 /* main.m in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | 99B7F2701A0AAB4E00E8EC51 /* Sources */ = { 249 | isa = PBXSourcesBuildPhase; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | 99B7F27B1A0AAB4E00E8EC51 /* RKCardTests.m in Sources */, 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | /* End PBXSourcesBuildPhase section */ 257 | 258 | /* Begin PBXTargetDependency section */ 259 | 99B7F2761A0AAB4E00E8EC51 /* PBXTargetDependency */ = { 260 | isa = PBXTargetDependency; 261 | target = 99B7F25A1A0AAB4E00E8EC51 /* RKCard */; 262 | targetProxy = 99B7F2751A0AAB4E00E8EC51 /* PBXContainerItemProxy */; 263 | }; 264 | /* End PBXTargetDependency section */ 265 | 266 | /* Begin PBXVariantGroup section */ 267 | 99B7F2681A0AAB4E00E8EC51 /* Main.storyboard */ = { 268 | isa = PBXVariantGroup; 269 | children = ( 270 | 99B7F2691A0AAB4E00E8EC51 /* Base */, 271 | ); 272 | name = Main.storyboard; 273 | sourceTree = ""; 274 | }; 275 | 99B7F26D1A0AAB4E00E8EC51 /* LaunchScreen.xib */ = { 276 | isa = PBXVariantGroup; 277 | children = ( 278 | 99B7F26E1A0AAB4E00E8EC51 /* Base */, 279 | ); 280 | name = LaunchScreen.xib; 281 | sourceTree = ""; 282 | }; 283 | /* End PBXVariantGroup section */ 284 | 285 | /* Begin XCBuildConfiguration section */ 286 | 99B7F27C1A0AAB4E00E8EC51 /* Debug */ = { 287 | isa = XCBuildConfiguration; 288 | buildSettings = { 289 | ALWAYS_SEARCH_USER_PATHS = NO; 290 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 291 | CLANG_CXX_LIBRARY = "libc++"; 292 | CLANG_ENABLE_MODULES = YES; 293 | CLANG_ENABLE_OBJC_ARC = YES; 294 | CLANG_WARN_BOOL_CONVERSION = YES; 295 | CLANG_WARN_CONSTANT_CONVERSION = YES; 296 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 297 | CLANG_WARN_EMPTY_BODY = YES; 298 | CLANG_WARN_ENUM_CONVERSION = YES; 299 | CLANG_WARN_INT_CONVERSION = YES; 300 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 301 | CLANG_WARN_UNREACHABLE_CODE = YES; 302 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 303 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 304 | COPY_PHASE_STRIP = NO; 305 | ENABLE_STRICT_OBJC_MSGSEND = YES; 306 | GCC_C_LANGUAGE_STANDARD = gnu99; 307 | GCC_DYNAMIC_NO_PIC = NO; 308 | GCC_OPTIMIZATION_LEVEL = 0; 309 | GCC_PREPROCESSOR_DEFINITIONS = ( 310 | "DEBUG=1", 311 | "$(inherited)", 312 | ); 313 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 314 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 315 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 316 | GCC_WARN_UNDECLARED_SELECTOR = YES; 317 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 318 | GCC_WARN_UNUSED_FUNCTION = YES; 319 | GCC_WARN_UNUSED_VARIABLE = YES; 320 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 321 | MTL_ENABLE_DEBUG_INFO = YES; 322 | ONLY_ACTIVE_ARCH = YES; 323 | SDKROOT = iphoneos; 324 | }; 325 | name = Debug; 326 | }; 327 | 99B7F27D1A0AAB4E00E8EC51 /* Release */ = { 328 | isa = XCBuildConfiguration; 329 | buildSettings = { 330 | ALWAYS_SEARCH_USER_PATHS = NO; 331 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 332 | CLANG_CXX_LIBRARY = "libc++"; 333 | CLANG_ENABLE_MODULES = YES; 334 | CLANG_ENABLE_OBJC_ARC = YES; 335 | CLANG_WARN_BOOL_CONVERSION = YES; 336 | CLANG_WARN_CONSTANT_CONVERSION = YES; 337 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 338 | CLANG_WARN_EMPTY_BODY = YES; 339 | CLANG_WARN_ENUM_CONVERSION = YES; 340 | CLANG_WARN_INT_CONVERSION = YES; 341 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 342 | CLANG_WARN_UNREACHABLE_CODE = YES; 343 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 344 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 345 | COPY_PHASE_STRIP = YES; 346 | ENABLE_NS_ASSERTIONS = NO; 347 | ENABLE_STRICT_OBJC_MSGSEND = YES; 348 | GCC_C_LANGUAGE_STANDARD = gnu99; 349 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 350 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 351 | GCC_WARN_UNDECLARED_SELECTOR = YES; 352 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 353 | GCC_WARN_UNUSED_FUNCTION = YES; 354 | GCC_WARN_UNUSED_VARIABLE = YES; 355 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 356 | MTL_ENABLE_DEBUG_INFO = NO; 357 | SDKROOT = iphoneos; 358 | VALIDATE_PRODUCT = YES; 359 | }; 360 | name = Release; 361 | }; 362 | 99B7F27F1A0AAB4E00E8EC51 /* Debug */ = { 363 | isa = XCBuildConfiguration; 364 | buildSettings = { 365 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 366 | CLANG_ENABLE_MODULES = YES; 367 | INFOPLIST_FILE = RKCard/Info.plist; 368 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 369 | PRODUCT_NAME = "$(TARGET_NAME)"; 370 | SWIFT_OBJC_BRIDGING_HEADER = "RKCard/RKCard-Bridging-Header.h"; 371 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 372 | }; 373 | name = Debug; 374 | }; 375 | 99B7F2801A0AAB4E00E8EC51 /* Release */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 379 | CLANG_ENABLE_MODULES = YES; 380 | INFOPLIST_FILE = RKCard/Info.plist; 381 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 382 | PRODUCT_NAME = "$(TARGET_NAME)"; 383 | SWIFT_OBJC_BRIDGING_HEADER = "RKCard/RKCard-Bridging-Header.h"; 384 | }; 385 | name = Release; 386 | }; 387 | 99B7F2821A0AAB4E00E8EC51 /* Debug */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | BUNDLE_LOADER = "$(TEST_HOST)"; 391 | FRAMEWORK_SEARCH_PATHS = ( 392 | "$(SDKROOT)/Developer/Library/Frameworks", 393 | "$(inherited)", 394 | ); 395 | GCC_PREPROCESSOR_DEFINITIONS = ( 396 | "DEBUG=1", 397 | "$(inherited)", 398 | ); 399 | INFOPLIST_FILE = RKCardTests/Info.plist; 400 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 401 | PRODUCT_NAME = "$(TARGET_NAME)"; 402 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RKCard.app/RKCard"; 403 | }; 404 | name = Debug; 405 | }; 406 | 99B7F2831A0AAB4E00E8EC51 /* Release */ = { 407 | isa = XCBuildConfiguration; 408 | buildSettings = { 409 | BUNDLE_LOADER = "$(TEST_HOST)"; 410 | FRAMEWORK_SEARCH_PATHS = ( 411 | "$(SDKROOT)/Developer/Library/Frameworks", 412 | "$(inherited)", 413 | ); 414 | INFOPLIST_FILE = RKCardTests/Info.plist; 415 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 416 | PRODUCT_NAME = "$(TARGET_NAME)"; 417 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RKCard.app/RKCard"; 418 | }; 419 | name = Release; 420 | }; 421 | /* End XCBuildConfiguration section */ 422 | 423 | /* Begin XCConfigurationList section */ 424 | 99B7F2561A0AAB4D00E8EC51 /* Build configuration list for PBXProject "RKCard" */ = { 425 | isa = XCConfigurationList; 426 | buildConfigurations = ( 427 | 99B7F27C1A0AAB4E00E8EC51 /* Debug */, 428 | 99B7F27D1A0AAB4E00E8EC51 /* Release */, 429 | ); 430 | defaultConfigurationIsVisible = 0; 431 | defaultConfigurationName = Release; 432 | }; 433 | 99B7F27E1A0AAB4E00E8EC51 /* Build configuration list for PBXNativeTarget "RKCard" */ = { 434 | isa = XCConfigurationList; 435 | buildConfigurations = ( 436 | 99B7F27F1A0AAB4E00E8EC51 /* Debug */, 437 | 99B7F2801A0AAB4E00E8EC51 /* Release */, 438 | ); 439 | defaultConfigurationIsVisible = 0; 440 | defaultConfigurationName = Release; 441 | }; 442 | 99B7F2811A0AAB4E00E8EC51 /* Build configuration list for PBXNativeTarget "RKCardTests" */ = { 443 | isa = XCConfigurationList; 444 | buildConfigurations = ( 445 | 99B7F2821A0AAB4E00E8EC51 /* Debug */, 446 | 99B7F2831A0AAB4E00E8EC51 /* Release */, 447 | ); 448 | defaultConfigurationIsVisible = 0; 449 | defaultConfigurationName = Release; 450 | }; 451 | /* End XCConfigurationList section */ 452 | }; 453 | rootObject = 99B7F2531A0AAB4D00E8EC51 /* Project object */; 454 | } 455 | --------------------------------------------------------------------------------