iOS-啟動動態(tài)頁跳過設計思路

我們都知道 APP啟動時加載的是LaunchImage 這張靜態(tài)圖。現(xiàn)在好多應用啟動時都是動態(tài)的,并且右上角可選擇跳過僵闯。截圖如下:


這里介紹一下自己在做這種動畫時的一種方案。
啟動圖依然是加載的藤滥,只不過是一閃而過鳖粟,這時候我想到的是拿到當前的LaunchImage圖片,然后進行處理超陆,造成一種改變了LaunchImage動畫的假象牺弹。

思路如下:
根據(jù)UIBezierPath和CAShapeLayer自定義倒計時進度條,適用于app啟動的時候設置一個倒計時關閉啟動頁面时呀≌牌可以設置進度條顏色,填充顏色谨娜,進度條寬度以及點擊事件等航攒。

一. 設置跳過按鈕

ZLDrawCircleProgressBtn.h :

//  跳過按鈕

#import <UIKit/UIKit.h>

typedef void(^DrawCircleProgressBlock)(void);

@interface ZLDrawCircleProgressBtn : UIButton

//set track color
@property (nonatomic, strong) UIColor    *trackColor;

//set progress color
@property (nonatomic, strong) UIColor    *progressColor;

//set track background color
@property (nonatomic, strong) UIColor    *fillColor;

//set progress line width
@property (nonatomic, assign) CGFloat    lineWidth;

//set progress duration
@property (nonatomic, assign) CGFloat    animationDuration;

/**
 *  set complete callback
 *
 *  @param lineWidth line width
 *  @param block     block
 *  @param duration  time
 */
- (void)startAnimationDuration:(CGFloat)duration withBlock:(DrawCircleProgressBlock )block;

@end

ZLDrawCircleProgressBtn.m :
初始化相關跳過按鈕及進度圈

#import "ZLDrawCircleProgressBtn.h"

#define degreesToRadians(x) ((x) * M_PI / 180.0)

@interface ZLDrawCircleProgressBtn ()

// 底部進度條圈
@property (nonatomic, strong) CAShapeLayer *trackLayer;
// 表層進度條圈
@property (nonatomic, strong) CAShapeLayer *progressLayer;
@property (nonatomic, strong) UIBezierPath *bezierPath;
@property (nonatomic, copy)   DrawCircleProgressBlock myBlock;

@end

@implementation ZLDrawCircleProgressBtn 

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self == [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor clearColor];
        
        [self.layer addSublayer:self.trackLayer];
        
    }
    return self;
}

- (UIBezierPath *)bezierPath {
    if (!_bezierPath) {
        
        CGFloat width = CGRectGetWidth(self.frame)/2.0f;
        CGFloat height = CGRectGetHeight(self.frame)/2.0f;
        CGPoint centerPoint = CGPointMake(width, height);
        float radius = CGRectGetWidth(self.frame)/2;
        
        _bezierPath = [UIBezierPath bezierPathWithArcCenter:centerPoint
                                                     radius:radius
                                                 startAngle:degreesToRadians(-90)
                                                   endAngle:degreesToRadians(270)
                                                  clockwise:YES];
    }
    return _bezierPath;
}

- (CAShapeLayer *)trackLayer {
    if (!_trackLayer) {
        _trackLayer = [CAShapeLayer layer];
        _trackLayer.frame = self.bounds;
        // 圈內(nèi)填充色
        _trackLayer.fillColor = self.fillColor.CGColor ? self.fillColor.CGColor : [UIColor clearColor].CGColor ;
        _trackLayer.lineWidth = self.lineWidth ? self.lineWidth : 2.f;
        // 底部圈色
        _trackLayer.strokeColor = self.trackColor.CGColor ? self.trackColor.CGColor : [UIColor colorWithRed:197/255.0 green:159/255.0 blue:82/255.0 alpha:0.3].CGColor ;
        _trackLayer.strokeStart = 0.f;
        _trackLayer.strokeEnd = 1.f;
        
        _trackLayer.path = self.bezierPath.CGPath;
    }
    return _trackLayer;
}

- (CAShapeLayer *)progressLayer {
    
    if (!_progressLayer) {
        _progressLayer = [CAShapeLayer layer];
        _progressLayer.frame = self.bounds;
        _progressLayer.fillColor = [UIColor clearColor].CGColor;
        _progressLayer.lineWidth = self.lineWidth ? self.lineWidth : 2.f;
        _progressLayer.lineCap = kCALineCapRound;
        // 進度條圈進度色
        _progressLayer.strokeColor = self.progressColor.CGColor ? self.progressColor.CGColor  : [UIColor  colorWithRed:197/255.0 green:159/255.0 blue:82/255.0 alpha:1].CGColor;
        _progressLayer.strokeStart = 0.f;
        
        CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        pathAnimation.duration = self.animationDuration;
        pathAnimation.fromValue = @(0.0);
        pathAnimation.toValue = @(1.0);
        pathAnimation.removedOnCompletion = YES;
        pathAnimation.delegate = self;
        [_progressLayer addAnimation:pathAnimation forKey:nil];
        
        _progressLayer.path = _bezierPath.CGPath;
    }
    return _progressLayer;
}

設置代理回調(diào)

#pragma mark -- CAAnimationDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    if (flag) {
        self.myBlock();
    }
}

#pragma mark ---
- (void)startAnimationDuration:(CGFloat)duration withBlock:(DrawCircleProgressBlock )block {
    self.myBlock = block;
    self.animationDuration = duration;
    [self.layer addSublayer:self.progressLayer];
}

二. 啟動頁

ZLStartPageView.h :
露出 顯示引導頁面方法

//  啟動頁

#import <UIKit/UIKit.h>

#define kscreenWidth [UIScreen mainScreen].bounds.size.width

@interface ZLStartPageView : UIView

/**
 *  顯示引導頁面方法
 */
- (void)show;

@end

ZLStartPageView.m :
1. 初始化啟動頁

#import "ZLStartPageView.h"
#import "ZLDrawCircleProgressBtn.h"

@interface ZLStartPageView ()

// 啟動頁圖
@property (nonatomic,strong) UIImageView *imageView;

// 跳過按鈕
@property (nonatomic, strong) ZLDrawCircleProgressBtn *drawCircleBtn;

@end

// 倒計時時間
static int const showtime = 3;

@implementation ZLStartPageView

- (instancetype)initWithFrame:(CGRect)frame {
    
    if (self = [super initWithFrame:frame]) {
        
        // 1.啟動頁圖片
        _imageView = [[UIImageView alloc]initWithFrame:frame];
        _imageView.contentMode = UIViewContentModeScaleAspectFill;
        _imageView.image = [UIImage imageNamed:@"LaunchImage_667h"];
        [self addSubview:_imageView];
        
        // 2.跳過按鈕
        ZLDrawCircleProgressBtn *drawCircleBtn = [[ZLDrawCircleProgressBtn alloc]initWithFrame:CGRectMake(kscreenWidth - 55, 30, 40, 40)];
        drawCircleBtn.lineWidth = 2;
        [drawCircleBtn setTitle:@"跳過" forState:UIControlStateNormal];
        [drawCircleBtn setTitleColor:[UIColor  colorWithRed:197/255.0 green:159/255.0 blue:82/255.0 alpha:1] forState:UIControlStateNormal];
        drawCircleBtn.titleLabel.font = [UIFont systemFontOfSize:14];
        
        [drawCircleBtn addTarget:self action:@selector(removeProgress) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:drawCircleBtn];
        self.drawCircleBtn = drawCircleBtn;
        
    }
    return self;
}

2. 顯示啟動頁且完成時候回調(diào)移除

- (void)show {

    //  progress 完成時候的回調(diào)
    __weak __typeof(self) weakSelf = self;
    [weakSelf.drawCircleBtn startAnimationDuration:showtime withBlock:^{
        [weakSelf removeProgress];
    }];
    
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [window addSubview:self];
}

3. 移除啟動頁面

// 移除啟動頁面
- (void)removeProgress {
    
    self.imageView.transform = CGAffineTransformMakeScale(1, 1);
    self.imageView.alpha = 1;
    
    [UIView animateWithDuration:0.3 animations:^{
        self.drawCircleBtn.hidden = NO;
        self.imageView.alpha = 0.05;
        self.imageView.transform = CGAffineTransformMakeScale(5, 5);
    } completion:^(BOOL finished) {
        
        self.drawCircleBtn.hidden = YES;
        [self.imageView removeFromSuperview];
    }];
}

三. 動態(tài)啟動頁的顯示代碼放在AppDeleate中.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[HomeViewController alloc] init]];
    [self.window makeKeyAndVisible];
    
    [self setupStartPageView];
    
    return YES;
}

/**
 *  設置啟動頁
 */
- (void)setupStartPageView {
    
    ZLStartPageView *startPageView = [[ZLStartPageView alloc] initWithFrame:self.window.bounds];
    [startPageView show];
}

這個時候可以可以測試嘍,效果如下:

動態(tài)啟動頁.gif

如果需要啟動頁加載廣告這種啟動頁方案 ,請移步: iOS-APP啟動頁加載廣告

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趴梢,隨后出現(xiàn)的幾起案子漠畜,更是在濱河造成了極大的恐慌币他,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔狞,死亡現(xiàn)場離奇詭異蝴悉,居然都是意外死亡,警方通過查閱死者的電腦和手機瘾敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門拍冠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人簇抵,你說我怎么就攤上這事庆杜。” “怎么了碟摆?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵晃财,是天一觀的道長。 經(jīng)常有香客問我典蜕,道長断盛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任嘉裤,我火速辦了婚禮郑临,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屑宠。我一直安慰自己厢洞,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布典奉。 她就那樣靜靜地躺著躺翻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卫玖。 梳的紋絲不亂的頭發(fā)上公你,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音假瞬,去河邊找鬼陕靠。 笑死,一個胖子當著我的面吹牛脱茉,可吹牛的內(nèi)容都是我干的剪芥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琴许,長吁一口氣:“原來是場噩夢啊……” “哼税肪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤益兄,失蹤者是張志新(化名)和其女友劉穎锻梳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净捅,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡疑枯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灸叼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片神汹。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖古今,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滔以,我是刑警寧澤捉腥,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站你画,受9級特大地震影響抵碟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坏匪,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一拟逮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧适滓,春花似錦敦迄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗅绸,卻和暖如春脾猛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鱼鸠。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工猛拴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚀狰。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓愉昆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親造锅。 傳聞我的和親對象是個殘疾皇子撼唾,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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