【IOS】模仿"抽屜新熱榜"動態啟動頁YFSplashScreen

来源:http://www.cnblogs.com/yffswyf/archive/2016/06/15/5585157.html
-Advertisement-
Play Games

IOS最好要設置系統預設啟動頁面,不然進入應用就會突然閃現黑色畫面 下圖是我們要實現的效果: 總體思路:設置一個系統預設啟動頁面,在進入didFinishLaunchingWithOptions時, 給Window添加自定義啟動頁,其初始畫面和系統啟動頁一樣。 可在自定義啟動頁實現一些動畫,動畫結束 ...


IOS最好要設置系統預設啟動頁面,不然進入應用就會突然閃現黑色畫面

下圖是我們要實現的效果:

總體思路:設置一個系統預設啟動頁面,在進入didFinishLaunchingWithOptions時,

給Window添加自定義啟動頁,其初始畫面和系統啟動頁一樣。

可在自定義啟動頁實現一些動畫,動畫結束後,將自定義啟動頁移除。

 

一.設置系統預設啟動頁

現在,新建項目會自動生成LaunchScreen.storyboard啟動頁面文件。

來到項目根目錄  點擊General  找到以下:

發現除了直接設置Launch Screen File,還能夠設置Launch Image Source來實現添加啟動頁面。

所以我們來使用這種方式來實現吧。使用Assets.xcassets添加圖片,

1.LaunchScreen.storyboard我們用不到了,可以將其刪除。同時第三行將Launch Screen File設為空。

2.第二行,點擊User Asset Cattalog  -> Migrate:  此時Luanch Images Source會變為  Brand Assets

但這不是我們需要的。因此,點擊右邊的箭頭,進入Assets.xcassets, 在AppIcon那邊右鍵,選中

App Icons&Launch Images->New IOS Launch Images,此時在右側會出現很多可填入圖片的框框。

之後返回將第二行選中LuanchImage,設置完成後結果如下圖所示。

 

現在給剛纔新建的LaunchImage添加圖片就能夠展示系統預設的啟動畫面了。

網上很多教程都是到此為止,到底該如何添加圖片卻不知道了。如何設置圖片請往下看。

(導致的結果就是添加了圖片後出現上下都有大塊黑邊的情況或者沒有圖片展示)

 

二.設置系統啟動頁圖片

LaunchImage裡面的內容如下,並且我已經把對應的圖片解析度標註出來了。

(為了適配不同大小的屏幕,除了Landscape橫屏,總共需要五張不同解析度的圖,已經用顏色區分了)

 然後是不同尺寸設備所使用的圖片(這個名稱只是為了更好的對應起來,將圖片放入LaunchImage對應位置)

這裡的邏輯坐標系(解析度)大小可以理解為獲取到的 [UIScreen mainScreen].bounds.size大小.

所以將上述5種解析度圖片對應放入,就能夠實現正常的系統預設啟動頁了。

 (註意:不將這些添加到項目里,直接拖動到LaunchImage的對應位置就可以了,在目錄下

Assets.xcassets/LaunchImage.launchimage你能看到自動生成的對應特定名稱的圖片,共7張) 

三.自定義頁面UIView

1.設置背景

系統預設啟動畫面結束之後,顯示的就是我們添加在Window上的自定義UIView。

為了畫面的流暢性,背景依然需要設置為和啟動畫面一樣的圖片。

針對不同的設備,系統預設的啟動畫面會顯示不同的圖片,如果我們手動去判斷賦值UIView背景,未免有些麻煩。

我們可以通過NSBundle中的infoDictionary的"UILaunchImages"獲取當前使用的LaunchImage。

上述獲取到的為一個字典數組DicArrays,其數量會隨著你添加的LaunchImage圖片而改變。

這裡我列出適配所有屏幕(DicArrays數量為4)時獲取到的DicArays.  如下表格: 

因此我們只需遍歷出對應大小和方向的UILanuchimageName的值就可以了。

-(NSString *)getCurrentLaunchImageNameForOrientation:(UIInterfaceOrientation)orientation{
    NSString *currentImageName = nil;

    CGSize viewSize = self.bounds.size;
    NSString* viewOrientation = @"Portrait";

    if(UIInterfaceOrientationIsLandscape(orientation)){
        viewSize = CGSizeMake(viewSize.height, viewSize.width);
        viewOrientation = @"Landscape";
    }
    
    NSArray *imageDicts = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
    for (NSDictionary * dic in imageDicts) {
        CGSize imageSize = CGSizeFromString(dic[@"UILaunchImageSize"]);  //將字元串轉換為Size
        NSString *orientation = dic[@"UILaunchImageOrientation"];  //取得方向
        if(CGSizeEqualToSize(viewSize, imageSize) && [orientation isEqualToString:viewOrientation]){
            currentImageName = dic[@"UILaunchImageName"];  
        }
    }
    
    return currentImageName;
}

 獲取到名稱後,就可以直接通過該名稱給UIImage賦值了。

 

 2.設置圖標和名稱

有沒有註意到上面的示意圖裡,"抽屜新熱榜"的圖標和文字是一直存在的,之後背景色改變為其他圖片。

我的想法是將抽屜新熱榜的圖標和文字覆蓋在最上層。在系統預設啟動圖完成後,視圖的結構如圖所示。 

(紅圈內,從左到右分別是頂層的圖片+文字,進行動畫的UIImageView, UIView本身的背景圖片)

由此可知,我們需在預設的UIVIew最頂端添加和背景圖片離位置一模一樣的圖標和文字,以保證從系統的LaunchImage跳轉到自定義頁面,其中的內容是不會變化的。然而啟動畫面有多種尺寸,所以需要將圖標按照一定的比例添加到UIView上。所以啟動畫面最好也要以某一比例來進行內部的圖標、文字設計。

 

但是由於沒有美工,我想到了一個辦法。直接先將圖標、文字、背景按照一定比例佈局到UIView上,然後給不同模擬器截圖。

(我的佈局:  正方形圖標寬度、高度均為屏幕寬度的1/6    圖標y值為屏幕高度1/7)

在4、4.7、5、5.5英寸模擬器上,切換到最大視窗(Command+1)後  截圖(Command+S)就能夠獲取想要的比例

在3.5英寸模擬器上,Command+ 1 為: 640 * 960        Command+3 為:  320*480

這樣不但得到了啟動圖片,你也有了最上層圖片和文字的佈局。

 

3.網路請求和沙盒保存

現在整體做好了,還有一個功能,是在客戶端內可更換網路圖片,在下次重新進入應用後生效。

所以涉及到了網路請求NSURLSession和沙盒,這裡省略並作一些記錄。

使用TaskDownloadSession等相關對象

a.實現了block,就無法進入協議中,而delegate的協議可以進行恢復下載、實時進度等控制.

b.實現進度控制的協議里 totalBytesExpectedToWrite為-1 解決辦法:

NSMutableURLRequest *request;

[request setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];

見StackOverFlow : MBProgressHUD with NSURLConnection

 

源碼以及說明詳見GitHub: YFSplashScreen

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.AFNetworking 目前比較推薦的iOS網路請求組件,預設網路請求是非同步,通過block回調的方式對返回數據進行處理。 2.FMDB 對sqlite資料庫操作進行了封裝,demo也比較簡單。 3.MBProgressHUD 也是iOS項目常用的一個組件,用於顯示過渡效果的,比如網路請求之前 ...
  • 話不多說, 直接上主題。 log4android 是一個類似於log4j的開源android 日誌記錄項目。 項目基於 microlog 改編而來, 新加入了對文件輸出的各種定義方式。 項目地址: 點擊這裡 (https://github.com/lisicnu/Log4Android) 使用方式: ...
  • Sample Apps by Android Team 代碼下載:http://pan.baidu.com/s/1eSNmdUE , 代碼原地址:https://code.google.com/archive/p/apps-for-android/ 註:代碼不是直接能夠運行的項目,需要自己新建項目, ...
  • 接著上文《Android 內容提供者簡介》進一步實現內容提供者。 每個Content Provider類都使用URI(Universal Resource Identifier,通用資源標識符)作為獨立的標識,格式如:content://com.example.app.provider/table1 ...
  • iOS 10 都有什麼改變? 看這一個貼就夠了 最全面的試用 蘋果在 WWDC 2016 發佈會上正式發佈了 iOS 10 操作系統,iOS 與 macOS、tvOS 和 watchOS 構建了蘋果四大平臺,其中 iOS 平臺至關重要,成為連接 watchOS 和 macOS 的重要媒介。與 iOS ...
  • 1.在工作區的.gitignore文件中配置如下: # Built application files*.apk*.ap_ # Files for the Dalvik VM*.dex # Java class files*.class # Generated filesbin/gen/ # Gra ...
  • RunLoop 基礎知識 作用 保持程式持續運行 處理app中的各種事件(如觸摸事件、定時器事件【NSTimer】、selector事件【選擇器·performSelector···】) 節省CPU資源,提高程式性能 說明 沒有RunLoop,那麼程式一啟動就會退出 有了Runoop,那麼相當於在內 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...