iOS啟動圖片與開屏廣告

目前大多數(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這張圖片渲染成背景色,以及圖片剪裁的處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,324評論 25 708
  • 定義 避免請求發(fā)送者與接收者 耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳 遞...
    NullPointers閱讀 324評論 0 0
  • 職場上,有人對現(xiàn)任職位缺乏激情,想要追隨理想,又擔心愿望落空;有人不喜歡目前的工作,急于轉(zhuǎn)行,又怕再次入錯行;有人...
    家寧啊閱讀 459評論 0 1
  • 吃飯這件事男人挑女人饞,這是本性,是根據(jù)這一段時間的見聞發(fā)現(xiàn)的,進行總結(jié)分析的結(jié)果。 雖然男人女人坐在一桌上吃...
    ouzar閱讀 1,506評論 0 4