博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS项目之弹出动画二
阅读量:5861 次
发布时间:2019-06-19

本文共 6658 字,大约阅读时间需要 22 分钟。

在IOS项目之弹出动画一中只是实现也功能,并没有体现面向对象的思想 ,今天就试着把它封装了一下,弹出视图的内容可以根据自定义,此处只是用UIDatePicker来演示

我把它传到了GitHub上   https://github.com/ywcui/YvanDatePicker.git

一、新建一个类YWDatePicker集成UIView

//  YvanDatePicker.h#import 
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];

回弹效果

有了这个东西,妈妈再也不用担心我的学习,下面的这几个都可以做

转载地址:http://bwwnx.baihongyu.com/

你可能感兴趣的文章
XNA
查看>>
2018-10-17 22:20:39 c language
查看>>
使用Vue脚手架(vue-cli)从零搭建一个vue项目(包含vue项目结构展示)
查看>>
redis启动
查看>>
查询条件中包含时间段的效率问题
查看>>
将博客搬至CSDN
查看>>
Java基础之j简析avax.swing.JOptionPane(一)showMessageDialog
查看>>
jquery.qrcode.min.js——前端生成二维码
查看>>
数据绑定 DataBinder.Eval和Container
查看>>
软件测试笔记3-基础知识(2)
查看>>
线程间通信常用的三种方法
查看>>
contentprovider基础
查看>>
【动态规划】【记忆化搜索】CODEVS 3409 搬运礼物 CodeVS原创
查看>>
php创建多级目录
查看>>
在Ubuntu Server下安装Oracle XE
查看>>
[转载]TortoiseGit安装与使用
查看>>
GetqueueStatus
查看>>
Fzu月赛11 老S的旅行计划 dij
查看>>
.NetCore使用skywalking实现实时性能监控
查看>>
合格PHP工程师的知识结构
查看>>