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];

}

原文地址:https://www.cnblogs.com/jasonduan/p/2840625.html