啟動圖是在iOS開發過程中必不可少的一個部分,很多app在啟動圖之後會有一張自定義的開屏廣告圖,點選該廣告圖可以跳轉到廣告圖對應的頁面。今天呢,和大家分享一下如何新增這張廣告圖以及點選廣告圖的跳轉。這個廣告圖是通過將UIImageView
新增到UIWindow
上實現的。
一.新增本地啟動圖
1.準備好本地圖片
2.找到工程中的Images.xcassets
檔案,開啟LaunchImage
,將圖片拖到對應的地方,如下圖:
3.將LaunchScreen.storyboard
檔案中右邊的Use as Launch Screen
選項關閉(不要選擇此項)如圖:
4.將Launch Images Source
選擇為LaunchImage
,再將Launch Screen File
置空。如圖:
5.可在Appdelegate
中設定啟動圖停留的時間
// 啟動頁停留1秒 [NSThread sleepForTimeInterval:1];
6.執行工程可看到設定的啟動圖(如果沒有,可將app先刪除,然後重新執行一次即可)
二.新增開屏廣告圖
這個廣告圖的實現是基於作者周煥強的App啟動載入廣告頁面思路,然後自己增加了一些小補充。因為廣告是有時效性的,不是每次啟動的時候都會去顯示這個廣告頁面。所以這裡的原則是,後臺返回的資料中包括廣告圖片、廣告圖片對應的URL、以及該廣告的截止時間。執行程式時會請求廣告圖資料,將資料儲存到本地。再次執行時從本地中將儲存的圖片取出,同時判斷圖片的截止日期是否有效,若圖片存在且在有效期內,則將廣告圖顯示出來;再次請求廣告圖資料,以免有新的廣告資料。
1.建立自定義的SplashScreenView
。我在將ImageView加到Window上時,遇到新增不成功的情況,後面列印window的時候發現,window的hidden
屬性是YES
,於是將其設為NO
後就成功了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** 顯示廣告頁面方法*/ - (void)showSplashScreenWithTime:(NSInteger )ADShowTime; /** 廣告圖的顯示時間*/ @property (nonatomic, assign) NSInteger ADShowTime; /** 圖片路徑*/ @property (nonatomic, copy) NSString *imgFilePath; /** 圖片對應的url地址*/ @property (nonatomic, copy) NSString *imgLinkUrl; /** 廣告圖的有效時間*/ @property (nonatomic, copy) NSString *imgDeadline; |
2.實現顯示廣告頁的方法,這裡會根據儲存下來的廣告圖截止時間和是否有該圖片去顯示。比較日期的先後,可以先將當前日期和儲存下來的廣告圖轉換成相同的日期格式,將兩者進行比較,根據比較結果的 升序或降序來判斷日期的先後。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
- (void)showSplashScreenWithTime:(NSInteger)ADShowTime { _ADShowTime = ADShowTime; [_countButton setTitle:[NSString stringWithFormat:@"跳過%ld",ADShowTime] forState:UIControlStateNormal]; // NSDateFormatter *dataFormatter = [[NSDateFormatter alloc] init]; dataFormatter.dateFormat = @"MM/dd/yyyy HH:mm"; //獲取當前系統的時間,並用相應的格式轉換 [dataFormatter stringFromDate:[NSDate date]]; NSString *currentDayStr = [dataFormatter stringFromDate:[NSDate date]]; NSDate *currentDate = [dataFormatter dateFromString:currentDayStr]; //廣告截止的時間,也用相同的格式去轉換 NSString * timeStampString = self.imgDeadline; //時間戳的日期格式轉換方法 // NSTimeInterval _interval=[timeStampString doubleValue] / 1000.0; // NSDate *date = [NSDate dateWithTimeIntervalSince1970:_interval]; // NSString *deadlineStr = [dataFormatter stringFromDate:date]; // NSDate *dateA = [dataFormatter dateFromString:deadlineStr]; // NSDate *deadlineDate = [dataFormatter dateFromString:_imgDeadline]; NSDate *deadlineDate = [dataFormatter dateFromString:_imgDeadline]; NSLog(@"當前日期:%@ 存下的截止日期:%@", currentDayStr, timeStampString); NSComparisonResult result; result = [deadlineDate compare:currentDate]; /** * 將存下來的日期和當前日期相比,如果當前日期小於存下來的時間,則可以顯示廣告頁,反之則不顯示 */ if (result == NSOrderedAscending) { [self dismiss]; }else{ [self startTimer]; UIWindow *window = [[UIApplication sharedApplication].delegate window]; window.hidden = NO; [window addSubview:self]; } } |
3.請求廣告資料。請求資料時,先判斷該圖片是否存在,如果不存在的話,先將舊的圖片刪除掉,然後去下載新的圖片。刪除就照片的時候需要注意,先去判斷儲存下來的圖片名字和本地沙盒中存在的圖片是否一致,如果不一致,說明圖片有更新,此時刪除沙盒中的舊圖片,如果一致,則不需要進行刪除操作,否則找不到已儲存的圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
+ (void)getAdvertisingImageData { NSArray *imageArray = @[@"http://img1.126.net/channel6/2016/022471/0805/2.jpg?dpi=6401136", @"http://image.woshipm.com/wp-files/2016/08/555670852352118156.jpg"]; NSString *imageUrl = imageArray[0]; NSString *imgLinkUrl = @"http://www.jianshu.com/users/e4c63b354a77/latest_articles"; NSString *imgDeadline = @"08/30/2016 14:25"; // 獲取圖片名 NSArray *stringArr = [imageUrl componentsSeparatedByString:@"/"]; NSString *imageName = stringArr.lastObject; // 拼接沙盒路徑 NSString *filePath = [self getFilePathWithImageName:imageName]; BOOL isExist = [self isFileExistWithFilePath:filePath]; if (!isExist){// 如果該圖片不存在,則刪除老圖片,下載新圖片 [self downloadAdImageWithUrl:imageUrl imageName:imageName imgLinkUrl:imgLinkUrl imgDeadline:imgDeadline]; } } /** * 下載新的圖片 */ + (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName imgLinkUrl:(NSString *)imgLinkUrl imgDeadline:(NSString *)imgDeadline { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]; UIImage *image = [UIImage imageWithData:data]; NSString *filePath = [self getFilePathWithImageName:imageName]; // 儲存檔案的名稱 [UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES]; if ([UIImageJPEGRepresentation(image, 0) writeToFile:filePath atomically:YES]) { // 儲存成功 //判斷儲存下來的圖片名字和本地沙盒中存在的圖片是否一致,如果不一致,說明圖片有更新,此時先刪除沙盒中的舊圖片,如果一致說明是刪除快取後再次下載,這時不需要進行刪除操作,否則找不到已儲存的圖片 if (![imageName isEqualToString:[[NSUserDefaults standardUserDefaults] objectForKey:adImageName] ]) { [self deleteOldImage]; } [[NSUserDefaults standardUserDefaults] setValue:imageName forKey:adImageName]; [[NSUserDefaults standardUserDefaults] setValue:imgLinkUrl forKey:adUrl]; [[NSUserDefaults standardUserDefaults] setValue:imgDeadline forKey:adDeadline]; [[NSUserDefaults standardUserDefaults] synchronize]; }else{ NSLog(@"儲存失敗"); } }); } /** * 刪除舊圖片 */ + (void)deleteOldImage { NSString *imageName = [[NSUserDefaults standardUserDefaults] valueForKey:adImageName]; if (imageName) { NSString *filePath = [self getFilePathWithImageName:imageName]; NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager removeItemAtPath:filePath error:nil]; [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:adImageName]; [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:adUrl]; [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:adDeadline]; [[NSUserDefaults standardUserDefaults] synchronize]; } } |
最後的效果如圖: