├── 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 |
--------------------------------------------------------------------------------