目前大多數(shù)APP的啟動圖片還是launchImage的形式贸宏,這張啟動圖片顯示的時間很短,大概不到0.5s左右锚赤,有時候我們啟動的時候一些初始化的步驟或者網(wǎng)絡不好的情況會花掉1~2s的時間线脚,會造成很不好的體驗叫榕,網(wǎng)上有人說讓線程睡1s,但是這個睡眠過程中app不會做任何事寓落,只是單純的延長了啟動圖片的時間伶选。還有就是一些節(jié)假日app想要發(fā)布一些主題開屏,但是公司的輸求是不能在app中預留這些圖片仰税,只能從網(wǎng)絡中獲取陨簇。
于是乎我有了余下的想法:
1>啟動時河绽,下載一張圖片到launchImage中,然后用于下一次啟動纹笼。這樣的好處就是能做到無縫銜接允乐,不會有過渡的過程削咆。(這種方法不知道能不能實現(xiàn))
2>launchImage放一張只帶有l(wèi)ogo的白色圖片拨齐,然后再app中放一張基本上能通用的圖片瞻惋,主題開屏的圖片從網(wǎng)上下載。在app中放一張通用的開屏圖片是為了防止主題圖片沒有下載好用到的掏导。從只有白色logo的啟動圖片到開屏圖的過渡時間在iphone7大概只有0.2s左右趟咆,5s大概是0.5s左右值纱。放白色logo圖也就是為了過渡自然的效果虐唠,廢話不多說上代碼。
2.1>先初始化window,加載主控制器疆偿,在window上放的這張圖片的時間是3s杆故,網(wǎng)絡基本還行的情況下反番,3s首頁的一些初始化罢缸、請求是基本能做完的。
self.window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = [[ALSRootViewController alloc] init];
[self.window makeKeyAndVisible];
ALSLaunchImageView *launchImageView = [[ALSLaunchImageView alloc] init];
[self.window addSubview:launchImageView];
[ALSLaunchImageView loadNewLaunchImage];
2.2> 初始化投队,用到的圖片是上一次啟動下載的,這也是為了使過渡時間盡可能的減小息楔,第一次啟動用的是通用的那張開屏的圖片
- (instancetype)init
{
if (self = [super init]) {
CGSize viewSize = CGSizeMake(KScreenWidth, KScreenHeight);
//橫屏請設置成 @"Landscape"
NSString *viewOrientation = @"Portrait";
NSString *launchImageName;
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"]])
{
launchImageName = dict[@"UILaunchImageName"];
}
}
UIImage * bgImage = [UIImage imageNamed:launchImageName];
//將app里面的launchImage這張圖片渲染到自身背景色
self.backgroundColor = [UIColor colorWithPatternImage:bgImage];
self.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
NSString *saveDiretory = [NSString stringWithFormat:@"%@/image",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]];
NSString *launchImagePath =[NSString stringWithFormat: @"%@/launchImage.png",saveDiretory];
NSData *launchImageData = [NSData dataWithContentsOfFile:launchImagePath];
UIImage *launchImage;
if (launchImageData) {//如果本地文件夾有下載的網(wǎng)絡圖片就用網(wǎng)絡的
launchImage = [UIImage imageWithData:launchImageData];
} else {//沒有就用放在APP里面的圖片
launchImage = [UIImage imageNamed:@"default_launchImage"];
}
//設置成圖片
UIImageView *launchImageView = [[UIImageView alloc] init];
//0 全屏 1 帶logo的屏
BOOL launchImageType = [ALSUserDefaults boolForKey:@"launchImageType"];
if (launchImageType) {
launchImageView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight - KScreenWidth / 3);
} else {
launchImageView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
}
//設置圖片,帶logo的需要剪裁
launchImageView.image = [self clipImage:launchImage targetSize:launchImageView.size];
[self addSubview:launchImageView];
//需要打開接收事件扒披,不然會有穿透效果
self.userInteractionEnabled = YES;
//怕商品推送圖片過來時值依,啟動圖片在推送圖片的下面
self.layer.zPosition = 10;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self closeAddImgAnimation];
});
}
return self;
}
2.3>剪裁圖片
- (UIImage *)clipImage:(UIImage *)sourceImage targetSize:(CGSize)defineSize {
if(defineSize.height == KScreenHeight){
return sourceImage;
} else { //半屏 需要剪裁
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat targetWidth = defineSize.width;
CGFloat widthSacler = width / targetWidth;
CGFloat height = widthSacler * defineSize.height;
CGSize size = CGSizeMake(width, height);
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, size.width, size.height)];
[path addClip];
// 5.畫圖片
[sourceImage drawAtPoint:CGPointZero];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
}
2.4>下載圖片,是否全屏顯示由后臺決定的
+ (void)loadNewLaunchImage {
NSString *url = [baseStr stringByAppendingString:@"api/app/appScreensaverAction_search"];
[ALSHttpTool GetWithURL:url params:nil success:^(id json) {
ALSLog(@"%@",json);
if ([json[@"rs"] integerValue] == 200) {
NSInteger type = [json[@"content"][@"type"] integerValue];
[ALSUserDefaults setBool:type forKey:@"launchImageType"];
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:json[@"content"][@"image"]] options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
NSFileManager *fm = [NSFileManager defaultManager];
NSString *saveDiretory = [NSString stringWithFormat:@"%@/image",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]];
BOOL isDirectory ;
BOOL isExist = [fm fileExistsAtPath:saveDiretory isDirectory:&isDirectory];
if (!isExist) {
[fm createDirectoryAtPath:saveDiretory withIntermediateDirectories:NO attributes:nil error:nil];
}
//寫入圖片
NSString *savePath =[NSString stringWithFormat: @"%@/launchImage.png",saveDiretory];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:savePath atomically:YES];
}
}];
}
} failure:^(NSError *error) {
}];
}
2.5>移除launchImage
-(void)closeAddImgAnimation
{
//這個比較自然碟案,設置alpha比較舒服
[UIView animateWithDuration:0.3 animations:^{
self.alpha = 0;
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
}
開屏廣告也是差不多的愿险,后臺獲取的圖片不能用于下一次,可能會有點延時价说。然后加一個跳過按鈕辆亏,讓圖片接受事件,大同小異鳖目,最主要的就是將放在app里面imageLaunch這張圖片渲染成背景色扮叨,以及圖片剪裁的處理