zoukankan      html  css  js  c++  java
  • ios漂亮的启动动画

    1、动画类型

    typedef enum{
    CircleFromCenter, //从中间像四周消失
    ClearFromCenter,//从中间像左右消失
    ClearFromLeft,   //左到右
    ClearFromRight, //右到左
    ClearFromTop,   //上到下
    ClearFromBottom, //下到上

    }TransitionDirection;
     
    2、委托
     

    @protocol SplashScreenViewControllerDelegate <NSObject>

    @optional
    - (void)splashScreenDidAppear:(SplashScreenViewController *)splashScreen;
    - (void)splashScreenWillDisappear:(SplashScreenViewController *)splashScreen;
    - (void)splashScreenDidDisappear:(SplashScreenViewController *)splashScreen;

    @end

    3. h属性方法

    @property (nonatomic, retain) UIImage *splashImage;
    @property (nonatomic, retain) UIImage *maskImage;
    @property (nonatomic, assign) id <SplashScreenViewControllerDelegate> delegate;
    @property (nonatomic, retain) NSString *maskImageName;
    @property (nonatomic) TransitionDirection transition;
    @property (nonatomic) CGFloat delay;
    @property (nonatomic) CGPoint anchor;

    - (void)showInWindow:(UIWindow *)window;

    4.m

    //  SplashScreenViewController.m
    //  Created by jason on 12-12-30.
    //  Copyright (c) 2012年 jason. All rights reserved.

    #import "SplashScreenViewController.h"

    #import <QuartzCore/QuartzCore.h>
    #define DURATION 0.75

    NSString *const PRPSplashScreenFadeAnimation = @"SplashScreenFadeAnimation";

    @interface SplashScreenViewController ()
    - (void)animate;
    @end

    @implementation SplashScreenViewController

    @synthesize splashImage;
    @synthesize maskImage;
    @synthesize delegate;
    @synthesize transition;
    @synthesize maskImageName;
    @synthesize delay;
    @synthesize anchor;

    - (void)showInWindow:(UIWindow *)window {
        [window addSubview:self.view];
    }

    - (void)viewDidLoad {
        self.view.layer.contentsScale = [[UIScreen mainScreen] scale];
        self.view.layer.contents = (id)self.splashImage.CGImage;
        self.view.contentMode =UIViewContentModeScaleAspectFill;
        }

    - (UIImage *)splashImage {
        if (splashImage == nil) {
            splashImage = [UIImage imageNamed:@"Default.png"];
        }
        return splashImage;
    }

    - (UIImage *)maskImage {
        if (maskImage != nil) [maskImage release];
        NSString *defaultPath = [[NSBundle mainBundle]
                                 pathForResource:self.maskImageName
                                 ofType:@"png"];
        maskImage = [[UIImage alloc]
                     initWithContentsOfFile:defaultPath];
        return maskImage;
    }

    - (void)setMaskLayerwithanchor {
        
        CALayer *maskLayer = [CALayer layer];
        maskLayer.anchorPoint = self.anchor;
        maskLayer.frame = self.view.superview.frame;
        maskLayer.contents = (id)self.maskImage.CGImage;
        self.view.layer.mask = maskLayer;
    }

    - (void)viewDidAppear:(BOOL)animated {
        if ([self.delegate respondsToSelector:@selector(splashScreenDidAppear:)]) {
            [self.delegate splashScreenDidAppear:self];
        }
        switch (self.transition) {
            case CircleFromCenter:
                self.maskImageName = @"mask";
                self.anchor = CGPointMake(0.5, 0.5);
                break;
            case ClearFromCenter:
                self.maskImageName = @"wideMask";
                self.anchor = CGPointMake(0.5, 0.5);
                break;
            case ClearFromLeft:
                self.maskImageName = @"leftStripMask";
                self.anchor = CGPointMake(0.0, 0.5);
                break;
            case ClearFromRight:
                self.maskImageName = @"RightStripMask";
                self.anchor = CGPointMake(1.0, 0.5);
                break;
            case ClearFromTop:
                self.maskImageName = @"TopStripMask";
                self.anchor = CGPointMake(0.5, 0.0);
                break;
            case ClearFromBottom:
                self.maskImageName = @"BottomStripMask";
                self.anchor = CGPointMake(0.5, 1.0);
                break;
            default:
                return;
        }
        [self performSelector:@selector(animate)
                   withObject:nil
                   afterDelay:self.delay];
    }

    - (void)animate {
        if ([self.delegate respondsToSelector:@selector(splashScreenWillDisappear:)]) {
            [self.delegate splashScreenWillDisappear:self];
        }
        
        [self setMaskLayerwithanchor];
        
        CABasicAnimation *anim = [CABasicAnimation
                                  animationWithKeyPath:@"transform.scale"];
        anim.duration = DURATION;
        anim.toValue = [NSNumber numberWithInt:self.view.bounds.size.height/8];
        anim.fillMode = kCAFillModeBoth;
        anim.removedOnCompletion = NO;
        anim.delegate = self;
        [self.view.layer.mask addAnimation:anim forKey:@"scale" ];
        
    }

    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {

        self.view.layer.mask = nil;
        [self.view removeFromSuperview];
        if ([self.delegate respondsToSelector:@selector(splashScreenDidDisappear:)]) {
            [self.delegate splashScreenDidDisappear:self];
        }
    }


    - (void)dealloc {
        [splashImage release], splashImage = nil;
        [maskImage release], maskImage = nil;
        [maskImageName release], maskImageName = nil;
        [super dealloc];
    }

    @end
     
    5.使用
     1)隐藏状态栏
      info.plist--->Status bar is initially hidden=YES
    2)AppDelegate : UIResponder <UIApplicationDelegate,SplashScreenViewControllerDelegate>
    3)
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
         [self addTabView];//加载tabbar
         [self addTabBarArrow];//给tabbar加小箭头
        
         [self addSplashScreen];//启动动画
        
        [self.window makeKeyAndVisible];
       
      
        return YES;
       
      
    }

    - (void)addSplashScreen {
     
           SplashScreenViewController * splashView=[[SplashScreenViewController alloc] init];
           splashView.delegate = self;
           splashView.transition =CircleFromCenter;//这里选择动画样式
           splashView.delay = 2.0;
           self.splashController=splashView;
           [splashView release];
          [self.splashController showInWindow:window];
    }

    4)通过委托显示状态栏

    - (void)splashScreenDidDisappear:(SplashScreenViewController *)splashScreen {
      
        //启动动画完成 显示状态栏
        [self StatusBarHidden:NO];

    }

  • 相关阅读:
    Vue
    前端笔试、面试题
    npm下载文件临时目录、实际存放目录路劲
    ES6
    Electron – 基础学习(3): 项目打包成exe桌面应用 之electron-builder
    Electron+Vue – 基础学习(2): 项目打包成exe桌面应用
    Electron+Vue – 基础学习(1): 创建项目
    软件需求膨胀系数
    职业女性确实处于劣势吗?记一次不甚严谨的考据 -- 向胡适之先生的遥远致敬
    15篇干货博客 38本书 4门公开课 减掉20斤体重 我的2014总结
  • 原文地址:https://www.cnblogs.com/jasonduan/p/2840625.html
Copyright © 2011-2022 走看看