最近專案在做的廣告sdk,剛好自己需要去了解這個實現啟動圖載入廣告這個功能,大家應該都瞭解,之前Xcode 6是LaunchScreen.xib來當作啟動檢視,不過到了Xcode 7就變成了Launch Screen.storyboard,其實這兩個沒有多大的區別,以下我就採用Xcode 7提供的LaunchScreen.storyboard 來實現這個功能,現在把自己經驗和程式碼分享出來。
主要思路
獲取Launch Screen.storyboard
通過使用storyborardID去獲取啟動檢視viewcontroller
獲取啟動viewController的檢視view
之後把檢視view新增到window中
最後就是新建一個圖片貼在檢視view中
做個定時觸發處理
廢話不多說啦,直接貼程式碼出來:
AppDelegate.m中的程式碼
//獲取LaunchScreen.storyborad
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Launch Screen" bundle:nil];
//通過使用storyborardID去獲取啟動頁viewcontroller
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"LaunchScreen"];
//獲取viewController的檢視
self.view = viewController.view;
//把檢視新增到window
[self.window addSubview:self.view];
self.launchView = [[UIImageView alloc] initWithFrame:self.window.frame];
[self.launchView setImage:[UIImage imageNamed:@"launch.jpg"]];//這邊圖片可以做網路請求載入圖片、視訊動畫或者其他自定義的引導頁
[self.view addSubview:self.launchView];
//將圖片檢視推送到前面
[self.window bringSubviewToFront:self.launchView];
//設定3秒定時觸發
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(colseLaunchScreen) userInfo:nil repeats:NO];
- (void)colseLaunchScreen {
if (self.launchView) {
[self.launchView removeFromSuperview];
self.launchView = nil;
}
if (self.view) {
[self.view removeFromSuperview];
self.view = nil;
}
}
這邊也可以結合LaunchImage使用,方式也是差不多,這邊就不多講了
注意有個坑已填平了:之前我用的xcode專案中General中Main Interface 啟動專案初始化的主介面storyboard,用以上方法一直看不到載入的廣告,後面使用在AppDelegate程式碼方式去載入storyboard,就可以載入出來了,目前不清楚這個是什麼問題,待研究發現,如有發現朋友,方便留言告知下,謝啦(後面經過友友們的指出,發現如果不是用程式碼載入storyboard,那General->Main Interface->的main.storyboard載入會新建window,跟你之前傳入的window不是同一個,這個之前的就被覆蓋了,導致看不到廣告效果,之後我修改了方案,把window改成用window中viewController中view這要就避免程式碼載入stroyboard了)
這裡注意一下,上面這個使用storyboard啟動適用ios8.0以上,但現在應用差不多都是ios7.0起,開發者為了方便適配,大多都採用launchImage啟動,這種也可以使用storyboard去獲取廣告,完全沒有問題,但在載入初始化廣告肯定會消耗一點點時間這要就會出現短暫storyboard的預設頁面,這個可以通過把獲取rootview先隱藏,等載入完畢廣告再顯示出來!這要問題解決了!
如果先獲取launchImage的圖片可以採用Cherpak Evgeny 分享在stackflow上的一個直接讀取NSBundle中的設定 即可獲取當前適用的LaunchImage的辦法,程式碼我也貼出來:
CGSize viewSize =self.window.bounds.size;
NSString *viewOrientation =@"Portrait";//橫屏請設定成 @"Landscape"
NSString *launchImage =nil;
NSArray *imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
for(NSDictionary* dict in imagesDict) {
CGSize imageSize =CGSizeFromString(dict[@"UILaunchImageSize"]);
if(CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]]) {
launchImage = dict[@"UILaunchImageName"];
}
}
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImageimageNamed:launchImage]];
launchView.frame=self.window.bounds;
launchView.contentMode=UIViewContentModeScaleAspectFill;
[self.window addSubview:launchView];
[UIView animateWithDuration:2.0f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
launchView.alpha=0.0f;
launchView.layer.transform=CATransform3DScale(CATransform3DIdentity,1.2,1.2,1);
}
completion:^(BOOL finished) {
[launchView removeFromSuperview];
}];