iOS關於啟動頁自定義特殊處理

来源:http://www.cnblogs.com/wujy/archive/2016/02/17/5194835.html
-Advertisement-
Play Games

平常開發中對於啟動頁可能會有一些特別的要求,比如在啟動頁加動畫或加一些按鍵可以響應事件等,最近項目中要在啟動頁增加版本號,因為版本號是不斷的改變,所以要動態實現把它加到啟動頁上;在XCode上面配置的Launch Images Source或Launch Screen FIle(IOS8以上會優先調


平常開發中對於啟動頁可能會有一些特別的要求,比如在啟動頁加動畫或加一些按鍵可以響應事件等,最近項目中要在啟動頁增加版本號,因為版本號是不斷的改變,所以要動態實現把它加到啟動頁上;在XCode上面配置的Launch Images Source或Launch Screen FIle(IOS8以上會優先調用這個作為啟動項)都是保存一張靜態圖片;

原理:

其實原理也是很簡單,啟動頁還是運用Launch Images Source的內容,然後在做一個視圖在最上層,視圖的背景用啟動項的那張圖,讓人誤以為還在啟動中,啟動頁載入完成後,就顯示這層視圖,在2秒後再把這層視圖刪除,產生一個過度的假啟動頁效果;而我們自定義的動作就可以在這層視圖上進行;下麵將通過Coding.net的APP講解這個功能;

一:創建一個視圖EaseStartView

EaseStartView.h文件內容:

#import <UIKit/UIKit.h>

@interface EaseStartView : UIView
+ (instancetype)startView;

- (void)startAnimationWithCompletionBlock:(void(^)(EaseStartView *easeStartView))completionHandler;
@end

EaseStartView.m文件內容:

#import "EaseStartView.h"
#import <NYXImagesKit/NYXImagesKit.h>
#import "StartImagesManager.h"

@interface EaseStartView ()
@property (strong, nonatomic) UIImageView *bgImageView, *logoIconView;
@property (strong, nonatomic) UILabel *descriptionStrLabel;
@end

@implementation EaseStartView

+ (instancetype)startView{
    UIImage *logoIcon = [UIImage imageNamed:@"logo_coding_top"];
    StartImage *st = [[StartImagesManager shareManager] randomImage];
    return [[self alloc] initWithBgImage:st.image logoIcon:logoIcon descriptionStr:st.descriptionStr];
}

- (instancetype)initWithBgImage:(UIImage *)bgImage logoIcon:(UIImage *)logoIcon descriptionStr:(NSString *)descriptionStr{
    self = [super initWithFrame:kScreen_Bounds];
    if (self) {
        //add custom code
        UIColor *blackColor = [UIColor blackColor];
        self.backgroundColor = blackColor;
        
        _bgImageView = [[UIImageView alloc] initWithFrame:kScreen_Bounds];
        _bgImageView.contentMode = UIViewContentModeScaleAspectFill;
        _bgImageView.alpha = 0.0;
        [self addSubview:_bgImageView];
        
        [self addGradientLayerWithColors:@[(id)[blackColor colorWithAlphaComponent:0.4].CGColor, (id)[blackColor colorWithAlphaComponent:0.0].CGColor] locations:nil startPoint:CGPointMake(0.5, 0.0) endPoint:CGPointMake(0.5, 0.4)];

        _logoIconView = [[UIImageView alloc] init];
        _logoIconView.contentMode = UIViewContentModeScaleAspectFit;
        [self addSubview:_logoIconView];
        _descriptionStrLabel = [[UILabel alloc] init];
        _descriptionStrLabel.font = [UIFont systemFontOfSize:10];
        _descriptionStrLabel.textColor = [UIColor colorWithWhite:1.0 alpha:0.5];
        _descriptionStrLabel.textAlignment = NSTextAlignmentCenter;
        _descriptionStrLabel.alpha = 0.0;
        [self addSubview:_descriptionStrLabel];
        
        [_descriptionStrLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(@[self, _logoIconView]);
            make.height.mas_equalTo(10);
            make.bottom.equalTo(self.mas_bottom).offset(-15);
            make.left.equalTo(self.mas_left).offset(20);
            make.right.equalTo(self.mas_right).offset(-20);
        }];

        [_logoIconView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.equalTo(self);
            make.top.mas_equalTo(kScreen_Height/7);
            make.width.mas_equalTo(kScreen_Width *2/3);
            make.height.mas_equalTo(kScreen_Width/4 *2/3);
        }];
        
        [self configWithBgImage:bgImage logoIcon:logoIcon descriptionStr:descriptionStr];
    }
    return self;
}

- (void)configWithBgImage:(UIImage *)bgImage logoIcon:(UIImage *)logoIcon descriptionStr:(NSString *)descriptionStr{
    bgImage = [bgImage scaleToSize:[_bgImageView doubleSizeOfFrame] usingMode:NYXResizeModeAspectFill];
    self.bgImageView.image = bgImage;
    self.logoIconView.image = logoIcon;
    self.descriptionStrLabel.text = descriptionStr;
    [self updateConstraintsIfNeeded];
}

- (void)startAnimationWithCompletionBlock:(void(^)(EaseStartView *easeStartView))completionHandler{
    [[UIApplication sharedApplication].keyWindow
 addSubview:self];
    [[UIApplication sharedApplication].keyWindow
 bringSubviewToFront:self];
    _bgImageView.alpha = 0.0;
    _descriptionStrLabel.alpha = 0.0;

    @weakify(self);
    [UIView animateWithDuration:2.0 animations:^{
        @strongify(self);
        self.bgImageView.alpha = 1.0;
        self.descriptionStrLabel.alpha = 1.0;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.6 delay:0.3 options:UIViewAnimationOptionCurveEaseIn animations:^{
            @strongify(self);
            [self setX:-kScreen_Width];
        } completion:^(BOOL finished) {
            @strongify(self);
            [self removeFromSuperview];
            if (completionHandler) {
                completionHandler(self);
            }
        }];
    }];
}

@end

其實本實例中最為關鍵的內容在方法startAnimationWithCompletionBlock里

    [[UIApplication sharedApplication].keyWindow addSubview:self];
    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:self];

代碼就是把這個視圖設置成在最前的最上層,這樣就可以蓋住程式中的頁面;

    _bgImageView.alpha = 0.0;
    _descriptionStrLabel.alpha = 0.0;

這個是為了下麵的動畫做準備,若是直接用背景圖可以把這兩個都設置成0.99這樣就不會有一閃的錯覺;

    @weakify(self);
    [UIView animateWithDuration:2.0 animations:^{
        @strongify(self);
        self.bgImageView.alpha = 1.0;
        self.descriptionStrLabel.alpha = 1.0;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.6 delay:0.3 options:UIViewAnimationOptionCurveEaseIn animations:^{
            @strongify(self);
            [self setX:-kScreen_Width];
        } completion:^(BOOL finished) {
            @strongify(self);
            [self removeFromSuperview];
            if (completionHandler) {
                completionHandler(self);
            }
        }];
    }];

這邊是動畫效果,時間設置為2秒,因為這邊第一個動畫完還有一個左移出啟動頁的效果;當動畫結束後就可以  [self removeFromSuperview];

二:調用啟動頁視圖

在AppDelegate中的didFinishLaunchingWithOptions進行調用;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    //網路
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    
    //設置導航條樣式
    [self customizeInterface];
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];


    if ([Login isLogin]) {
        [self setupTabViewController];
    }else{
        [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
        [self setupIntroductionViewController];
    }
    [self.window makeKeyAndVisible];
    [FunctionIntroManager showIntroPage];

    EaseStartView *startView = [EaseStartView startView];
    @weakify(self);
    [startView startAnimationWithCompletionBlock:^(EaseStartView *easeStartView) {
        @strongify(self);
        //可以做其它事情
    }];
    
    return YES;
}

註意,EaseStartView代碼的位置是要放在最後面,因為要讓它蓋在最上層,就要後面載入,這樣就可以蓋在登錄頁面上面或者主頁上;到這就已經可以成功啟動頁的效果;

三:下麵實例為項目中用到的動態載入版本號到啟動頁上

#import "StartUpView.h"

@interface StartUpView()
@property (strong, nonatomic) UIImageView *bgImageView;
@property (strong, nonatomic) UILabel *descriptionStrLabel;
@end

@implementation StartUpView

+ (instancetype)startView
{
    UIImage *bgImage=kshamLaunchImage;
    return [[self alloc] initWithBgImage:bgImage];
}


- (instancetype)initWithBgImage:(UIImage *)bgImage
{
    self = [super initWithFrame:Main_Screen_Bounds];
    if (self) {
        
        _bgImageView = [[UIImageView alloc] initWithFrame:Main_Screen_Bounds];
        _bgImageView.contentMode = UIViewContentModeScaleAspectFill;
        _bgImageView.alpha = 0;
        _bgImageView.image=bgImage;
        [self addSubview:_bgImageView];
        
        _descriptionStrLabel = [[UILabel alloc] init];
        _descriptionStrLabel.font = [UIFont systemFontOfSize:15];
        _descriptionStrLabel.textColor = [UIColor blackColor];
        _descriptionStrLabel.textAlignment = NSTextAlignmentCenter;
        _descriptionStrLabel.alpha = 0;
        _descriptionStrLabel.text=[NSString stringWithFormat:@"版本號為:%@",appVersion];
        [self addSubview:_descriptionStrLabel];
        
        [_descriptionStrLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.height.mas_equalTo(50);
            make.bottom.equalTo(self.mas_bottom).offset(-15);
            make.left.equalTo(self.mas_left).offset(20);
            make.right.equalTo(self.mas_right).offset(-20);
        }];
    }
    return self;
}

- (void)startAnimationWithCompletionBlock:(void(^)(StartUpView *easeStartView))completionHandler{
    [[UIApplication sharedApplication].keyWindow addSubview:self];
    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:self];
    _bgImageView.alpha = 0.99;
    _descriptionStrLabel.alpha = 0.99;
    
    @weakify(self);
    [UIView animateWithDuration:2.0 animations:^{
        @strongify(self);
        self.bgImageView.alpha = 1.0;
        self.descriptionStrLabel.alpha = 1.0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
        if (completionHandler) {
            completionHandler(self);
        }
    }];
}
@end

 


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

-Advertisement-
Play Games
更多相關文章
  • 本文內容大綱: 1、回顧NSURLSessionTask 2、NSURLSessionDownloadTask大文件之block下載 3、NSURLSessionDownloadTask大文件之代理方法下載 4、NSURLSessionDownloadTask大文件之代理方法實現斷點續傳下載 前言:
  • 在Android版YouTube播放器API使您可以將視頻播放功能到你的Android應用程式。該API允許您載入和播放YouTube視頻(和播放列表),並自定義和控制視頻播放體驗。 您可以載入或暗示的視頻嵌入到你的應用程式的用戶界面的球員視圖。然後,您可以通過編程式控制制播放。例如播放,暫停,或尋求在
  • 本篇寫的是實現環形進度條,並帶動畫效果,要實現這些,僅能通過自己畫一個 方法直接看代碼 為了方便多次調用,用繼承UIView的方式 .m文件 1 #import <UIKit/UIKit.h> 2 3 @interface LoopProgressView : UIView 4 5 @propert
  • 游戲開發賺錢如此輕鬆? 手游席卷大中小學,你還在等什麼呢?
  • [_loadImageViewsetShowActivityIndicatorView:YES]; [_loadImageViewsetIndicatorStyle:UIActivityIndicatorViewStyleGray]; _loadImageView.contentMode = UIV
  • Android系統四層架構 個人網站:http://www.51pansou.com Android視頻下載:Android視頻 Android源碼下載:Android源碼 如果把Android系統看做一層一層的,那麼基本可以理解成以下結構(這是其中一種簡單的分層方式):1、最上層是應用層(Appl
  • 項目中的需求~~~~ 商城中物品的一個本身價格,還有一個就是優惠價格。。。需要用到一個刪除線。 public class TestActivity extends Activity { private TextView tv; @Override public void onCreate(Bundl
  • Android開發必看-快速提高 Android 開發效率的 Web 工具 本文摘自同行說用戶“Alex”分享的文章,原文鏈接:http://droidyue.com/blog/2014/08/03/great-web-tools-for-android-development/?comefrom=
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...