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

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM