iOS启动图片与开屏广告

目前大多数APP的启动图片还是launchImage的形式,这张启动图片显示的时间很短,大概不到0.5s左右,有时候我们启动的时候一些初始化的步骤或者网络不好的情况会花掉1~2s的时间,会造成很不好的体验,网上有人说让线程睡1s,但是这个睡眠过程中app不会做任何事,只是单纯的延长了启动图片的时间。还有就是一些节假日app想要发布一些主题开屏,但是公司的输求是不能在app中预留这些图片,只能从网络中获取。

于是乎我有了余下的想法:

1>启动时,下载一张图片到launchImage中,然后用于下一次启动。这样的好处就是能做到无缝衔接,不会有过渡的过程。(这种方法不知道能不能实现)

2>launchImage放一张只带有logo的白色图片,然后再app中放一张基本上能通用的图片,主题开屏的图片从网上下载。在app中放一张通用的开屏图片是为了防止主题图片没有下载好用到的。从只有白色logo的启动图片到开屏图的过渡时间在iphone7大概只有0.2s左右,5s大概是0.5s左右。放白色logo图也就是为了过渡自然的效果,废话不多说上代码。

2.1>先初始化window,加载主控制器,在window上放的这张图片的时间是3s,网络基本还行的情况下,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) {//如果本地文件夹有下载的网络图片就用网络的
            
            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这张图片渲染成背景色,以及图片剪裁的处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 定义 避免请求发送者与接收者 耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传 递...
    NullPointers阅读 314评论 0 0
  • 职场上,有人对现任职位缺乏激情,想要追随理想,又担心愿望落空;有人不喜欢目前的工作,急于转行,又怕再次入错行;有人...
    家宁啊阅读 414评论 0 1
  • 吃饭这件事男人挑女人馋,这是本性,是根据这一段时间的见闻发现的,进行总结分析的结果。 虽然男人女人坐在一桌上吃...
    ouzar阅读 1,449评论 0 4