├── LaunchIntroduction.gif ├── README.md └── ZYGLaunchIntroductionDemo ├── LaunchIntroduction ├── LaunchIntroductionView.h └── LaunchIntroductionView.m ├── ZYGLaunchIntroductionDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ ├── ZYG.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── ygboy.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ ├── ZYG.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ ├── ZYGLaunchIntroductionDemo.xcscheme │ │ └── xcschememanagement.plist │ └── ygboy.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── ZYGLaunchIntroductionDemo.xcscheme │ └── xcschememanagement.plist ├── ZYGLaunchIntroductionDemo ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ └── LaunchScreen.storyboard ├── Info.plist ├── MainViewController.h ├── MainViewController.m ├── launch0.jpg ├── launch1.jpg ├── launch2.jpg ├── launch3.png ├── login.png └── main.m ├── ZYGLaunchIntroductionDemoTests ├── Info.plist └── ZYGLaunchIntroductionDemoTests.m └── ZYGLaunchIntroductionDemoUITests ├── Info.plist └── ZYGLaunchIntroductionDemoUITests.m /LaunchIntroduction.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/LaunchIntroduction.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LaunchIntroductionDemo 2 | a demo for launch guide. 3 | 特点: 4 | 1、使用简单,一句代码搞定 5 | 2、支持自定义指示器的颜色 6 | 3、支持应用升级后显示新的引导页 7 | 8 | ![效果图](https://github.com/hungryBoy/LaunchIntroductionDemo/blob/master/LaunchIntroduction.gif) 9 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/LaunchIntroduction/LaunchIntroductionView.h: -------------------------------------------------------------------------------- 1 | // 2 | // LaunchIntroductionView.h 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define kScreen_height [[UIScreen mainScreen] bounds].size.height 12 | #define kScreen_width [[UIScreen mainScreen] bounds].size.width 13 | 14 | @interface LaunchIntroductionView : UIView 15 | /** 16 | * 选中page的指示器颜色,默认白色 17 | */ 18 | @property (nonatomic, strong) UIColor *currentColor; 19 | /** 20 | * 其他状态下的指示器的颜色,默认 21 | */ 22 | @property (nonatomic, strong) UIColor *nomalColor; 23 | /** 24 | * 不带按钮的引导页,滑动到最后一页,再向右滑直接隐藏引导页 25 | * 26 | * @param imageNames 背景图片数组 27 | * 28 | * @return LaunchIntroductionView对象 29 | */ 30 | +(instancetype)sharedWithImages:(NSArray *) imageNames; 31 | /** 32 | * 带按钮的引导页 33 | * 34 | * @param imageNames 背景图片数组 35 | * @param buttonImageName 按钮的图片 36 | * @param frame 按钮的frame 37 | * 38 | * @return LaunchIntroductionView对象 39 | */ 40 | +(instancetype)sharedWithImages:(NSArray *) imageNames buttonImage:(NSString *) buttonImageName buttonFrame:(CGRect ) frame; 41 | 42 | /** 43 | 用storyboard创建的project调用此方法 44 | 45 | @param storyboardName storyboardName 46 | @param imageNames 图片名字数组 47 | @return LaunchIntroductionView对象 48 | */ 49 | + (instancetype)sharedWithStoryboardName:(NSString *)storyboardName images:(NSArray *)imageNames; 50 | 51 | /** 52 | 用storyboard创建的project调用此方法 53 | 54 | @param storyboardName storyboardName 55 | @param imageNames 图片名字数组 56 | @param buttonImageName 按钮图片名字 57 | @param frame 按钮的frame 58 | @return LaunchIntroductionView对象 59 | */ 60 | +(instancetype)sharedWithStoryboard:(NSString *)storyboardName images:(NSArray *) imageNames buttonImage:(NSString *) buttonImageName buttonFrame:(CGRect ) frame; 61 | 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/LaunchIntroduction/LaunchIntroductionView.m: -------------------------------------------------------------------------------- 1 | // 2 | // LaunchIntroductionView.m 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import "LaunchIntroductionView.h" 10 | 11 | static NSString *const kAppVersion = @"appVersion"; 12 | 13 | @interface LaunchIntroductionView () 14 | { 15 | UIScrollView *launchScrollView; 16 | UIPageControl *page; 17 | } 18 | 19 | @end 20 | 21 | @implementation LaunchIntroductionView 22 | NSArray *images; 23 | BOOL isScrollOut;//在最后一页再次滑动是否隐藏引导页 24 | CGRect enterBtnFrame; 25 | NSString *enterBtnImage; 26 | static LaunchIntroductionView *launch = nil; 27 | NSString *storyboard; 28 | 29 | #pragma mark - 创建对象-->>不带button 30 | +(instancetype)sharedWithImages:(NSArray *)imageNames{ 31 | images = imageNames; 32 | isScrollOut = YES; 33 | launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)]; 34 | launch.backgroundColor = [UIColor whiteColor]; 35 | return launch; 36 | } 37 | 38 | #pragma mark - 创建对象-->>带button 39 | +(instancetype)sharedWithImages:(NSArray *)imageNames buttonImage:(NSString *)buttonImageName buttonFrame:(CGRect)frame{ 40 | images = imageNames; 41 | isScrollOut = NO; 42 | enterBtnFrame = frame; 43 | enterBtnImage = buttonImageName; 44 | launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)]; 45 | launch.backgroundColor = [UIColor whiteColor]; 46 | return launch; 47 | } 48 | #pragma mark - 用storyboard创建的项目时调用,不带button 49 | + (instancetype)sharedWithStoryboardName:(NSString *)storyboardName images:(NSArray *)imageNames { 50 | images = imageNames; 51 | storyboard = storyboardName; 52 | isScrollOut = YES; 53 | launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)]; 54 | launch.backgroundColor = [UIColor whiteColor]; 55 | return launch; 56 | } 57 | #pragma mark - 用storyboard创建的项目时调用,带button 58 | + (instancetype)sharedWithStoryboard:(NSString *)storyboardName images:(NSArray *)imageNames buttonImage:(NSString *)buttonImageName buttonFrame:(CGRect)frame{ 59 | images = imageNames; 60 | isScrollOut = NO; 61 | enterBtnFrame = frame; 62 | storyboard = storyboardName; 63 | enterBtnImage = buttonImageName; 64 | launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)]; 65 | launch.backgroundColor = [UIColor whiteColor]; 66 | return launch; 67 | } 68 | #pragma mark - 初始化 69 | - (instancetype)initWithFrame:(CGRect)frame 70 | { 71 | self = [super initWithFrame:frame]; 72 | if (self) { 73 | [self addObserver:self forKeyPath:@"currentColor" options:NSKeyValueObservingOptionNew context:nil]; 74 | [self addObserver:self forKeyPath:@"nomalColor" options:NSKeyValueObservingOptionNew context:nil]; 75 | if ([self isFirstLauch]) { 76 | UIStoryboard *story; 77 | if (storyboard) { 78 | story = [UIStoryboard storyboardWithName:storyboard bundle:nil]; 79 | } 80 | UIWindow *window = [UIApplication sharedApplication].windows.lastObject; 81 | if (story) { 82 | UIViewController * vc = story.instantiateInitialViewController; 83 | window.rootViewController = vc; 84 | [vc.view addSubview:self]; 85 | }else { 86 | [window addSubview:self]; 87 | } 88 | [self addImages]; 89 | }else{ 90 | [self removeFromSuperview]; 91 | } 92 | } 93 | return self; 94 | } 95 | #pragma mark - 判断是不是首次登录或者版本更新 96 | -(BOOL )isFirstLauch{ 97 | //获取当前版本号 98 | NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; 99 | NSString *currentAppVersion = infoDic[@"CFBundleShortVersionString"]; 100 | //获取上次启动应用保存的appVersion 101 | NSString *version = [[NSUserDefaults standardUserDefaults] objectForKey:kAppVersion]; 102 | //版本升级或首次登录 103 | if (version == nil || ![version isEqualToString:currentAppVersion]) { 104 | [[NSUserDefaults standardUserDefaults] setObject:currentAppVersion forKey:kAppVersion]; 105 | [[NSUserDefaults standardUserDefaults] synchronize]; 106 | return YES; 107 | }else{ 108 | return NO; 109 | } 110 | } 111 | #pragma mark - 添加引导页图片 112 | -(void)addImages{ 113 | [self createScrollView]; 114 | } 115 | #pragma mark - 创建滚动视图 116 | -(void)createScrollView{ 117 | launchScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)]; 118 | launchScrollView.showsHorizontalScrollIndicator = NO; 119 | launchScrollView.bounces = NO; 120 | launchScrollView.pagingEnabled = YES; 121 | launchScrollView.delegate = self; 122 | launchScrollView.contentSize = CGSizeMake(kScreen_width * images.count, kScreen_height); 123 | [self addSubview:launchScrollView]; 124 | for (int i = 0; i < images.count; i ++) { 125 | UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * kScreen_width, 0, kScreen_width, kScreen_height)]; 126 | imageView.image = [UIImage imageNamed:images[i]]; 127 | [launchScrollView addSubview:imageView]; 128 | if (i == images.count - 1) { 129 | //判断要不要添加button 130 | if (!isScrollOut) { 131 | UIButton *enterButton = [[UIButton alloc] initWithFrame:CGRectMake(enterBtnFrame.origin.x, enterBtnFrame.origin.y, enterBtnFrame.size.width, enterBtnFrame.size.height)]; 132 | [enterButton setImage:[UIImage imageNamed:enterBtnImage] forState:UIControlStateNormal]; 133 | [enterButton addTarget:self action:@selector(enterBtnClick) forControlEvents:UIControlEventTouchUpInside]; 134 | [imageView addSubview:enterButton]; 135 | imageView.userInteractionEnabled = YES; 136 | } 137 | } 138 | } 139 | page = [[UIPageControl alloc] initWithFrame:CGRectMake(0, kScreen_height - 50, kScreen_width, 30)]; 140 | page.numberOfPages = images.count; 141 | page.backgroundColor = [UIColor clearColor]; 142 | page.currentPage = 0; 143 | page.defersCurrentPageDisplay = YES; 144 | [self addSubview:page]; 145 | } 146 | #pragma mark - 进入按钮 147 | -(void)enterBtnClick{ 148 | [self hideGuidView]; 149 | } 150 | #pragma mark - 隐藏引导页 151 | -(void)hideGuidView{ 152 | [UIView animateWithDuration:0.5 animations:^{ 153 | self.alpha = 0; 154 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 155 | [self removeFromSuperview]; 156 | }); 157 | 158 | }]; 159 | } 160 | #pragma mark - scrollView Delegate 161 | -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 162 | int cuttentIndex = (int)(scrollView.contentOffset.x + kScreen_width/2)/kScreen_width; 163 | if (cuttentIndex == images.count - 1) { 164 | if ([self isScrolltoLeft:scrollView]) { 165 | if (!isScrollOut) { 166 | return ; 167 | } 168 | [self hideGuidView]; 169 | } 170 | } 171 | } 172 | -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 173 | if (scrollView == launchScrollView) { 174 | int cuttentIndex = (int)(scrollView.contentOffset.x + kScreen_width/2)/kScreen_width; 175 | page.currentPage = cuttentIndex; 176 | } 177 | } 178 | #pragma mark - 判断滚动方向 179 | -(BOOL )isScrolltoLeft:(UIScrollView *) scrollView{ 180 | //返回YES为向左反动,NO为右滚动 181 | if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x < 0) { 182 | return YES; 183 | }else{ 184 | return NO; 185 | } 186 | } 187 | #pragma mark - KVO监测值的变化 188 | -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 189 | if ([keyPath isEqualToString:@"currentColor"]) { 190 | page.currentPageIndicatorTintColor = self.currentColor; 191 | } 192 | if ([keyPath isEqualToString:@"nomalColor"]) { 193 | page.pageIndicatorTintColor = self.nomalColor; 194 | } 195 | } 196 | 197 | @end 198 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 021017481CB608F3000E59D2 /* launch0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 021017441CB608F3000E59D2 /* launch0.jpg */; }; 11 | 021017491CB608F3000E59D2 /* launch3.png in Resources */ = {isa = PBXBuildFile; fileRef = 021017451CB608F3000E59D2 /* launch3.png */; }; 12 | 0210174A1CB608F3000E59D2 /* launch1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 021017461CB608F3000E59D2 /* launch1.jpg */; }; 13 | 0210174B1CB608F3000E59D2 /* launch2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 021017471CB608F3000E59D2 /* launch2.jpg */; }; 14 | 0210174D1CB646A6000E59D2 /* login.png in Resources */ = {isa = PBXBuildFile; fileRef = 0210174C1CB646A6000E59D2 /* login.png */; }; 15 | 02FE25811CB5F469006F5350 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE25801CB5F469006F5350 /* main.m */; }; 16 | 02FE25841CB5F469006F5350 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE25831CB5F469006F5350 /* AppDelegate.m */; }; 17 | 02FE25861CB5F469006F5350 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 02FE25851CB5F469006F5350 /* Assets.xcassets */; }; 18 | 02FE25891CB5F469006F5350 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 02FE25871CB5F469006F5350 /* LaunchScreen.storyboard */; }; 19 | 02FE25941CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE25931CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.m */; }; 20 | 02FE259F1CB5F46A006F5350 /* ZYGLaunchIntroductionDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE259E1CB5F46A006F5350 /* ZYGLaunchIntroductionDemoUITests.m */; }; 21 | 02FE25AE1CB5F491006F5350 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE25AD1CB5F491006F5350 /* MainViewController.m */; }; 22 | 02FE25B21CB5F56E006F5350 /* LaunchIntroductionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FE25B11CB5F56E006F5350 /* LaunchIntroductionView.m */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | 02FE25901CB5F469006F5350 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = 02FE25741CB5F469006F5350 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = 02FE257B1CB5F469006F5350; 31 | remoteInfo = ZYGLaunchIntroductionDemo; 32 | }; 33 | 02FE259B1CB5F469006F5350 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = 02FE25741CB5F469006F5350 /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = 02FE257B1CB5F469006F5350; 38 | remoteInfo = ZYGLaunchIntroductionDemo; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 021017441CB608F3000E59D2 /* launch0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = launch0.jpg; sourceTree = ""; }; 44 | 021017451CB608F3000E59D2 /* launch3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch3.png; sourceTree = ""; }; 45 | 021017461CB608F3000E59D2 /* launch1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = launch1.jpg; sourceTree = ""; }; 46 | 021017471CB608F3000E59D2 /* launch2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = launch2.jpg; sourceTree = ""; }; 47 | 0210174C1CB646A6000E59D2 /* login.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = login.png; sourceTree = ""; }; 48 | 02FE257C1CB5F469006F5350 /* ZYGLaunchIntroductionDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZYGLaunchIntroductionDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 02FE25801CB5F469006F5350 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 50 | 02FE25821CB5F469006F5350 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 51 | 02FE25831CB5F469006F5350 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 52 | 02FE25851CB5F469006F5350 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 53 | 02FE25881CB5F469006F5350 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 54 | 02FE258A1CB5F469006F5350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | 02FE258F1CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZYGLaunchIntroductionDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 02FE25931CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZYGLaunchIntroductionDemoTests.m; sourceTree = ""; }; 57 | 02FE25951CB5F469006F5350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | 02FE259A1CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZYGLaunchIntroductionDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 02FE259E1CB5F46A006F5350 /* ZYGLaunchIntroductionDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZYGLaunchIntroductionDemoUITests.m; sourceTree = ""; }; 60 | 02FE25A01CB5F46A006F5350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | 02FE25AC1CB5F491006F5350 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; 62 | 02FE25AD1CB5F491006F5350 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = ""; }; 63 | 02FE25B01CB5F56E006F5350 /* LaunchIntroductionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchIntroductionView.h; sourceTree = ""; }; 64 | 02FE25B11CB5F56E006F5350 /* LaunchIntroductionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LaunchIntroductionView.m; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 02FE25791CB5F469006F5350 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | 02FE258C1CB5F469006F5350 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | 02FE25971CB5F469006F5350 /* Frameworks */ = { 83 | isa = PBXFrameworksBuildPhase; 84 | buildActionMask = 2147483647; 85 | files = ( 86 | ); 87 | runOnlyForDeploymentPostprocessing = 0; 88 | }; 89 | /* End PBXFrameworksBuildPhase section */ 90 | 91 | /* Begin PBXGroup section */ 92 | 02FE25731CB5F469006F5350 = { 93 | isa = PBXGroup; 94 | children = ( 95 | 02FE25AF1CB5F537006F5350 /* LaunchIntroduction */, 96 | 02FE257E1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */, 97 | 02FE25921CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests */, 98 | 02FE259D1CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests */, 99 | 02FE257D1CB5F469006F5350 /* Products */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | 02FE257D1CB5F469006F5350 /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 02FE257C1CB5F469006F5350 /* ZYGLaunchIntroductionDemo.app */, 107 | 02FE258F1CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.xctest */, 108 | 02FE259A1CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests.xctest */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 02FE257E1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 02FE25821CB5F469006F5350 /* AppDelegate.h */, 117 | 02FE25831CB5F469006F5350 /* AppDelegate.m */, 118 | 02FE25AC1CB5F491006F5350 /* MainViewController.h */, 119 | 02FE25AD1CB5F491006F5350 /* MainViewController.m */, 120 | 02FE25851CB5F469006F5350 /* Assets.xcassets */, 121 | 02FE25871CB5F469006F5350 /* LaunchScreen.storyboard */, 122 | 02FE258A1CB5F469006F5350 /* Info.plist */, 123 | 02FE257F1CB5F469006F5350 /* Supporting Files */, 124 | ); 125 | path = ZYGLaunchIntroductionDemo; 126 | sourceTree = ""; 127 | }; 128 | 02FE257F1CB5F469006F5350 /* Supporting Files */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 0210174C1CB646A6000E59D2 /* login.png */, 132 | 021017441CB608F3000E59D2 /* launch0.jpg */, 133 | 021017451CB608F3000E59D2 /* launch3.png */, 134 | 021017461CB608F3000E59D2 /* launch1.jpg */, 135 | 021017471CB608F3000E59D2 /* launch2.jpg */, 136 | 02FE25801CB5F469006F5350 /* main.m */, 137 | ); 138 | name = "Supporting Files"; 139 | sourceTree = ""; 140 | }; 141 | 02FE25921CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 02FE25931CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.m */, 145 | 02FE25951CB5F469006F5350 /* Info.plist */, 146 | ); 147 | path = ZYGLaunchIntroductionDemoTests; 148 | sourceTree = ""; 149 | }; 150 | 02FE259D1CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | 02FE259E1CB5F46A006F5350 /* ZYGLaunchIntroductionDemoUITests.m */, 154 | 02FE25A01CB5F46A006F5350 /* Info.plist */, 155 | ); 156 | path = ZYGLaunchIntroductionDemoUITests; 157 | sourceTree = ""; 158 | }; 159 | 02FE25AF1CB5F537006F5350 /* LaunchIntroduction */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 02FE25B01CB5F56E006F5350 /* LaunchIntroductionView.h */, 163 | 02FE25B11CB5F56E006F5350 /* LaunchIntroductionView.m */, 164 | ); 165 | path = LaunchIntroduction; 166 | sourceTree = ""; 167 | }; 168 | /* End PBXGroup section */ 169 | 170 | /* Begin PBXNativeTarget section */ 171 | 02FE257B1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = 02FE25A31CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemo" */; 174 | buildPhases = ( 175 | 02FE25781CB5F469006F5350 /* Sources */, 176 | 02FE25791CB5F469006F5350 /* Frameworks */, 177 | 02FE257A1CB5F469006F5350 /* Resources */, 178 | ); 179 | buildRules = ( 180 | ); 181 | dependencies = ( 182 | ); 183 | name = ZYGLaunchIntroductionDemo; 184 | productName = ZYGLaunchIntroductionDemo; 185 | productReference = 02FE257C1CB5F469006F5350 /* ZYGLaunchIntroductionDemo.app */; 186 | productType = "com.apple.product-type.application"; 187 | }; 188 | 02FE258E1CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests */ = { 189 | isa = PBXNativeTarget; 190 | buildConfigurationList = 02FE25A61CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemoTests" */; 191 | buildPhases = ( 192 | 02FE258B1CB5F469006F5350 /* Sources */, 193 | 02FE258C1CB5F469006F5350 /* Frameworks */, 194 | 02FE258D1CB5F469006F5350 /* Resources */, 195 | ); 196 | buildRules = ( 197 | ); 198 | dependencies = ( 199 | 02FE25911CB5F469006F5350 /* PBXTargetDependency */, 200 | ); 201 | name = ZYGLaunchIntroductionDemoTests; 202 | productName = ZYGLaunchIntroductionDemoTests; 203 | productReference = 02FE258F1CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.xctest */; 204 | productType = "com.apple.product-type.bundle.unit-test"; 205 | }; 206 | 02FE25991CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests */ = { 207 | isa = PBXNativeTarget; 208 | buildConfigurationList = 02FE25A91CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemoUITests" */; 209 | buildPhases = ( 210 | 02FE25961CB5F469006F5350 /* Sources */, 211 | 02FE25971CB5F469006F5350 /* Frameworks */, 212 | 02FE25981CB5F469006F5350 /* Resources */, 213 | ); 214 | buildRules = ( 215 | ); 216 | dependencies = ( 217 | 02FE259C1CB5F469006F5350 /* PBXTargetDependency */, 218 | ); 219 | name = ZYGLaunchIntroductionDemoUITests; 220 | productName = ZYGLaunchIntroductionDemoUITests; 221 | productReference = 02FE259A1CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests.xctest */; 222 | productType = "com.apple.product-type.bundle.ui-testing"; 223 | }; 224 | /* End PBXNativeTarget section */ 225 | 226 | /* Begin PBXProject section */ 227 | 02FE25741CB5F469006F5350 /* Project object */ = { 228 | isa = PBXProject; 229 | attributes = { 230 | LastUpgradeCheck = 0720; 231 | ORGANIZATIONNAME = ZhangYunguang; 232 | TargetAttributes = { 233 | 02FE257B1CB5F469006F5350 = { 234 | CreatedOnToolsVersion = 7.2; 235 | DevelopmentTeam = 327TE6362Z; 236 | }; 237 | 02FE258E1CB5F469006F5350 = { 238 | CreatedOnToolsVersion = 7.2; 239 | TestTargetID = 02FE257B1CB5F469006F5350; 240 | }; 241 | 02FE25991CB5F469006F5350 = { 242 | CreatedOnToolsVersion = 7.2; 243 | TestTargetID = 02FE257B1CB5F469006F5350; 244 | }; 245 | }; 246 | }; 247 | buildConfigurationList = 02FE25771CB5F469006F5350 /* Build configuration list for PBXProject "ZYGLaunchIntroductionDemo" */; 248 | compatibilityVersion = "Xcode 3.2"; 249 | developmentRegion = English; 250 | hasScannedForEncodings = 0; 251 | knownRegions = ( 252 | en, 253 | Base, 254 | ); 255 | mainGroup = 02FE25731CB5F469006F5350; 256 | productRefGroup = 02FE257D1CB5F469006F5350 /* Products */; 257 | projectDirPath = ""; 258 | projectRoot = ""; 259 | targets = ( 260 | 02FE257B1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */, 261 | 02FE258E1CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests */, 262 | 02FE25991CB5F469006F5350 /* ZYGLaunchIntroductionDemoUITests */, 263 | ); 264 | }; 265 | /* End PBXProject section */ 266 | 267 | /* Begin PBXResourcesBuildPhase section */ 268 | 02FE257A1CB5F469006F5350 /* Resources */ = { 269 | isa = PBXResourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | 021017491CB608F3000E59D2 /* launch3.png in Resources */, 273 | 0210174B1CB608F3000E59D2 /* launch2.jpg in Resources */, 274 | 02FE25861CB5F469006F5350 /* Assets.xcassets in Resources */, 275 | 021017481CB608F3000E59D2 /* launch0.jpg in Resources */, 276 | 02FE25891CB5F469006F5350 /* LaunchScreen.storyboard in Resources */, 277 | 0210174A1CB608F3000E59D2 /* launch1.jpg in Resources */, 278 | 0210174D1CB646A6000E59D2 /* login.png in Resources */, 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | }; 282 | 02FE258D1CB5F469006F5350 /* Resources */ = { 283 | isa = PBXResourcesBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | }; 289 | 02FE25981CB5F469006F5350 /* Resources */ = { 290 | isa = PBXResourcesBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | /* End PBXResourcesBuildPhase section */ 297 | 298 | /* Begin PBXSourcesBuildPhase section */ 299 | 02FE25781CB5F469006F5350 /* Sources */ = { 300 | isa = PBXSourcesBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | 02FE25841CB5F469006F5350 /* AppDelegate.m in Sources */, 304 | 02FE25AE1CB5F491006F5350 /* MainViewController.m in Sources */, 305 | 02FE25811CB5F469006F5350 /* main.m in Sources */, 306 | 02FE25B21CB5F56E006F5350 /* LaunchIntroductionView.m in Sources */, 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | 02FE258B1CB5F469006F5350 /* Sources */ = { 311 | isa = PBXSourcesBuildPhase; 312 | buildActionMask = 2147483647; 313 | files = ( 314 | 02FE25941CB5F469006F5350 /* ZYGLaunchIntroductionDemoTests.m in Sources */, 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | }; 318 | 02FE25961CB5F469006F5350 /* Sources */ = { 319 | isa = PBXSourcesBuildPhase; 320 | buildActionMask = 2147483647; 321 | files = ( 322 | 02FE259F1CB5F46A006F5350 /* ZYGLaunchIntroductionDemoUITests.m in Sources */, 323 | ); 324 | runOnlyForDeploymentPostprocessing = 0; 325 | }; 326 | /* End PBXSourcesBuildPhase section */ 327 | 328 | /* Begin PBXTargetDependency section */ 329 | 02FE25911CB5F469006F5350 /* PBXTargetDependency */ = { 330 | isa = PBXTargetDependency; 331 | target = 02FE257B1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */; 332 | targetProxy = 02FE25901CB5F469006F5350 /* PBXContainerItemProxy */; 333 | }; 334 | 02FE259C1CB5F469006F5350 /* PBXTargetDependency */ = { 335 | isa = PBXTargetDependency; 336 | target = 02FE257B1CB5F469006F5350 /* ZYGLaunchIntroductionDemo */; 337 | targetProxy = 02FE259B1CB5F469006F5350 /* PBXContainerItemProxy */; 338 | }; 339 | /* End PBXTargetDependency section */ 340 | 341 | /* Begin PBXVariantGroup section */ 342 | 02FE25871CB5F469006F5350 /* LaunchScreen.storyboard */ = { 343 | isa = PBXVariantGroup; 344 | children = ( 345 | 02FE25881CB5F469006F5350 /* Base */, 346 | ); 347 | name = LaunchScreen.storyboard; 348 | sourceTree = ""; 349 | }; 350 | /* End PBXVariantGroup section */ 351 | 352 | /* Begin XCBuildConfiguration section */ 353 | 02FE25A11CB5F46A006F5350 /* Debug */ = { 354 | isa = XCBuildConfiguration; 355 | buildSettings = { 356 | ALWAYS_SEARCH_USER_PATHS = NO; 357 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 358 | CLANG_CXX_LIBRARY = "libc++"; 359 | CLANG_ENABLE_MODULES = YES; 360 | CLANG_ENABLE_OBJC_ARC = YES; 361 | CLANG_WARN_BOOL_CONVERSION = YES; 362 | CLANG_WARN_CONSTANT_CONVERSION = YES; 363 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 364 | CLANG_WARN_EMPTY_BODY = YES; 365 | CLANG_WARN_ENUM_CONVERSION = YES; 366 | CLANG_WARN_INT_CONVERSION = YES; 367 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 368 | CLANG_WARN_UNREACHABLE_CODE = YES; 369 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 370 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 371 | COPY_PHASE_STRIP = NO; 372 | DEBUG_INFORMATION_FORMAT = dwarf; 373 | ENABLE_STRICT_OBJC_MSGSEND = YES; 374 | ENABLE_TESTABILITY = YES; 375 | GCC_C_LANGUAGE_STANDARD = gnu99; 376 | GCC_DYNAMIC_NO_PIC = NO; 377 | GCC_NO_COMMON_BLOCKS = YES; 378 | GCC_OPTIMIZATION_LEVEL = 0; 379 | GCC_PREPROCESSOR_DEFINITIONS = ( 380 | "DEBUG=1", 381 | "$(inherited)", 382 | ); 383 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 384 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 385 | GCC_WARN_UNDECLARED_SELECTOR = YES; 386 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 387 | GCC_WARN_UNUSED_FUNCTION = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 390 | MTL_ENABLE_DEBUG_INFO = YES; 391 | ONLY_ACTIVE_ARCH = YES; 392 | SDKROOT = iphoneos; 393 | }; 394 | name = Debug; 395 | }; 396 | 02FE25A21CB5F46A006F5350 /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | buildSettings = { 399 | ALWAYS_SEARCH_USER_PATHS = NO; 400 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 401 | CLANG_CXX_LIBRARY = "libc++"; 402 | CLANG_ENABLE_MODULES = YES; 403 | CLANG_ENABLE_OBJC_ARC = YES; 404 | CLANG_WARN_BOOL_CONVERSION = YES; 405 | CLANG_WARN_CONSTANT_CONVERSION = YES; 406 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 407 | CLANG_WARN_EMPTY_BODY = YES; 408 | CLANG_WARN_ENUM_CONVERSION = YES; 409 | CLANG_WARN_INT_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_UNREACHABLE_CODE = YES; 412 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 413 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 414 | COPY_PHASE_STRIP = NO; 415 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 416 | ENABLE_NS_ASSERTIONS = NO; 417 | ENABLE_STRICT_OBJC_MSGSEND = YES; 418 | GCC_C_LANGUAGE_STANDARD = gnu99; 419 | GCC_NO_COMMON_BLOCKS = YES; 420 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 421 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 422 | GCC_WARN_UNDECLARED_SELECTOR = YES; 423 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 424 | GCC_WARN_UNUSED_FUNCTION = YES; 425 | GCC_WARN_UNUSED_VARIABLE = YES; 426 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 427 | MTL_ENABLE_DEBUG_INFO = NO; 428 | SDKROOT = iphoneos; 429 | VALIDATE_PRODUCT = YES; 430 | }; 431 | name = Release; 432 | }; 433 | 02FE25A41CB5F46A006F5350 /* Debug */ = { 434 | isa = XCBuildConfiguration; 435 | buildSettings = { 436 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 437 | DEVELOPMENT_TEAM = 327TE6362Z; 438 | INFOPLIST_FILE = ZYGLaunchIntroductionDemo/Info.plist; 439 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 441 | PRODUCT_BUNDLE_IDENTIFIER = com.mytest.launchtest; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | }; 444 | name = Debug; 445 | }; 446 | 02FE25A51CB5F46A006F5350 /* Release */ = { 447 | isa = XCBuildConfiguration; 448 | buildSettings = { 449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 450 | DEVELOPMENT_TEAM = 327TE6362Z; 451 | INFOPLIST_FILE = ZYGLaunchIntroductionDemo/Info.plist; 452 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 453 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 454 | PRODUCT_BUNDLE_IDENTIFIER = com.mytest.launchtest; 455 | PRODUCT_NAME = "$(TARGET_NAME)"; 456 | }; 457 | name = Release; 458 | }; 459 | 02FE25A71CB5F46A006F5350 /* Debug */ = { 460 | isa = XCBuildConfiguration; 461 | buildSettings = { 462 | BUNDLE_LOADER = "$(TEST_HOST)"; 463 | INFOPLIST_FILE = ZYGLaunchIntroductionDemoTests/Info.plist; 464 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 465 | PRODUCT_BUNDLE_IDENTIFIER = com.huaxinlongma.ZYGLaunchIntroductionDemoTests; 466 | PRODUCT_NAME = "$(TARGET_NAME)"; 467 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZYGLaunchIntroductionDemo.app/ZYGLaunchIntroductionDemo"; 468 | }; 469 | name = Debug; 470 | }; 471 | 02FE25A81CB5F46A006F5350 /* Release */ = { 472 | isa = XCBuildConfiguration; 473 | buildSettings = { 474 | BUNDLE_LOADER = "$(TEST_HOST)"; 475 | INFOPLIST_FILE = ZYGLaunchIntroductionDemoTests/Info.plist; 476 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 477 | PRODUCT_BUNDLE_IDENTIFIER = com.huaxinlongma.ZYGLaunchIntroductionDemoTests; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZYGLaunchIntroductionDemo.app/ZYGLaunchIntroductionDemo"; 480 | }; 481 | name = Release; 482 | }; 483 | 02FE25AA1CB5F46A006F5350 /* Debug */ = { 484 | isa = XCBuildConfiguration; 485 | buildSettings = { 486 | INFOPLIST_FILE = ZYGLaunchIntroductionDemoUITests/Info.plist; 487 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 488 | PRODUCT_BUNDLE_IDENTIFIER = com.huaxinlongma.ZYGLaunchIntroductionDemoUITests; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | TEST_TARGET_NAME = ZYGLaunchIntroductionDemo; 491 | USES_XCTRUNNER = YES; 492 | }; 493 | name = Debug; 494 | }; 495 | 02FE25AB1CB5F46A006F5350 /* Release */ = { 496 | isa = XCBuildConfiguration; 497 | buildSettings = { 498 | INFOPLIST_FILE = ZYGLaunchIntroductionDemoUITests/Info.plist; 499 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 500 | PRODUCT_BUNDLE_IDENTIFIER = com.huaxinlongma.ZYGLaunchIntroductionDemoUITests; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | TEST_TARGET_NAME = ZYGLaunchIntroductionDemo; 503 | USES_XCTRUNNER = YES; 504 | }; 505 | name = Release; 506 | }; 507 | /* End XCBuildConfiguration section */ 508 | 509 | /* Begin XCConfigurationList section */ 510 | 02FE25771CB5F469006F5350 /* Build configuration list for PBXProject "ZYGLaunchIntroductionDemo" */ = { 511 | isa = XCConfigurationList; 512 | buildConfigurations = ( 513 | 02FE25A11CB5F46A006F5350 /* Debug */, 514 | 02FE25A21CB5F46A006F5350 /* Release */, 515 | ); 516 | defaultConfigurationIsVisible = 0; 517 | defaultConfigurationName = Release; 518 | }; 519 | 02FE25A31CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemo" */ = { 520 | isa = XCConfigurationList; 521 | buildConfigurations = ( 522 | 02FE25A41CB5F46A006F5350 /* Debug */, 523 | 02FE25A51CB5F46A006F5350 /* Release */, 524 | ); 525 | defaultConfigurationIsVisible = 0; 526 | defaultConfigurationName = Release; 527 | }; 528 | 02FE25A61CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemoTests" */ = { 529 | isa = XCConfigurationList; 530 | buildConfigurations = ( 531 | 02FE25A71CB5F46A006F5350 /* Debug */, 532 | 02FE25A81CB5F46A006F5350 /* Release */, 533 | ); 534 | defaultConfigurationIsVisible = 0; 535 | defaultConfigurationName = Release; 536 | }; 537 | 02FE25A91CB5F46A006F5350 /* Build configuration list for PBXNativeTarget "ZYGLaunchIntroductionDemoUITests" */ = { 538 | isa = XCConfigurationList; 539 | buildConfigurations = ( 540 | 02FE25AA1CB5F46A006F5350 /* Debug */, 541 | 02FE25AB1CB5F46A006F5350 /* Release */, 542 | ); 543 | defaultConfigurationIsVisible = 0; 544 | defaultConfigurationName = Release; 545 | }; 546 | /* End XCConfigurationList section */ 547 | }; 548 | rootObject = 02FE25741CB5F469006F5350 /* Project object */; 549 | } 550 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.xcworkspace/xcuserdata/ZYG.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.xcworkspace/xcuserdata/ZYG.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.xcworkspace/xcuserdata/ygboy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/project.xcworkspace/xcuserdata/ygboy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ZYG.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ZYG.xcuserdatad/xcschemes/ZYGLaunchIntroductionDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ZYG.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ZYGLaunchIntroductionDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 02FE257B1CB5F469006F5350 16 | 17 | primary 18 | 19 | 20 | 02FE258E1CB5F469006F5350 21 | 22 | primary 23 | 24 | 25 | 02FE25991CB5F469006F5350 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ygboy.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ygboy.xcuserdatad/xcschemes/ZYGLaunchIntroductionDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo.xcodeproj/xcuserdata/ygboy.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ZYGLaunchIntroductionDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 02FE257B1CB5F469006F5350 16 | 17 | primary 18 | 19 | 20 | 02FE258E1CB5F469006F5350 21 | 22 | primary 23 | 24 | 25 | 02FE25991CB5F469006F5350 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. 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 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "MainViewController.h" 11 | #import "LaunchIntroductionView.h" 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | 20 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 21 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 22 | // Override point for customization after application launch. 23 | self.window.backgroundColor = [UIColor whiteColor]; 24 | MainViewController *main = [[MainViewController alloc] init]; 25 | UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:main]; 26 | self.window.rootViewController = nav; 27 | [self.window makeKeyAndVisible]; 28 | 29 | #if 1 30 | [LaunchIntroductionView sharedWithImages:@[@"launch0.jpg",@"launch1.jpg",@"launch2.jpg",@"launch3"]]; 31 | #elif 0 32 | [LaunchIntroductionView sharedWithImages:@[@"launch0.jpg",@"launch1.jpg",@"launch2.jpg",@"launch3"] buttonImage:@"login" buttonFrame:CGRectMake(kScreen_width/2 - 551/4, kScreen_height - 150, 551/2, 45)]; 33 | #elif 0 34 | LaunchIntroductionView *launch = [LaunchIntroductionView sharedWithImages:@[@"launch0.jpg",@"launch1.jpg",@"launch2.jpg",@"launch3"] buttonImage:@"login" buttonFrame:CGRectMake(kScreen_width/2 - 551/4, kScreen_height - 150, 551/2, 45)]; 35 | launch.currentColor = [UIColor redColor]; 36 | launch.nomalColor = [UIColor greenColor]; 37 | #else 38 | //只有在存在该storyboard时才调用该方法,否则会引起crash 39 | [LaunchIntroductionView sharedWithStoryboard:@"Main" images:@[@"launch0.jpg",@"launch1.jpg",@"launch2.jpg",@"launch3"] buttonImage:@"login" buttonFrame:CGRectMake(kScreen_width/2 - 551/4, kScreen_height - 150, 551/2, 45)]; 40 | #endif 41 | return YES; 42 | } 43 | 44 | - (void)applicationWillResignActive:(UIApplication *)application { 45 | // 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. 46 | // 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. 47 | } 48 | 49 | - (void)applicationDidEnterBackground:(UIApplication *)application { 50 | // 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. 51 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 52 | } 53 | 54 | - (void)applicationWillEnterForeground:(UIApplication *)application { 55 | // 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. 56 | } 57 | 58 | - (void)applicationDidBecomeActive:(UIApplication *)application { 59 | // 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. 60 | } 61 | 62 | - (void)applicationWillTerminate:(UIApplication *)application { 63 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 64 | } 65 | 66 | @end 67 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/Assets.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 | } -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/MainViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.h 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MainViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/MainViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.m 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import "MainViewController.h" 10 | 11 | @interface MainViewController () 12 | 13 | @end 14 | 15 | @implementation MainViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 40)]; 21 | button.backgroundColor = [UIColor grayColor]; 22 | [button setTitle:@"点我" forState:UIControlStateNormal]; 23 | [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; 24 | [self.view addSubview:button]; 25 | } 26 | -(void)click{ 27 | NSLog(@"我被点了"); 28 | } 29 | - (void)didReceiveMemoryWarning { 30 | [super didReceiveMemoryWarning]; 31 | // Dispose of any resources that can be recreated. 32 | } 33 | 34 | /* 35 | #pragma mark - Navigation 36 | 37 | // In a storyboard-based application, you will often want to do a little preparation before navigation 38 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 39 | // Get the new view controller using [segue destinationViewController]. 40 | // Pass the selected object to the new view controller. 41 | } 42 | */ 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch0.jpg -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch1.jpg -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch2.jpg -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/launch3.png -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MFCoderMan/LaunchIntroductionDemo/849b048a40a205fd1b4cc726c2ba41cc3979bfe6/ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/login.png -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ZYGLaunchIntroductionDemo 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. 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 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemoTests/ZYGLaunchIntroductionDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ZYGLaunchIntroductionDemoTests.m 3 | // ZYGLaunchIntroductionDemoTests 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ZYGLaunchIntroductionDemoTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ZYGLaunchIntroductionDemoTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemoUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ZYGLaunchIntroductionDemo/ZYGLaunchIntroductionDemoUITests/ZYGLaunchIntroductionDemoUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ZYGLaunchIntroductionDemoUITests.m 3 | // ZYGLaunchIntroductionDemoUITests 4 | // 5 | // Created by ZhangYunguang on 16/4/7. 6 | // Copyright © 2016年 ZhangYunguang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ZYGLaunchIntroductionDemoUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ZYGLaunchIntroductionDemoUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | --------------------------------------------------------------------------------