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)系作者
  • 序言:七十年代末彻磁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖鞍匾,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件置森,死亡現(xiàn)場離奇詭異,居然都是意外死亡漾稀,警方通過查閱死者的電腦和手機啰脚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門贮配,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼蛀,“玉大人夫植,你說我怎么就攤上這事∩蚩纾” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贰镣。 經(jīng)常有香客問我恭陡,道長劫狠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任罚随,我火速辦了婚禮屠升,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缨历。我一直安慰自己赡磅,他們只是感情好魄缚,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布冶匹。 她就那樣靜靜地躺著,像睡著了一般袒餐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卧檐,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天佛嬉,我揣著相機與錄音湾揽,去河邊找鬼。 笑死民晒,一個胖子當著我的面吹牛垂攘,可吹牛的內(nèi)容都是我干的钝凶。 我是一名探鬼主播仪芒,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕陷!你這毒婦竟也來了掂名?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哟沫,失蹤者是張志新(化名)和其女友劉穎饺蔑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜诀,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡猾警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隆敢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片发皿。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拂蝎,靈堂內(nèi)的尸體忽然破棺而出穴墅,到底是詐尸還是另有隱情,我是刑警寧澤温自,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布玄货,位于F島的核電站,受9級特大地震影響悼泌,放射性物質(zhì)發(fā)生泄漏松捉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一馆里、第九天 我趴在偏房一處隱蔽的房頂上張望隘世。 院中可真熱鬧掉盅,春花似錦、人聲如沸以舒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔓钟。三九已至永票,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滥沫,已是汗流浹背侣集。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兰绣,地道東北人世分。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像缀辩,于是被迫代替她去往敵國和親臭埋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

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