├── CoreNewFeatureVC ├── Images.xcassets │ ├── NewFeature │ │ ├── f1.imageset │ │ │ ├── f1@2x.png │ │ │ └── Contents.json │ │ ├── f2.imageset │ │ │ ├── f2@2x.png │ │ │ └── Contents.json │ │ └── f3.imageset │ │ │ ├── f3@2x.png │ │ │ └── Contents.json │ ├── LaunchImage.launchimage │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── CoreNewFeatureVC │ ├── View │ │ ├── NewFeatureImageV.h │ │ ├── NewFeatureScrollView.h │ │ ├── NewFeatureImageV.m │ │ └── NewFeatureScrollView.m │ ├── Category │ │ ├── UIView+NFLayout.h │ │ ├── UIApplication │ │ │ ├── UIApplication+Extend.h │ │ │ └── UIApplication+Extend.m │ │ └── UIView+NFLayout.m │ ├── Model │ │ ├── NewFeatureModel.h │ │ └── NewFeatureModel.m │ ├── CoreNewFeatureVC.h │ └── CoreNewFeatureVC.m ├── AppDelegate.h ├── main.m ├── Info.plist ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib └── AppDelegate.m ├── CoreNewFeatureVC.xcodeproj ├── xcuserdata │ └── Charlin.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── CoreNewFeatureVC.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── Charlin.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── CoreNewFeatureVC.xccheckout └── project.pbxproj ├── CoreNewFeatureVCTests ├── Info.plist └── CoreNewFeatureVCTests.m └── README.md /CoreNewFeatureVC/Images.xcassets/NewFeature/f1.imageset/f1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreNewFeatureVC/HEAD/CoreNewFeatureVC/Images.xcassets/NewFeature/f1.imageset/f1@2x.png -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/NewFeature/f2.imageset/f2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreNewFeatureVC/HEAD/CoreNewFeatureVC/Images.xcassets/NewFeature/f2.imageset/f2@2x.png -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/NewFeature/f3.imageset/f3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreNewFeatureVC/HEAD/CoreNewFeatureVC/Images.xcassets/NewFeature/f3.imageset/f3@2x.png -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreNewFeatureVC/HEAD/CoreNewFeatureVC.xcodeproj/project.xcworkspace/xcuserdata/Charlin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/View/NewFeatureImageV.h: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureImageV.h 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NewFeatureImageV : UIImageView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/View/NewFeatureScrollView.h: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureScrollView.h 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NewFeatureScrollView : UIScrollView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/View/NewFeatureImageV.m: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureImageV.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "NewFeatureImageV.h" 10 | 11 | @implementation NewFeatureImageV 12 | 13 | 14 | 15 | 16 | 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Category/UIView+NFLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CoreListLayout.h 3 | // CoreList 4 | // 5 | // Created by 冯成林 on 15/11/28. 6 | // Copyright © 2015年 muxi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIView (NFLayout) 12 | 13 | -(void)autoLayoutFillSuperView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. 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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. 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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Category/UIApplication/UIApplication+Extend.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIApplication+Extend.h 3 | // Carpenter 4 | // 5 | // Created by 冯成林 on 15/4/24. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIApplication (Extend) 12 | 13 | 14 | /* 15 | * 当前程序的版本号 16 | */ 17 | @property (nonatomic,copy,readonly) NSString *version; 18 | 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/NewFeature/f1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x", 10 | "filename" : "f1@2x.png" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/NewFeature/f2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x", 10 | "filename" : "f2@2x.png" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/NewFeature/f3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x", 10 | "filename" : "f3@2x.png" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Model/NewFeatureModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureModel.h 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface NewFeatureModel : NSObject 13 | 14 | @property (nonatomic,strong) UIImage *image; 15 | 16 | 17 | /* 18 | * 初始化 19 | */ 20 | +(instancetype)model:(UIImage *)image; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "minimum-system-version" : "7.0", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "orientation" : "portrait", 11 | "idiom" : "iphone", 12 | "minimum-system-version" : "7.0", 13 | "subtype" : "retina4", 14 | "scale" : "2x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Model/NewFeatureModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureModel.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "NewFeatureModel.h" 10 | 11 | @implementation NewFeatureModel 12 | 13 | /* 14 | * 初始化 15 | */ 16 | +(instancetype)model:(UIImage *)image{ 17 | 18 | NewFeatureModel *model = [[NewFeatureModel alloc] init]; 19 | 20 | model.image = image; 21 | 22 | return model; 23 | } 24 | 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Category/UIApplication/UIApplication+Extend.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIApplication+Extend.m 3 | // Carpenter 4 | // 5 | // Created by 冯成林 on 15/4/24. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "UIApplication+Extend.h" 10 | 11 | @implementation UIApplication (Extend) 12 | 13 | 14 | /* 15 | * 当前程序的版本号 16 | */ 17 | -(NSString *)version{ 18 | 19 | //系统直接读取的版本号 20 | NSString *versionValueStringForSystemNow=[[NSBundle mainBundle].infoDictionary valueForKey:(NSString *)kCFBundleVersionKey]; 21 | 22 | return versionValueStringForSystemNow; 23 | } 24 | 25 | 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/CoreNewFeatureVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreNewFeatureVC.h 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "NewFeatureModel.h" 11 | 12 | 13 | @interface CoreNewFeatureVC : UIViewController 14 | 15 | @property (nonatomic,strong) NSArray *images; 16 | 17 | 18 | 19 | /* 20 | * 初始化 21 | */ 22 | +(instancetype)newFeatureVCWithModels:(NSArray *)models enterBlock:(void(^)())enterBlock; 23 | 24 | 25 | 26 | /* 27 | * 是否应该显示版本新特性界面 28 | */ 29 | +(BOOL)canShowNewFeature; 30 | 31 | 32 | 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreNewFeatureVC.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 89335F5E1AEDFEE800BC444B 16 | 17 | primary 18 | 19 | 20 | 89335F771AEDFEE800BC444B 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/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 | } -------------------------------------------------------------------------------- /CoreNewFeatureVCTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | HM.$(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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/Category/UIView+NFLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CoreListLayout.m 3 | // CoreList 4 | // 5 | // Created by 冯成林 on 15/11/28. 6 | // Copyright © 2015年 muxi. All rights reserved. 7 | // 8 | 9 | #import "UIView+NFLayout.h" 10 | 11 | @implementation UIView (NFLayout) 12 | 13 | -(void)autoLayoutFillSuperView { 14 | 15 | if(self.superview == nil) {return;} 16 | 17 | self.translatesAutoresizingMaskIntoConstraints = NO; 18 | 19 | NSDictionary *views = @{@"v":self}; 20 | 21 | NSArray *v_ver = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[v]-0-|" options:0 metrics:nil views:views]; 22 | NSArray *v_hor = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[v]-0-|" options:0 metrics:nil views:views]; 23 | [self.superview addConstraints:v_ver];[self.superview addConstraints:v_hor]; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 快速集成版本新特性 2 | 3 | 4 |

5 | ####框架特性:
6 | >1.封装并简化了版本新特性启动视图!
7 | >2.添加了版本的本地缓存功能
8 | >3.集成简单,使用方便,没有耦合度
9 | >4.支持block回调。
10 | 11 |

12 | ####重要代码:
13 | //判断是否需要显示:(内部已经考虑版本及本地版本缓存) 14 | BOOL canShow = [CoreNewFeatureVC canShowNewFeature]; 15 | 16 | //测试代码,正式版本应该删除 17 | canShow = YES; 18 | 19 | if(canShow){ 20 | 21 | NewFeatureModel *m1 = [NewFeatureModel model:[UIImage imageNamed:@"f1"]]; 22 | 23 | NewFeatureModel *m2 = [NewFeatureModel model:[UIImage imageNamed:@"f2"]]; 24 | 25 | NewFeatureModel *m3 = [NewFeatureModel model:[UIImage imageNamed:@"f3"]]; 26 | 27 | window.rootViewController = [CoreNewFeatureVC newFeatureVCWithModels:@[m1,m2,m3] enterBlock:^{ 28 | NSLog(@"结束回调"); 29 | }]; 30 | }else{ 31 | UIViewController *vc = [[UIViewController alloc] init]; 32 | vc.view.backgroundColor = [UIColor brownColor]; 33 | window.rootViewController = vc; 34 | } 35 | 36 | -------------------------------------------------------------------------------- /CoreNewFeatureVCTests/CoreNewFeatureVCTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreNewFeatureVCTests.m 3 | // CoreNewFeatureVCTests 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreNewFeatureVCTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation CoreNewFeatureVCTests 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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | HM.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/project.xcworkspace/xcshareddata/CoreNewFeatureVC.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 6275D3BA-72A1-4845-96A7-7A5BF2B72B27 9 | IDESourceControlProjectName 10 | CoreNewFeatureVC 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | ACED2D41D1663676B7F2736D85A52220429D5605 14 | https://github.com/nsdictionary/CoreNewFeatureVC.git 15 | 16 | IDESourceControlProjectPath 17 | CoreNewFeatureVC.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | ACED2D41D1663676B7F2736D85A52220429D5605 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/nsdictionary/CoreNewFeatureVC.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | ACED2D41D1663676B7F2736D85A52220429D5605 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | ACED2D41D1663676B7F2736D85A52220429D5605 36 | IDESourceControlWCCName 37 | CoreNewFeatureVC 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/View/NewFeatureScrollView.m: -------------------------------------------------------------------------------- 1 | // 2 | // NewFeatureScrollView.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "NewFeatureScrollView.h" 10 | #import "NewFeatureImageV.h" 11 | 12 | @implementation NewFeatureScrollView 13 | 14 | 15 | -(instancetype)initWithFrame:(CGRect)frame{ 16 | 17 | self = [super initWithFrame:frame]; 18 | 19 | if(self){ 20 | 21 | //视图准备 22 | [self viewPrepare]; 23 | } 24 | 25 | return self; 26 | } 27 | 28 | 29 | -(id)initWithCoder:(NSCoder *)aDecoder{ 30 | 31 | self=[super initWithCoder:aDecoder]; 32 | 33 | if(self){ 34 | 35 | //视图准备 36 | [self viewPrepare]; 37 | } 38 | 39 | return self; 40 | } 41 | 42 | 43 | 44 | /* 45 | * 视图准备 46 | */ 47 | -(void)viewPrepare{ 48 | 49 | //开启分页 50 | self.pagingEnabled = YES; 51 | 52 | //隐藏各种条 53 | self.showsHorizontalScrollIndicator = NO; 54 | self.showsVerticalScrollIndicator = NO; 55 | 56 | //取消boundce 57 | self.bounces = NO; 58 | } 59 | 60 | 61 | 62 | 63 | -(void)layoutSubviews{ 64 | 65 | [super layoutSubviews]; 66 | 67 | __block CGRect frame = self.bounds; 68 | 69 | __block NSUInteger count = 0; 70 | 71 | [self.subviews enumerateObjectsUsingBlock:^(UIView *subView, NSUInteger idx, BOOL *stop) { 72 | 73 | if([subView isKindOfClass:[NewFeatureImageV class]]){ 74 | 75 | CGFloat frameX = frame.size.width * idx; 76 | 77 | frame.origin.x = frameX; 78 | 79 | subView.frame = frame; 80 | 81 | count ++; 82 | } 83 | }]; 84 | 85 | self.contentSize = CGSizeMake(frame.size.width * count, 0); 86 | } 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | @end 96 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | 10 | #import "AppDelegate.h" 11 | #import "CoreNewFeatureVC.h" 12 | 13 | 14 | @interface AppDelegate () 15 | 16 | @end 17 | 18 | @implementation AppDelegate 19 | 20 | 21 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 22 | 23 | UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 24 | 25 | self.window = window; 26 | 27 | //判断是否需要显示:(内部已经考虑版本及本地版本缓存) 28 | BOOL canShow = [CoreNewFeatureVC canShowNewFeature]; 29 | 30 | //测试代码,正式版本应该删除 31 | canShow = YES; 32 | 33 | if(canShow){ 34 | 35 | NewFeatureModel *m1 = [NewFeatureModel model:[UIImage imageNamed:@"f1"]]; 36 | 37 | NewFeatureModel *m2 = [NewFeatureModel model:[UIImage imageNamed:@"f2"]]; 38 | 39 | NewFeatureModel *m3 = [NewFeatureModel model:[UIImage imageNamed:@"f3"]]; 40 | 41 | window.rootViewController = [CoreNewFeatureVC newFeatureVCWithModels:@[m1,m2,m3] enterBlock:^{ 42 | 43 | NSLog(@"进入主页面"); 44 | [self enter]; 45 | }]; 46 | }else{ 47 | 48 | [self enter]; 49 | } 50 | 51 | 52 | 53 | [window makeKeyAndVisible]; 54 | 55 | return YES; 56 | } 57 | 58 | 59 | -(void)enter{ 60 | UIViewController *vc = [[UIViewController alloc] init]; 61 | vc.view.backgroundColor = [UIColor brownColor]; 62 | self.window.rootViewController = vc; 63 | } 64 | 65 | 66 | 67 | - (void)applicationWillResignActive:(UIApplication *)application { 68 | // 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. 69 | // 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. 70 | } 71 | 72 | - (void)applicationDidEnterBackground:(UIApplication *)application { 73 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 74 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 75 | } 76 | 77 | - (void)applicationWillEnterForeground:(UIApplication *)application { 78 | // 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. 79 | } 80 | 81 | - (void)applicationDidBecomeActive:(UIApplication *)application { 82 | // 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. 83 | } 84 | 85 | - (void)applicationWillTerminate:(UIApplication *)application { 86 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 87 | } 88 | 89 | @end 90 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/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 | -------------------------------------------------------------------------------- /CoreNewFeatureVC/CoreNewFeatureVC/CoreNewFeatureVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreNewFeatureVC.m 3 | // CoreNewFeatureVC 4 | // 5 | // Created by 冯成林 on 15/4/27. 6 | // Copyright (c) 2015年 冯成林. All rights reserved. 7 | // 8 | 9 | #import "CoreNewFeatureVC.h" 10 | #import "NewFeatureScrollView.h" 11 | #import "NewFeatureImageV.h" 12 | #import "UIApplication+Extend.h" 13 | #import "UIView+NFLayout.h" 14 | 15 | 16 | NSString *const NewFeatureVersionKey = @"NewFeatureVersionKey"; 17 | 18 | @interface CoreNewFeatureVC () 19 | 20 | 21 | /** 模型数组 */ 22 | @property (nonatomic,strong) NSArray *models; 23 | 24 | /** scrollView */ 25 | @property (nonatomic,weak) NewFeatureScrollView *scrollView; 26 | 27 | @property (nonatomic,copy) void(^enterBlock)(); 28 | 29 | @end 30 | 31 | @implementation CoreNewFeatureVC 32 | 33 | /* 34 | * 初始化 35 | */ 36 | +(instancetype)newFeatureVCWithModels:(NSArray *)models enterBlock:(void(^)())enterBlock{ 37 | 38 | CoreNewFeatureVC *newFeatureVC = [[CoreNewFeatureVC alloc] init]; 39 | 40 | newFeatureVC.models = models; 41 | 42 | //记录block 43 | newFeatureVC.enterBlock =enterBlock; 44 | 45 | return newFeatureVC; 46 | } 47 | 48 | 49 | -(void)viewDidLoad{ 50 | 51 | [super viewDidLoad]; 52 | 53 | //控制器准备 54 | [self vcPrepare]; 55 | 56 | //显示了版本新特性,保存版本号 57 | [self saveVersion]; 58 | } 59 | 60 | 61 | /* 62 | * 显示了版本新特性,保存版本号 63 | */ 64 | -(void)saveVersion{ 65 | 66 | //系统直接读取的版本号 67 | NSString *versionValueStringForSystemNow=[UIApplication sharedApplication].version; 68 | 69 | //保存版本号 70 | [[NSUserDefaults standardUserDefaults] setObject:versionValueStringForSystemNow forKey:NewFeatureVersionKey]; 71 | } 72 | 73 | 74 | 75 | /* 76 | * 控制器准备 77 | */ 78 | -(void)vcPrepare{ 79 | 80 | //添加scrollView 81 | NewFeatureScrollView *scrollView = [[NewFeatureScrollView alloc] init]; 82 | 83 | _scrollView = scrollView; 84 | 85 | //添加 86 | [self.view addSubview:scrollView]; 87 | 88 | //添加约束 89 | [scrollView autoLayoutFillSuperView]; 90 | 91 | //添加图片 92 | [self imageViewsPrepare]; 93 | } 94 | 95 | 96 | 97 | 98 | /* 99 | * 添加图片 100 | */ 101 | -(void)imageViewsPrepare{ 102 | 103 | [self.models enumerateObjectsUsingBlock:^(NewFeatureModel *model, NSUInteger idx, BOOL *stop) { 104 | 105 | NewFeatureImageV *imageV = [[NewFeatureImageV alloc] init]; 106 | 107 | //设置图片 108 | imageV.image = model.image; 109 | 110 | //记录tag 111 | imageV.tag = idx; 112 | 113 | if(idx == self.models.count -1) { 114 | 115 | //开启交互 116 | imageV.userInteractionEnabled = YES; 117 | 118 | //添加手势 119 | [imageV addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)]]; 120 | 121 | UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)]; 122 | sgr.direction = UISwipeGestureRecognizerDirectionLeft; 123 | sgr.numberOfTouchesRequired = 1; 124 | [imageV addGestureRecognizer:sgr]; 125 | 126 | } 127 | 128 | [_scrollView addSubview:imageV]; 129 | }]; 130 | } 131 | 132 | 133 | 134 | -(void)gestureAction:(UITapGestureRecognizer *)tap{ 135 | 136 | UIView *tapView = tap.view; 137 | 138 | //禁用 139 | tapView.userInteractionEnabled = NO; 140 | 141 | if(UIGestureRecognizerStateEnded == tap.state) [self dismiss]; 142 | } 143 | 144 | -(void)dismiss{ 145 | 146 | if(self.enterBlock != nil) _enterBlock(); 147 | } 148 | 149 | /* 150 | * 是否应该显示版本新特性页面 151 | */ 152 | +(BOOL)canShowNewFeature{ 153 | 154 | //系统直接读取的版本号 155 | NSString *versionValueStringForSystemNow=[UIApplication sharedApplication].version; 156 | 157 | //读取本地版本号 158 | NSString *versionLocal = [[NSUserDefaults standardUserDefaults] objectForKey:NewFeatureVersionKey]; 159 | 160 | if(versionLocal!=nil && [versionValueStringForSystemNow isEqualToString:versionLocal]){//说明有本地版本记录,且和当前系统版本一致 161 | 162 | return NO; 163 | 164 | }else{//无本地版本记录或本地版本记录与当前系统版本不一致 165 | 166 | //保存 167 | [[NSUserDefaults standardUserDefaults] setObject:versionValueStringForSystemNow forKey:NewFeatureVersionKey]; 168 | 169 | return YES; 170 | } 171 | } 172 | @end 173 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/xcuserdata/Charlin.xcuserdatad/xcschemes/CoreNewFeatureVC.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 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /CoreNewFeatureVC.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 892BCE871C0C5145008F84A3 /* UIView+NFLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 892BCE861C0C5145008F84A3 /* UIView+NFLayout.m */; }; 11 | 89335F651AEDFEE800BC444B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335F641AEDFEE800BC444B /* main.m */; }; 12 | 89335F681AEDFEE800BC444B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335F671AEDFEE800BC444B /* AppDelegate.m */; }; 13 | 89335F6E1AEDFEE800BC444B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 89335F6C1AEDFEE800BC444B /* Main.storyboard */; }; 14 | 89335F701AEDFEE800BC444B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 89335F6F1AEDFEE800BC444B /* Images.xcassets */; }; 15 | 89335F731AEDFEE800BC444B /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89335F711AEDFEE800BC444B /* LaunchScreen.xib */; }; 16 | 89335F7F1AEDFEE800BC444B /* CoreNewFeatureVCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335F7E1AEDFEE800BC444B /* CoreNewFeatureVCTests.m */; }; 17 | 89335F8E1AEDFF5300BC444B /* CoreNewFeatureVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335F8D1AEDFF5300BC444B /* CoreNewFeatureVC.m */; }; 18 | 89335F911AEDFF8000BC444B /* NewFeatureModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335F901AEDFF8000BC444B /* NewFeatureModel.m */; }; 19 | 89335FBD1AEE022C00BC444B /* NewFeatureScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335FBC1AEE022C00BC444B /* NewFeatureScrollView.m */; }; 20 | 89335FC01AEE057C00BC444B /* NewFeatureImageV.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335FBF1AEE057C00BC444B /* NewFeatureImageV.m */; }; 21 | 89335FC51AEE0AD200BC444B /* UIApplication+Extend.m in Sources */ = {isa = PBXBuildFile; fileRef = 89335FC41AEE0AD200BC444B /* UIApplication+Extend.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | 89335F791AEDFEE800BC444B /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = 89335F571AEDFEE800BC444B /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = 89335F5E1AEDFEE800BC444B; 30 | remoteInfo = CoreNewFeatureVC; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | 892BCE851C0C5145008F84A3 /* UIView+NFLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+NFLayout.h"; sourceTree = ""; }; 36 | 892BCE861C0C5145008F84A3 /* UIView+NFLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+NFLayout.m"; sourceTree = ""; }; 37 | 89335F5F1AEDFEE800BC444B /* CoreNewFeatureVC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CoreNewFeatureVC.app; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 89335F631AEDFEE800BC444B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 89335F641AEDFEE800BC444B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 40 | 89335F661AEDFEE800BC444B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 41 | 89335F671AEDFEE800BC444B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 42 | 89335F6D1AEDFEE800BC444B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 43 | 89335F6F1AEDFEE800BC444B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 44 | 89335F721AEDFEE800BC444B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 45 | 89335F781AEDFEE800BC444B /* CoreNewFeatureVCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoreNewFeatureVCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 89335F7D1AEDFEE800BC444B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 89335F7E1AEDFEE800BC444B /* CoreNewFeatureVCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoreNewFeatureVCTests.m; sourceTree = ""; }; 48 | 89335F8C1AEDFF5300BC444B /* CoreNewFeatureVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreNewFeatureVC.h; sourceTree = ""; }; 49 | 89335F8D1AEDFF5300BC444B /* CoreNewFeatureVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreNewFeatureVC.m; sourceTree = ""; }; 50 | 89335F8F1AEDFF8000BC444B /* NewFeatureModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFeatureModel.h; sourceTree = ""; }; 51 | 89335F901AEDFF8000BC444B /* NewFeatureModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewFeatureModel.m; sourceTree = ""; }; 52 | 89335FBB1AEE022C00BC444B /* NewFeatureScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFeatureScrollView.h; sourceTree = ""; }; 53 | 89335FBC1AEE022C00BC444B /* NewFeatureScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewFeatureScrollView.m; sourceTree = ""; }; 54 | 89335FBE1AEE057C00BC444B /* NewFeatureImageV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFeatureImageV.h; sourceTree = ""; }; 55 | 89335FBF1AEE057C00BC444B /* NewFeatureImageV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewFeatureImageV.m; sourceTree = ""; }; 56 | 89335FC31AEE0AD200BC444B /* UIApplication+Extend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIApplication+Extend.h"; sourceTree = ""; }; 57 | 89335FC41AEE0AD200BC444B /* UIApplication+Extend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIApplication+Extend.m"; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 89335F5C1AEDFEE800BC444B /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | 89335F751AEDFEE800BC444B /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 89335F561AEDFEE800BC444B = { 79 | isa = PBXGroup; 80 | children = ( 81 | 89335F611AEDFEE800BC444B /* CoreNewFeatureVC */, 82 | 89335F7B1AEDFEE800BC444B /* CoreNewFeatureVCTests */, 83 | 89335F601AEDFEE800BC444B /* Products */, 84 | ); 85 | sourceTree = ""; 86 | }; 87 | 89335F601AEDFEE800BC444B /* Products */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | 89335F5F1AEDFEE800BC444B /* CoreNewFeatureVC.app */, 91 | 89335F781AEDFEE800BC444B /* CoreNewFeatureVCTests.xctest */, 92 | ); 93 | name = Products; 94 | sourceTree = ""; 95 | }; 96 | 89335F611AEDFEE800BC444B /* CoreNewFeatureVC */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 89335F881AEDFF2000BC444B /* CoreNewFeatureVC */, 100 | 89335F661AEDFEE800BC444B /* AppDelegate.h */, 101 | 89335F671AEDFEE800BC444B /* AppDelegate.m */, 102 | 89335F6C1AEDFEE800BC444B /* Main.storyboard */, 103 | 89335F6F1AEDFEE800BC444B /* Images.xcassets */, 104 | 89335F711AEDFEE800BC444B /* LaunchScreen.xib */, 105 | 89335F621AEDFEE800BC444B /* Supporting Files */, 106 | ); 107 | path = CoreNewFeatureVC; 108 | sourceTree = ""; 109 | }; 110 | 89335F621AEDFEE800BC444B /* Supporting Files */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 89335F631AEDFEE800BC444B /* Info.plist */, 114 | 89335F641AEDFEE800BC444B /* main.m */, 115 | ); 116 | name = "Supporting Files"; 117 | sourceTree = ""; 118 | }; 119 | 89335F7B1AEDFEE800BC444B /* CoreNewFeatureVCTests */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 89335F7E1AEDFEE800BC444B /* CoreNewFeatureVCTests.m */, 123 | 89335F7C1AEDFEE800BC444B /* Supporting Files */, 124 | ); 125 | path = CoreNewFeatureVCTests; 126 | sourceTree = ""; 127 | }; 128 | 89335F7C1AEDFEE800BC444B /* Supporting Files */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 89335F7D1AEDFEE800BC444B /* Info.plist */, 132 | ); 133 | name = "Supporting Files"; 134 | sourceTree = ""; 135 | }; 136 | 89335F881AEDFF2000BC444B /* CoreNewFeatureVC */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 89335FC11AEE0A9300BC444B /* Category */, 140 | 89335F891AEDFF2000BC444B /* Controller */, 141 | 89335F8A1AEDFF2000BC444B /* Model */, 142 | 89335F8B1AEDFF2000BC444B /* View */, 143 | 89335F8C1AEDFF5300BC444B /* CoreNewFeatureVC.h */, 144 | 89335F8D1AEDFF5300BC444B /* CoreNewFeatureVC.m */, 145 | ); 146 | path = CoreNewFeatureVC; 147 | sourceTree = ""; 148 | }; 149 | 89335F891AEDFF2000BC444B /* Controller */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | ); 153 | path = Controller; 154 | sourceTree = ""; 155 | }; 156 | 89335F8A1AEDFF2000BC444B /* Model */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 89335F8F1AEDFF8000BC444B /* NewFeatureModel.h */, 160 | 89335F901AEDFF8000BC444B /* NewFeatureModel.m */, 161 | ); 162 | path = Model; 163 | sourceTree = ""; 164 | }; 165 | 89335F8B1AEDFF2000BC444B /* View */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | 89335FBB1AEE022C00BC444B /* NewFeatureScrollView.h */, 169 | 89335FBC1AEE022C00BC444B /* NewFeatureScrollView.m */, 170 | 89335FBE1AEE057C00BC444B /* NewFeatureImageV.h */, 171 | 89335FBF1AEE057C00BC444B /* NewFeatureImageV.m */, 172 | ); 173 | path = View; 174 | sourceTree = ""; 175 | }; 176 | 89335FC11AEE0A9300BC444B /* Category */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 892BCE851C0C5145008F84A3 /* UIView+NFLayout.h */, 180 | 892BCE861C0C5145008F84A3 /* UIView+NFLayout.m */, 181 | 89335FC21AEE0AD200BC444B /* UIApplication */, 182 | ); 183 | path = Category; 184 | sourceTree = ""; 185 | }; 186 | 89335FC21AEE0AD200BC444B /* UIApplication */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | 89335FC31AEE0AD200BC444B /* UIApplication+Extend.h */, 190 | 89335FC41AEE0AD200BC444B /* UIApplication+Extend.m */, 191 | ); 192 | path = UIApplication; 193 | sourceTree = ""; 194 | }; 195 | /* End PBXGroup section */ 196 | 197 | /* Begin PBXNativeTarget section */ 198 | 89335F5E1AEDFEE800BC444B /* CoreNewFeatureVC */ = { 199 | isa = PBXNativeTarget; 200 | buildConfigurationList = 89335F821AEDFEE800BC444B /* Build configuration list for PBXNativeTarget "CoreNewFeatureVC" */; 201 | buildPhases = ( 202 | 89335F5B1AEDFEE800BC444B /* Sources */, 203 | 89335F5C1AEDFEE800BC444B /* Frameworks */, 204 | 89335F5D1AEDFEE800BC444B /* Resources */, 205 | ); 206 | buildRules = ( 207 | ); 208 | dependencies = ( 209 | ); 210 | name = CoreNewFeatureVC; 211 | productName = CoreNewFeatureVC; 212 | productReference = 89335F5F1AEDFEE800BC444B /* CoreNewFeatureVC.app */; 213 | productType = "com.apple.product-type.application"; 214 | }; 215 | 89335F771AEDFEE800BC444B /* CoreNewFeatureVCTests */ = { 216 | isa = PBXNativeTarget; 217 | buildConfigurationList = 89335F851AEDFEE800BC444B /* Build configuration list for PBXNativeTarget "CoreNewFeatureVCTests" */; 218 | buildPhases = ( 219 | 89335F741AEDFEE800BC444B /* Sources */, 220 | 89335F751AEDFEE800BC444B /* Frameworks */, 221 | 89335F761AEDFEE800BC444B /* Resources */, 222 | ); 223 | buildRules = ( 224 | ); 225 | dependencies = ( 226 | 89335F7A1AEDFEE800BC444B /* PBXTargetDependency */, 227 | ); 228 | name = CoreNewFeatureVCTests; 229 | productName = CoreNewFeatureVCTests; 230 | productReference = 89335F781AEDFEE800BC444B /* CoreNewFeatureVCTests.xctest */; 231 | productType = "com.apple.product-type.bundle.unit-test"; 232 | }; 233 | /* End PBXNativeTarget section */ 234 | 235 | /* Begin PBXProject section */ 236 | 89335F571AEDFEE800BC444B /* Project object */ = { 237 | isa = PBXProject; 238 | attributes = { 239 | LastUpgradeCheck = 0630; 240 | ORGANIZATIONNAME = "冯成林"; 241 | TargetAttributes = { 242 | 89335F5E1AEDFEE800BC444B = { 243 | CreatedOnToolsVersion = 6.3; 244 | }; 245 | 89335F771AEDFEE800BC444B = { 246 | CreatedOnToolsVersion = 6.3; 247 | TestTargetID = 89335F5E1AEDFEE800BC444B; 248 | }; 249 | }; 250 | }; 251 | buildConfigurationList = 89335F5A1AEDFEE800BC444B /* Build configuration list for PBXProject "CoreNewFeatureVC" */; 252 | compatibilityVersion = "Xcode 3.2"; 253 | developmentRegion = English; 254 | hasScannedForEncodings = 0; 255 | knownRegions = ( 256 | en, 257 | Base, 258 | ); 259 | mainGroup = 89335F561AEDFEE800BC444B; 260 | productRefGroup = 89335F601AEDFEE800BC444B /* Products */; 261 | projectDirPath = ""; 262 | projectRoot = ""; 263 | targets = ( 264 | 89335F5E1AEDFEE800BC444B /* CoreNewFeatureVC */, 265 | 89335F771AEDFEE800BC444B /* CoreNewFeatureVCTests */, 266 | ); 267 | }; 268 | /* End PBXProject section */ 269 | 270 | /* Begin PBXResourcesBuildPhase section */ 271 | 89335F5D1AEDFEE800BC444B /* Resources */ = { 272 | isa = PBXResourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 89335F6E1AEDFEE800BC444B /* Main.storyboard in Resources */, 276 | 89335F731AEDFEE800BC444B /* LaunchScreen.xib in Resources */, 277 | 89335F701AEDFEE800BC444B /* Images.xcassets in Resources */, 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | }; 281 | 89335F761AEDFEE800BC444B /* Resources */ = { 282 | isa = PBXResourcesBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | }; 288 | /* End PBXResourcesBuildPhase section */ 289 | 290 | /* Begin PBXSourcesBuildPhase section */ 291 | 89335F5B1AEDFEE800BC444B /* Sources */ = { 292 | isa = PBXSourcesBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | 89335FBD1AEE022C00BC444B /* NewFeatureScrollView.m in Sources */, 296 | 892BCE871C0C5145008F84A3 /* UIView+NFLayout.m in Sources */, 297 | 89335F8E1AEDFF5300BC444B /* CoreNewFeatureVC.m in Sources */, 298 | 89335F681AEDFEE800BC444B /* AppDelegate.m in Sources */, 299 | 89335F911AEDFF8000BC444B /* NewFeatureModel.m in Sources */, 300 | 89335FC01AEE057C00BC444B /* NewFeatureImageV.m in Sources */, 301 | 89335F651AEDFEE800BC444B /* main.m in Sources */, 302 | 89335FC51AEE0AD200BC444B /* UIApplication+Extend.m in Sources */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | 89335F741AEDFEE800BC444B /* Sources */ = { 307 | isa = PBXSourcesBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | 89335F7F1AEDFEE800BC444B /* CoreNewFeatureVCTests.m in Sources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | /* End PBXSourcesBuildPhase section */ 315 | 316 | /* Begin PBXTargetDependency section */ 317 | 89335F7A1AEDFEE800BC444B /* PBXTargetDependency */ = { 318 | isa = PBXTargetDependency; 319 | target = 89335F5E1AEDFEE800BC444B /* CoreNewFeatureVC */; 320 | targetProxy = 89335F791AEDFEE800BC444B /* PBXContainerItemProxy */; 321 | }; 322 | /* End PBXTargetDependency section */ 323 | 324 | /* Begin PBXVariantGroup section */ 325 | 89335F6C1AEDFEE800BC444B /* Main.storyboard */ = { 326 | isa = PBXVariantGroup; 327 | children = ( 328 | 89335F6D1AEDFEE800BC444B /* Base */, 329 | ); 330 | name = Main.storyboard; 331 | sourceTree = ""; 332 | }; 333 | 89335F711AEDFEE800BC444B /* LaunchScreen.xib */ = { 334 | isa = PBXVariantGroup; 335 | children = ( 336 | 89335F721AEDFEE800BC444B /* Base */, 337 | ); 338 | name = LaunchScreen.xib; 339 | sourceTree = ""; 340 | }; 341 | /* End PBXVariantGroup section */ 342 | 343 | /* Begin XCBuildConfiguration section */ 344 | 89335F801AEDFEE800BC444B /* Debug */ = { 345 | isa = XCBuildConfiguration; 346 | buildSettings = { 347 | ALWAYS_SEARCH_USER_PATHS = NO; 348 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 349 | CLANG_CXX_LIBRARY = "libc++"; 350 | CLANG_ENABLE_MODULES = YES; 351 | CLANG_ENABLE_OBJC_ARC = YES; 352 | CLANG_WARN_BOOL_CONVERSION = YES; 353 | CLANG_WARN_CONSTANT_CONVERSION = YES; 354 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 355 | CLANG_WARN_EMPTY_BODY = YES; 356 | CLANG_WARN_ENUM_CONVERSION = YES; 357 | CLANG_WARN_INT_CONVERSION = YES; 358 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 359 | CLANG_WARN_UNREACHABLE_CODE = YES; 360 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 361 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 362 | COPY_PHASE_STRIP = NO; 363 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 364 | ENABLE_STRICT_OBJC_MSGSEND = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 374 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 375 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 376 | GCC_WARN_UNDECLARED_SELECTOR = YES; 377 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 378 | GCC_WARN_UNUSED_FUNCTION = YES; 379 | GCC_WARN_UNUSED_VARIABLE = YES; 380 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 381 | MTL_ENABLE_DEBUG_INFO = YES; 382 | ONLY_ACTIVE_ARCH = YES; 383 | SDKROOT = iphoneos; 384 | }; 385 | name = Debug; 386 | }; 387 | 89335F811AEDFEE800BC444B /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ALWAYS_SEARCH_USER_PATHS = NO; 391 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 392 | CLANG_CXX_LIBRARY = "libc++"; 393 | CLANG_ENABLE_MODULES = YES; 394 | CLANG_ENABLE_OBJC_ARC = YES; 395 | CLANG_WARN_BOOL_CONVERSION = YES; 396 | CLANG_WARN_CONSTANT_CONVERSION = YES; 397 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 398 | CLANG_WARN_EMPTY_BODY = YES; 399 | CLANG_WARN_ENUM_CONVERSION = YES; 400 | CLANG_WARN_INT_CONVERSION = YES; 401 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 402 | CLANG_WARN_UNREACHABLE_CODE = YES; 403 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 404 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 405 | COPY_PHASE_STRIP = NO; 406 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 407 | ENABLE_NS_ASSERTIONS = NO; 408 | ENABLE_STRICT_OBJC_MSGSEND = YES; 409 | GCC_C_LANGUAGE_STANDARD = gnu99; 410 | GCC_NO_COMMON_BLOCKS = YES; 411 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 412 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 413 | GCC_WARN_UNDECLARED_SELECTOR = YES; 414 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 415 | GCC_WARN_UNUSED_FUNCTION = YES; 416 | GCC_WARN_UNUSED_VARIABLE = YES; 417 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 418 | MTL_ENABLE_DEBUG_INFO = NO; 419 | SDKROOT = iphoneos; 420 | VALIDATE_PRODUCT = YES; 421 | }; 422 | name = Release; 423 | }; 424 | 89335F831AEDFEE800BC444B /* Debug */ = { 425 | isa = XCBuildConfiguration; 426 | buildSettings = { 427 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 428 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 429 | INFOPLIST_FILE = CoreNewFeatureVC/Info.plist; 430 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 431 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 432 | PRODUCT_NAME = "$(TARGET_NAME)"; 433 | }; 434 | name = Debug; 435 | }; 436 | 89335F841AEDFEE800BC444B /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 440 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 441 | INFOPLIST_FILE = CoreNewFeatureVC/Info.plist; 442 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 443 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 444 | PRODUCT_NAME = "$(TARGET_NAME)"; 445 | }; 446 | name = Release; 447 | }; 448 | 89335F861AEDFEE800BC444B /* Debug */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | BUNDLE_LOADER = "$(TEST_HOST)"; 452 | FRAMEWORK_SEARCH_PATHS = ( 453 | "$(SDKROOT)/Developer/Library/Frameworks", 454 | "$(inherited)", 455 | ); 456 | GCC_PREPROCESSOR_DEFINITIONS = ( 457 | "DEBUG=1", 458 | "$(inherited)", 459 | ); 460 | INFOPLIST_FILE = CoreNewFeatureVCTests/Info.plist; 461 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 462 | PRODUCT_NAME = "$(TARGET_NAME)"; 463 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoreNewFeatureVC.app/CoreNewFeatureVC"; 464 | }; 465 | name = Debug; 466 | }; 467 | 89335F871AEDFEE800BC444B /* Release */ = { 468 | isa = XCBuildConfiguration; 469 | buildSettings = { 470 | BUNDLE_LOADER = "$(TEST_HOST)"; 471 | FRAMEWORK_SEARCH_PATHS = ( 472 | "$(SDKROOT)/Developer/Library/Frameworks", 473 | "$(inherited)", 474 | ); 475 | INFOPLIST_FILE = CoreNewFeatureVCTests/Info.plist; 476 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 477 | PRODUCT_NAME = "$(TARGET_NAME)"; 478 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoreNewFeatureVC.app/CoreNewFeatureVC"; 479 | }; 480 | name = Release; 481 | }; 482 | /* End XCBuildConfiguration section */ 483 | 484 | /* Begin XCConfigurationList section */ 485 | 89335F5A1AEDFEE800BC444B /* Build configuration list for PBXProject "CoreNewFeatureVC" */ = { 486 | isa = XCConfigurationList; 487 | buildConfigurations = ( 488 | 89335F801AEDFEE800BC444B /* Debug */, 489 | 89335F811AEDFEE800BC444B /* Release */, 490 | ); 491 | defaultConfigurationIsVisible = 0; 492 | defaultConfigurationName = Release; 493 | }; 494 | 89335F821AEDFEE800BC444B /* Build configuration list for PBXNativeTarget "CoreNewFeatureVC" */ = { 495 | isa = XCConfigurationList; 496 | buildConfigurations = ( 497 | 89335F831AEDFEE800BC444B /* Debug */, 498 | 89335F841AEDFEE800BC444B /* Release */, 499 | ); 500 | defaultConfigurationIsVisible = 0; 501 | defaultConfigurationName = Release; 502 | }; 503 | 89335F851AEDFEE800BC444B /* Build configuration list for PBXNativeTarget "CoreNewFeatureVCTests" */ = { 504 | isa = XCConfigurationList; 505 | buildConfigurations = ( 506 | 89335F861AEDFEE800BC444B /* Debug */, 507 | 89335F871AEDFEE800BC444B /* Release */, 508 | ); 509 | defaultConfigurationIsVisible = 0; 510 | defaultConfigurationName = Release; 511 | }; 512 | /* End XCConfigurationList section */ 513 | }; 514 | rootObject = 89335F571AEDFEE800BC444B /* Project object */; 515 | } 516 | --------------------------------------------------------------------------------