IOS項目之彈出動畫二

在IOS項目之彈出動畫一中只是實現也功能,並無體現面向對象的思想 ,今天就試着把它封裝了一下,彈出視圖的內容能夠根據自定義,此處只是用UIDatePicker來演示git

我把它傳到了GitHub上   https://github.com/ywcui/YvanDatePicker.gitgithub

1、新建一個類YWDatePicker集成UIView學習

//  YvanDatePicker.h

#import <UIKit/UIKit.h>
typedef  void (^selectDate)(NSDate *date);

@interface YvanDatePicker : UIView

//單利
+ (YvanDatePicker *)sharedManager;

//block傳值獲取選擇時間
@property(nonatomic,strong) selectDate selectDate;

//時間選擇控件 可設置屬性
@property(nonatomic,strong) UIDatePicker *datePicker;

//window全屏顯示
-(void)showInWindow;

// View中顯示
-(void)showInView:(UIView*)view;

//在父視圖view的相對位置爲Frame
-(void)showInView:(UIView*)view withFrame:(CGRect)frame;

//消失視圖
-(void)dismissView;
@end
#define MAXHEIGHT [UIScreen mainScreen].bounds.size.height
#import "YvanDatePicker.h"

@interface YvanDatePicker ()

@end

@implementation YvanDatePicker


+ (YvanDatePicker *)sharedManager
{
    static YvanDatePicker *sharedAccountManagerInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedAccountManagerInstance = [[self alloc] init];
        sharedAccountManagerInstance.backgroundColor=[UIColor colorWithWhite:0.5 alpha:0.4];
    });
    return sharedAccountManagerInstance;
}

-(void)showInWindow
{
    [self showInView:[UIApplication sharedApplication].keyWindow];
}
-(void)showInView:(UIView*)view
{
    [self showInView:view withFrame:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)];
    
}
//frame相對於父視圖的位置
-(void)showInView:(UIView*)view withFrame:(CGRect)frame;
{
    //在此能夠自定義視圖
    self.frame=CGRectMake(frame.origin.x, MAXHEIGHT, frame.size.width, frame.size.height);
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame=frame;
    } completion:nil];
    UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dismissView)];
    [self addGestureRecognizer:tapGesture];
    if (_datePicker==nil) {
        _datePicker=[[UIDatePicker alloc]init];
        _datePicker.locale=[[NSLocale alloc ]initWithLocaleIdentifier:@"zh_Hans_CN"];
        _datePicker.datePickerMode=UIDatePickerModeDate;
        _datePicker.timeZone=[NSTimeZone defaultTimeZone];
    }
    _datePicker.frame=CGRectMake(0, frame.size.height-216, 0, 0);
    [self addSubview:_datePicker];
    
    [view addSubview:self];

}
-(void)dismissView
{
    _selectDate(_datePicker.date);
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame=CGRectMake(0, MAXHEIGHT, self.frame.size.width , self.frame.size.height);
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
    
}

@end

2、調用優化

//
//  ViewController.m
//  YvanDatePicker
//
//  Created by City--Online on 15/6/18.
//  Copyright (c) 2015年 YvanCui. All rights reserved.
//

#import "ViewController.h"
#import "YvanDatePicker.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"彈出" style:UIBarButtonItemStyleDone target:self action:@selector(leftClick)];
}
-(void)leftClick
{
    YvanDatePicker *picker=[YvanDatePicker sharedManager];
    picker.selectDate=^(NSDate *date)
    {
        NSLog(@"%@",date);
    };
//    //1.設置在父視圖的Frame
//    CGRect frame=CGRectMake(10, self.view.bounds.size.height-260, self.view.bounds.size.width-20, 260);
//    [picker showInView:self.view withFrame:frame];
//    
//    //2.Window顯示
//    [picker showInWindow];
//    
//    //3.View全屏顯示
//    [picker showInView:self.view];
    
    //4.相對於Window的Frame
    CGRect frame1=CGRectMake(0, [UIApplication sharedApplication].keyWindow.bounds.size.height-260, [UIApplication sharedApplication].keyWindow.bounds.size.width, 260);
    [picker showInView:[UIApplication sharedApplication].keyWindow withFrame:frame1];
   
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

3、顯示效果動畫

這個還能夠進一步優化能夠加一個標記值能夠防止連續點擊時一直彈出ui

#define MAXHEIGHT [UIScreen mainScreen].bounds.size.height
#import "YvanDatePicker.h"

@interface YvanDatePicker ()
@property(nonatomic,assign) BOOL openFlag;
@end

@implementation YvanDatePicker


+ (YvanDatePicker *)sharedManager
{
    static YvanDatePicker *sharedAccountManagerInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedAccountManagerInstance = [[self alloc] init];
        sharedAccountManagerInstance.backgroundColor=[UIColor colorWithWhite:0.5 alpha:0.4];
    });
    return sharedAccountManagerInstance;
}

-(void)showInWindow
{
    [self showInView:[UIApplication sharedApplication].keyWindow];
}
-(void)showInView:(UIView*)view
{
    [self showInView:view withFrame:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)];
    
}
//frame相對於父視圖的位置
-(void)showInView:(UIView*)view withFrame:(CGRect)frame;
{
    if (_openFlag) {
        [self dismissView];
        return;
    }
    
    _openFlag=true;
    self.frame=CGRectMake(frame.origin.x, -frame.size.height, frame.size.width, frame.size.height);
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame=CGRectMake(frame.origin.x, 104, frame.size.width, frame.size.height);;
    } completion:nil];
    [UIView animateWithDuration:0.3 delay:0.4 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame=CGRectMake(frame.origin.x, 0, frame.size.width, frame.size.height);;
    } completion:nil];
    UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dismissView)];
    [self addGestureRecognizer:tapGesture];
    if (_datePicker==nil) {
        _datePicker=[[UIDatePicker alloc]init];
        _datePicker.locale=[[NSLocale alloc ]initWithLocaleIdentifier:@"zh_Hans_CN"];
        _datePicker.datePickerMode=UIDatePickerModeDate;
        _datePicker.timeZone=[NSTimeZone defaultTimeZone];
    }
    _datePicker.frame=CGRectMake(0, frame.size.height-216, 0, 0);
    [self addSubview:_datePicker];
    
    [view addSubview:self];

}
-(void)dismissView
{
    _openFlag=false;
    _selectDate(_datePicker.date);
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.frame=CGRectMake(0,- self.frame.size.height, self.frame.size.width , self.frame.size.height);
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
    
}

@end
 YvanDatePicker *picker=[YvanDatePicker sharedManager];
    picker.selectDate=^(NSDate *date)
    {
        NSLog(@"%@",date);
    };
//    //1.設置在父視圖的Frame
    CGRect frame=CGRectMake(0, 0, self.view.bounds.size.width, 260);
    [picker showInView:self.view withFrame:frame];

回彈效果atom

有了這個東西,媽媽不再用擔憂個人學習,下面的這幾個均可以作spa

相關文章
相關標籤/搜索