標籤:
在IOS項目之彈齣動畫一中只是實現也功能,並沒有體現物件導向的思想 ,今天就試著把它封裝了一下,彈出視圖的內容可以根據自訂,此處只是用UIDatePicker來示範
我把它傳到了GitHub上 https://github.com/ywcui/YvanDatePicker.git
一、建立一個類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
二、調用
//// 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
三、顯示效果
這個還可以進一步最佳化可以加一個標記值可以防止連續點擊時一直彈出
#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];
回彈效果
IOS項目之彈齣動畫二