欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IOS项目之弹出动画二

程序员文章站 2022-04-09 22:55:40
...

在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

三、显示效果

IOS项目之弹出动画二IOS项目之弹出动画二IOS项目之弹出动画二IOS项目之弹出动画二

这个还可以进一步优化可以加一个标记值可以防止连续点击时一直弹出


#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项目之弹出动画二

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

IOS项目之弹出动画二IOS项目之弹出动画二IOS项目之弹出动画二