精华内容
下载资源
问答
  • 仿ios时间选择器

    千次阅读 2018-04-12 15:42:00
    可以自定义设置开始时间和结束时间,弹出时默认选中的时间,支持时分年月日等等,先看效果图吧,简单的main界面:然后是各个样式的选择器 01: 年月选择器:02: 年-月-日 时:分选择器:03: 年-月-日 选择器04...
    可以自定义设置开始时间和结束时间,弹出时默认选中的时间,支持时分年月日等等,先看效果图吧,简单的main界面:

    然后是各个样式的选择器 01:   年月选择器:

    02:   年-月-日  时:分选择器:

    03:   年-月-日 选择器

    04:年-月  时:分 选择器 (这个可能不怎么用到,但我用到了  恶心。)


    暂时就先实现了这几个效果,因为最后04:年-月  时:分 选择器这个我项目不需要设置默认时间所以代码里也只有他功能比较简单。

    代码就不贴了,太多,我讲一下使用的方法

    UIDateTimeActivity ui4 = new UIDateTimeActivity(this,DateAndTimeMenu.DATEYMHM,"2017-01-01 10:10","2018-06-08 11:11","2017-06-08 13:13");
    ui4.show();
    ui4.setCallBack(this);

    构造里五个参数,当前activity的context,一个枚举常量(1-4四个数字代表四种选择器样式),开始时间,结束时间,默认时间。

    setCallBack回调函数  在每个WhellView滑动的时候  都会实时回调选中的值,获取选中时间值的回调函数:

    @Override
        public void sendSeledDateOrTime(String date_or_time) {
    //        Toast.makeText(this,date_or_time,Toast.LENGTH_LONG).show();
        }

    demo下载地址:https://download.csdn.net/download/android410223sun/10344090  (选择器的代码已经打成库在其中依赖了,可以自主修改)

    展开全文
  • 你的时间选择器还是再用巨丑的PickNumber吗?这是一个仿照IOS时间选择器。原先也是参考网上的demo,自己优化了很多,界面更美观,更实用。
  • 随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出! 最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用! 主要功能:...
  • 随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出! 最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用! 主要功能:...

    随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出! 最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用!

    主要功能: 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器.

    如果需要可以根据自己的需求来修改界面, 效果如下:

    主要步骤:

    1. 创建时间选择器Picker 且确认取消按钮实现功能逻辑
    2. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)
    3. 创建时间选择器视图 且 起始时间/截止时间逻辑判断
    4. 使用代理传值起始时间/截止时间(时间串转换)

    ##第一步. 创建时间选择器Picker 且确认取消按钮实现功能逻辑

    自定义ZLDatePickerView 文件:

    @property (nonatomic, assign) id<ZLDatePickerViewDelegate> deleagte;
    // 最初/小时间(一般为左边值)
    @property (nonatomic, strong) NSDate *minimumDate;
    // 截止时间(一般为右边值)
    @property (nonatomic, strong) NSDate *maximumDate;
    // 当前选择时间
    @property (nonatomic, strong) NSDate *date;
    
    
    + (instancetype)datePickerView;
    
    - (void)showFrom:(UIView *)view;
    复制代码

    使用代理传值:

    @protocol ZLDatePickerViewDelegate <NSObject>
    
    - (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view;
    
    @end
    
    复制代码

    使用 xib 展现datePicker:

    + (instancetype)datePickerView {
        
        ZLDatePickerView *picker = [[NSBundle mainBundle] loadNibNamed:@"ZLDatePickerView" owner:nil options:nil].lastObject;
        picker.frame = CGRectMake(0, UI_View_Height - 250, UI_View_Width, 250);
        picker.maximumDate = [NSDate date];
        
        return picker;
    }
    
    - (void)showFrom:(UIView *)view {
        UIView *bgView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        bgView.backgroundColor = [UIColor lightGrayColor];
        bgView.alpha = 0.5;
        
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
        [bgView addGestureRecognizer:tap];
        
        self.fromView = view;
        self.bgView = bgView;
        [[UIApplication sharedApplication].keyWindow addSubview:self.bgView];
        [[UIApplication sharedApplication].keyWindow addSubview:self];
    }
    复制代码

    起始时间/截止时间设值:

    - (void)setMinimumDate:(NSDate *)minimumDate {
        self.datePicker.minimumDate = minimumDate;
    }
    
    - (void)setMaximumDate:(NSDate *)maximumDate {
        self.datePicker.maximumDate = maximumDate;
    }
    
    - (void)setDate:(NSDate *)date {
        self.datePicker.date = date;
    }
    复制代码

    确认/取消按钮实现功能逻辑:

    - (IBAction)cancel:(id)sender {
        [self dismiss];
    }
    
    - (IBAction)makeSure:(id)sender {
        
        [self dismiss];
        
        NSDate *date = self.datePicker.date;
        
        if ([self.deleagte respondsToSelector:@selector(datePickerView:backTimeString:To:)]) {
            [self.deleagte datePickerView:self backTimeString:[self fomatterDate:date] To:self.fromView];
        }
    }
    复制代码

    ##第二步. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)

    这个可以根据需求来,有些不需要这个按钮图片在右边的,则没必要添加. 自定义ZLOppositeButton文件:

    - (void)layoutSubviews {
        [super layoutSubviews];
        
        CGFloat margin = 10;
        
        // 替换 title 和 image 的位置
        // 图片在右,标题在左
        // 由于 button 内部的尺寸是自适应的.调整尺寸即可
        CGFloat maxWidth = self.width - self.imageView.width - margin;
        if (self.titleLabel.width >= maxWidth) {
            self.titleLabel.width = maxWidth;
        }
        
        CGFloat totalWidth = self.titleLabel.width + self.imageView.width;
        
        self.titleLabel.x =  (self.width - totalWidth - margin) * 0.5;
        self.imageView.x = CGRectGetMaxX(self.titleLabel.frame) + margin;
    }
    复制代码

    接着利用上面的按钮创建一个展示时间菜单的按钮视图ZLTimeBtn文件:

    - (void)setup {
        self.backgroundColor = [UIColor clearColor];
        [self setImage:[UIImage imageNamed:@"xiangxiadianji"] forState:UIControlStateNormal];
        [self setTitle:[self timeStringDefault] forState:UIControlStateNormal];
        [self setTitleColor:ZLColor(102, 102, 102) forState:UIControlStateNormal];
        self.titleLabel.font = [UIFont systemFontOfSize:14];
    }
    
    // 时间默认展示当天
    - (NSString *)timeStringDefault {
        NSDate *date = [NSDate date];
        return [date timeFormat:@"yyyy-MM-dd"];
    }
    复制代码

    其中我们上传时间一般都是字符串而不是时间戳, 则需要进行转换:

    #import "NSDate+ZLDateTimeStr.h"
    复制代码
    - (NSString *)timeFormat:(NSString *)dateFormat {
        
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
        [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        [formatter setDateFormat:dateFormat];
        
        return [formatter stringFromDate:self];
    }
    复制代码

    ##第三步. 创建时间选择器视图 且 起始时间/截止时间逻辑判断

    利用第二步自定义的按钮来自定义ZLTimeView文件:

    @property (nonatomic, weak) ZLTimeBtn *beginTimeBtn;
    @property (nonatomic, weak) UILabel *label;
    @property (nonatomic, weak) ZLTimeBtn *endTimeBtn;
    复制代码
    - (void)layoutSubviews {
        [super layoutSubviews];
        
        self.beginTimeBtn.frame = CGRectMake(0, 0, self.width / 5.0 * 2, self.height);
        self.label.frame = CGRectMake(CGRectGetMaxX(self.beginTimeBtn.frame), 0, self.width / 5, self.height);
        self.endTimeBtn.frame = CGRectMake(CGRectGetMaxX(self.label.frame),0 , self.width / 5.0 * 2, self.height);
        self.line.frame = CGRectMake(0, self.height - 1, self.width, 1);
    }
    复制代码
    - (void)setupSubview {
        // 起始时间按钮
        YYPTimeBtn *beginTimeBtn = [[YYPTimeBtn alloc] init];
        beginTimeBtn.backgroundColor = [UIColor clearColor];
        [beginTimeBtn addTarget:self action:@selector(beginTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        // 起始时间默认展示当月一号
     //   [beginTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-01"] forState:UIControlStateNormal];
        [self addSubview:beginTimeBtn];
        self.beginTimeBtn = beginTimeBtn;
        
        // 至label
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor clearColor];
        label.text = @"——";
        label.textColor = YYPWhiteTitleColor;
        label.font = [UIFont systemFontOfSize:14];
        label.textAlignment = NSTextAlignmentCenter;
        self.label = label;
        [self addSubview:label];
        
        // 终止时间按钮
        YYPTimeBtn *endTimeBtn = [[YYPTimeBtn alloc] init];
        [endTimeBtn addTarget:self action:@selector(endTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        // 终止时间默认展示当天
     //   [endTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-dd"] forState:UIControlStateNormal];
        self.endTimeBtn = endTimeBtn;
        [self addSubview:endTimeBtn];
        
        UIView *line = [[UIView alloc] init];
        line.backgroundColor = YYPColor(204, 204, 204);
        self.line = line;
        [self addSubview:line];
    }
    复制代码

    **这里强调一点: **如果默认展示的起始时间均为当天时间时,则在可在自定义按钮里设置就好,不需添加下面方法.

    // 自定义默认展示的当月起始时间
    - (NSString *)timeStringDefaultWith:(NSString *)timeFormat {
        NSDate *date = [NSDate date];
        return [date timeFormat:timeFormat];
    }
    复制代码

    使用代理:

    @protocol ZLTimeViewDelegate <NSObject>
    
    /**
     *  时间选择器视图
     *
     *  @param beginTime           起始时间/开始时间
     *  @param endTime             终止时间按/结束时间
     *
     */
    - (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime;
    
    @end
    复制代码

    使用第一步创建的时间选择器Picker, 来进行起始时间/截止时间逻辑判断:

    #pragma mark - ZLDatePickerViewDelegate
    
    - (void)beginTimeBtnClick:(UIButton *)btn {
        
        ZLDatePickerView *beginTimePV = [ZLDatePickerView datePickerView];
        beginTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];
        if (self.maxDate) {
            beginTimePV.maximumDate = self.maxDate;
        }
        beginTimePV.deleagte = self;
        [beginTimePV showFrom:btn];
    }
    
    - (void)endTimeBtnClick:(UIButton *)btn {
        
        ZLDatePickerView *endTimePV = [ZLDatePickerView datePickerView];
        endTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];
        if (self.minDate) {
            endTimePV.minimumDate = self.minDate;
        }
        
        endTimePV.deleagte = self;
        [endTimePV showFrom:btn];
    }
    - (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view {
        UIButton *btn = (UIButton *)view;
        if (btn == self.beginTimeBtn) {
            self.minDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];
        }
        if (btn == self.endTimeBtn) {
            self.maxDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];
        }
        
        [btn setTitle:string forState:UIControlStateNormal];
        
        if ([self.delegate respondsToSelector:@selector(timeView:seletedDateBegin:end:)]) {
            [self.delegate timeView:self seletedDateBegin:self.beginTimeBtn.titleLabel.text end:self.endTimeBtn.titleLabel.text];
        }
    }
    复制代码

    ##第四步. 使用代理传值起始时间/截止时间

    在所需控制器里创建起始时间选择器控件:

    #import "ZLTimeView.h"
    复制代码
    @property (nonatomic, copy) NSString *begintime;
    @property (nonatomic, copy) NSString *endtime;
    
    @property (nonatomic, weak) UIButton *beginTimeBtn;
    @property (nonatomic, weak) UIButton *endTimeBtn;
    
    @property (nonatomic, strong) ZLTimeView *timeView;
    复制代码
    #pragma mark - 懒加载
    
    - (ZLTimeView *)timeView {
        if (!_timeView) {
            ZLTimeView *timeView = [[ZLTimeView alloc] initWithFrame:CGRectMake(0, 100, UI_View_Width, 50)];
            timeView.backgroundColor = [UIColor greenColor];
            timeView.delegate = self;
            _timeView = timeView;
        }
        return _timeView;
    }
    复制代码
       // 起始时间选择器控件
        [self.view addSubview:self.timeView];
    复制代码

    使用代理:

    <ZLTimeViewDelegate>
    复制代码
    #pragma mark - ZLTimeViewDelegate
    
    - (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime {
        // TODO: 进行上传时间段
    }
    复制代码

    当多处使用时,用起来是不是很方便, 这时候测试看下效果:

    以上是部分代码, 如果需要 Demo , 可以这里下载~

    展开全文
  • iOS 10 风格的日历和时间选择器.zip,一个更好的ios用户界面组件,用于选择日期和时间
  • 概述 自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来...随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出! 最近项目中发现时间选择器使用...

    概述

    自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器.

    详细

    随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出!

    最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用!

     

    一、实现功能及主要思路

    实现功能:

    自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器.

    其中两者时间(起始时间/截止时间)是可以做限制,例如:当月月初1日 到 当天时间.

     

    主要思路:

     

    • 1. 创建时间选择器Picker 且确认取消按钮实现功能逻辑

    • 2. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)

    • 3. 创建时间选择器视图 且 起始时间/截止时间逻辑判断

    • 4. 使用代理传值起始时间/截止时间(时间串转换)

    二、程序实现

    第一步. 创建时间选择器Picker 且确认取消按钮实现功能逻辑

    自定义ZLDatePickerView 文件:

    @property (nonatomic, assign) id<ZLDatePickerViewDelegate> deleagte;
    // 最初/小时间(一般为左边值)
    @property (nonatomic, strong) NSDate *minimumDate;
    // 截止时间(一般为右边值)
    @property (nonatomic, strong) NSDate *maximumDate;
    // 当前选择时间
    @property (nonatomic, strong) NSDate *date;
    + (instancetype)datePickerView;
    - (void)showFrom:(UIView *)view;

    使用代理传值:

    @protocol ZLDatePickerViewDelegate <NSObject>
    - (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view;
    @end

    使用 xib 展现datePicker:

    + (instancetype)datePickerView {
        
        ZLDatePickerView *picker = [[NSBundle mainBundle] loadNibNamed:@"ZLDatePickerView" owner:nil options:nil].lastObject;
        picker.frame = CGRectMake(0, UI_View_Height - 250, UI_View_Width, 250);
        picker.maximumDate = [NSDate date];
        
        return picker;
    }
    - (void)showFrom:(UIView *)view {
        UIView *bgView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        bgView.backgroundColor = [UIColor lightGrayColor];
        bgView.alpha = 0.5;
        
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
        [bgView addGestureRecognizer:tap];
        
        self.fromView = view;
        self.bgView = bgView;
        [[UIApplication sharedApplication].keyWindow addSubview:self.bgView];
        [[UIApplication sharedApplication].keyWindow addSubview:self];
    }

    起始时间/截止时间设值:

    - (void)setMinimumDate:(NSDate *)minimumDate {
        self.datePicker.minimumDate = minimumDate;
    }
    - (void)setMaximumDate:(NSDate *)maximumDate {
        self.datePicker.maximumDate = maximumDate;
    }
    - (void)setDate:(NSDate *)date {
        self.datePicker.date = date;
    }

    确认/取消按钮实现功能逻辑:

    - (IBAction)cancel:(id)sender {
        [self dismiss];
    }
    - (IBAction)makeSure:(id)sender {
        
        [self dismiss];
        
        NSDate *date = self.datePicker.date;
        
        if ([self.deleagte respondsToSelector:@selector(datePickerView:backTimeString:To:)]) {
            [self.deleagte datePickerView:self backTimeString:[self fomatterDate:date] To:self.fromView];
        }
    }

     

    第二步. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)

    这个可以根据需求来,有些不需要这个按钮图片在右边的,则没必要添加.

    自定义ZLOppositeButton文件:

    - (void)layoutSubviews {
        [super layoutSubviews];
        
        CGFloat margin = 10;
        
        // 替换 title 和 image 的位置
        // 图片在右,标题在左
        // 由于 button 内部的尺寸是自适应的.调整尺寸即可
        CGFloat maxWidth = self.width - self.imageView.width - margin;
        if (self.titleLabel.width >= maxWidth) {
            self.titleLabel.width = maxWidth;
        }
        
        CGFloat totalWidth = self.titleLabel.width + self.imageView.width;
        
        self.titleLabel.x =  (self.width - totalWidth - margin) * 0.5;
        self.imageView.x = CGRectGetMaxX(self.titleLabel.frame) + margin;
    }

    接着利用上面的按钮创建一个展示时间菜单的按钮视图ZLTimeBtn文件:

    - (void)setup {
        self.backgroundColor = [UIColor clearColor];
        [self setImage:[UIImage imageNamed:@"xiangxiadianji"] forState:UIControlStateNormal];
        [self setTitle:[self timeStringDefault] forState:UIControlStateNormal];
        [self setTitleColor:ZLColor(102, 102, 102) forState:UIControlStateNormal];
        self.titleLabel.font = [UIFont systemFontOfSize:14];
    }
    // 时间默认展示当天
    - (NSString *)timeStringDefault {
        NSDate *date = [NSDate date];
        return [date timeFormat:@"yyyy-MM-dd"];
    }

    其中我们上传时间一般都是字符串而不是时间戳, 则需要进行转换:

    #import "NSDate+ZLDateTimeStr.h"
    - (NSString *)timeFormat:(NSString *)dateFormat {
        
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
        [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        [formatter setDateFormat:dateFormat];
        
        return [formatter stringFromDate:self];
    }

     

    第三步. 创建时间选择器视图 且 起始时间/截止时间逻辑判断

    利用第二步自定义的按钮来自定义ZLTimeView文件:

    - (void)layoutSubviews {
        [super layoutSubviews];
        
        self.beginTimeBtn.frame = CGRectMake(0, 0, self.width / 5.0 * 2, self.height);
        self.label.frame = CGRectMake(CGRectGetMaxX(self.beginTimeBtn.frame), 0, self.width / 5, self.height);
        self.endTimeBtn.frame = CGRectMake(CGRectGetMaxX(self.label.frame),0 , self.width / 5.0 * 2, self.height);
        self.line.frame = CGRectMake(0, self.height - 1, self.width, 1);
    }
    - (void)setupSubview {
        // 起始时间按钮
        YYPTimeBtn *beginTimeBtn = [[YYPTimeBtn alloc] init];
        beginTimeBtn.backgroundColor = [UIColor clearColor];
        [beginTimeBtn addTarget:self action:@selector(beginTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        // 起始时间默认展示当月一号
     //   [beginTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-01"] forState:UIControlStateNormal];
        [self addSubview:beginTimeBtn];
        self.beginTimeBtn = beginTimeBtn;
        
        // 至label
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor clearColor];
        label.text = @"——";
        label.textColor = YYPWhiteTitleColor;
        label.font = [UIFont systemFontOfSize:14];
        label.textAlignment = NSTextAlignmentCenter;
        self.label = label;
        [self addSubview:label];
        
        // 终止时间按钮
        YYPTimeBtn *endTimeBtn = [[YYPTimeBtn alloc] init];
        [endTimeBtn addTarget:self action:@selector(endTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        // 终止时间默认展示当天
     //   [endTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-dd"] forState:UIControlStateNormal];
        self.endTimeBtn = endTimeBtn;
        [self addSubview:endTimeBtn];
        
        UIView *line = [[UIView alloc] init];
        line.backgroundColor = YYPColor(204, 204, 204);
        self.line = line;
        [self addSubview:line];
    }

    这里强调一点: 如果默认展示的起始时间均为当天时间时,则在可在自定义按钮里设置就好,不需添加下面方法.

    // 自定义默认展示的当月起始时间
    - (NSString *)timeStringDefaultWith:(NSString *)timeFormat {
        NSDate *date = [NSDate date];
        return [date timeFormat:timeFormat];
    }

    使用代理:

    @protocol ZLTimeViewDelegate <NSObject>
    /**
     *  时间选择器视图
     *
     *  @param beginTime           起始时间/开始时间
     *  @param endTime             终止时间按/结束时间
     *
     */
    - (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime;
    @end

    使用第一步创建的时间选择器Picker, 来进行起始时间/截止时间逻辑判断:

    #pragma mark - ZLDatePickerViewDelegate
    - (void)beginTimeBtnClick:(UIButton *)btn {
        
        ZLDatePickerView *beginTimePV = [ZLDatePickerView datePickerView];
        beginTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];
        if (self.maxDate) {
            beginTimePV.maximumDate = self.maxDate;
        }
        beginTimePV.deleagte = self;
        [beginTimePV showFrom:btn];
    }
    - (void)endTimeBtnClick:(UIButton *)btn {
        
        ZLDatePickerView *endTimePV = [ZLDatePickerView datePickerView];
        endTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];
        if (self.minDate) {
            endTimePV.minimumDate = self.minDate;
        }
        
        endTimePV.deleagte = self;
        [endTimePV showFrom:btn];
    }
    - (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view {
        UIButton *btn = (UIButton *)view;
        if (btn == self.beginTimeBtn) {
            self.minDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];
        }
        if (btn == self.endTimeBtn) {
            self.maxDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];
        }
        
        [btn setTitle:string forState:UIControlStateNormal];
        
        if ([self.delegate respondsToSelector:@selector(timeView:seletedDateBegin:end:)]) {
            [self.delegate timeView:self seletedDateBegin:self.beginTimeBtn.titleLabel.text end:self.endTimeBtn.titleLabel.text];
        }
    }

     

    第四步. 使用代理传值起始时间/截止时间

    在所需控制器里创建起始时间选择器控件:

    #import "ZLTimeView.h"

    懒加载:

    - (ZLTimeView *)timeView {
        if (!_timeView) {
            ZLTimeView *timeView = [[ZLTimeView alloc] initWithFrame:CGRectMake(0, 100, UI_View_Width, 50)];
            timeView.backgroundColor = [UIColor greenColor];
            timeView.delegate = self;
            _timeView = timeView;
        }
        return _timeView;
    }

    创建添加起始时间选择器控件:

    [self.view addSubview:self.timeView];

    使用代理<ZLTimeViewDelegate>:

    #pragma mark - ZLTimeViewDelegate
    - (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime {
        // TODO: 进行上传时间段
    }

    三、压缩文件截图及运行效果

    1. 压缩文件截图:F17EC04A-4787-45D0-BA94-A61A85A73E25.png

    2. 项目截图

    C3DFB9C1-207F-46A1-8BD7-75F35C74591F.png

    3.运行效果:

    时间选择器.gif

     

    4.效果截图:

    截图.png

    四、其他补充

    界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!

     

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

    展开全文
  • 一款简单的类似百思不得姐主页导航栏下方的那个分段界面的控件,类似王者荣耀助手的聊天模块的导航栏下方的分段界面控件等等,简单的说,这是一款分段界面选择器 ☆☆ 如何导入使用框架方法 ☆☆ 可以打开 ...
  • 项目需要做一个时间选择器,本来挺简单的,但是是一个有限制的时间选择器,选择区间(在代码中可调),从当前时间到60天前,还有就是picker选择控件,如果是两行的话,上下会对不齐(已经解决),解决办法就是插入一个空的一行,...
  • 一款简单的类似百思不得姐主页导航栏下方的那个分段界面的控件,类似王者荣耀助手的聊天模块的导航栏下方的分段界面控件等等,简单的说,这是一款分段界面选择器 ☆☆ 如何导入使用框架方法 ☆☆ 可以打开 ...
  • 最近项目需求要写一个类IOS并且是月历样式的时间选择器,如图: 少废话,成品如下: 1. 思路 界面部分 &lt;LinearLayout &lt;LinearLayout/&gt; &lt;LinearLayout/&gt; &lt;...

    最近项目需求要写一个类IOS并且是月历样式的时间选择器,如图:
    需求

    少废话,成品如下:
    完成图

    1. 思路

    界面部分

    <LinearLayout
    	<LinearLayout/>
    	<LinearLayout/>
    	<LinearLayout/>
    	<RecyclerView/>
    />
    

    上面三个线性布局easy,下面的RecyclerView也很简单,只是,初学不太会用,花了点时间研究,主要是GridLayoutManager的几个参数、方法。

        <android.support.v7.widget.RecyclerView
            android:id="@+id/date_picker_recycler_view"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:background="@color/white"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    

    注意到需求上面左右是没有边距的,所以只是加了上下的padding。
    并且各个日期之间也是没有边距的所以item也很简单,
    height没有设置成wrap_content完全是因为太高了,不好看。
    android:stateListAnimator="@null"这句是为了取消Button点击产生的阴影,貌似API21以下还是有,待解决。

    <?xml version="1.0" encoding="utf-8"?>
    <Button
        android:id="@+id/btn_date_item_date"
        android:textColor="@color/monthForm_text"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:background="@color/white"
        android:layout_width="wrap_content"
        android:layout_height="35dp"
        android:stateListAnimator="@null"/>
    

    然后就是RecyclerView的设置了
    RecyclerView的骚操作可以说完全就是靠LayoutManager完成的。
    这里我们用到的是网页布局,直接贴代码。

            recyclerView.setLayoutManager(new GridLayoutManager(context,7));
    

    第一个参数context,第二个参数是列数,就完了。

    如果要给item设置间距

    如果要每个item之间有间距,我不知道高手是怎么实现的,我是通过给item设置margin实现的。

    因为如果item宽度是wrap_content,假如列数为7,recyclerView它会根据屏幕宽度把item的宽度设置为屏幕宽度的1/7,假如是定宽,那就排不了了,要么一行好多个要么一行几个,是吧,假如屏幕1000px,你一个item占了500px,它不能给你缩小吧。
    但是这样设置出来的效果是这样的| #1##2##3##4##5##6##7#|
    那,假如想各个item间隔均匀怎么办?就是|#1#2#3#4#5#6#7#|这样的效果
    还在修炼中,淘宝是这样的,据说开源了,有空去看看。

    逻辑部分

    思路

    1. 顶部时间
      这个简单,选中后将选中的时间显示上去即可;
      需求:需要recyclerView记住选中位置的年、月、日(selectedYear、selectedMonth、selectedDay)
    2. 菜单栏
      • 左箭头,上一月
        逻辑与右键头类似,参考右键头

      • 中间显示当前年、月
        这个也简单,左右箭头翻页时动态改变当前展示的年、月
        需求:需要recyclerView记住当前展示的年、月(requestYear、requestMonth)

      • 右键头,下一月
        这里通过Calendar类获取时间,通过roll方法设置需要显示的时间。
        类初始化时设置一个全局变量Calendar now = Calendar.getInstance();

        然后是点击右键头的代码(month+1是因为Calendar类获得月份范围是0-11)

        if(now.get(Calendar.MONTH)==11){
                    now.roll(Calendar.YEAR,1);
                }
                now.roll(Calendar.MONTH,1);
                int year = now.get(Calendar.YEAR);
                int month = now.get(Calendar.MONTH)+1;
                tv_year_month.setText(context.getString(R.string.date_picker_year_month,year,month));
                myAdapter.setRequestYear(year);
                myAdapter.setRequestMonth(month);
                initData();
                myAdapter.notifyDataSetChanged();
        
    3. 日历主体
      看起来难做起来容易,首先获得当前年、月、日;
      然后
      	now.set(Calendar.DATE,1);  //设置为当月第一天
      	firstWeekday = now.get(Calendar.DAY_OF_WEEK);  //获取第一天星期几,假如是2,就是星期一
          now.roll(Calendar.DATE,-1);            //这个月第一天倒退一天
          dayCount =now.get(Calendar.DATE);              //获取这个月总天数
          ```
      

    然后新建一个List<Integer>数组;
    先填入firstWeekday-1个-1,再依次填入1、2、…到dayCount
    然后recyclerView新建适配器,设置一列显示7个

    int thisDay = list.get(position);			//当前遍历的日期
    if(lthisDay>0){									//如果不是-1
    	item.setText(String.valueOf(thisDay));		//设置item显示值为这个日期,注意要转String
    	if(thisDay<CurrentDay&& requestMonth <= currentMonth && requestYear <= currentYear){		//如果这一天在今天之前,显示灰色
    	item.setTextColor(xxx);
    	}else{
    	item.setTextColor(xxx);显示黑色
    	item.setOnClickListener(xxx);设置点击事件
    }
    }
    
    展开全文
  • 最近项目上需要用到一个选择器,选择器中的内容只有年和月,而在iOS系统自带的日期选择器UIDatePicker中却只有四个选项如下,分别...因此,为了满足项目需求,自己用UIPickerView写了一个只显示年月的选择器界面,同...
  • iOS自定义启动界面

    2017-10-14 00:00:00
    点击上方“iOS开发”,选择“置顶公众号” 关键时刻,第一时间送达! 最近在重构app,原app用的是xcode自带的启动图设置。但相对来说自定义启动图可扩展性更强一点,今天花了一些时间弄了一下~ ...
  • IOS之UIDatePicker实现日期选择 首先,UIdatePicker的作用就是方便用户进行日期时间选择,并保证日期格式的正确,通常以UITextField的inputView的形式出现,占据原来键盘的位置. 实现过程 1、在界面中拖入一个...
  • 接下来介绍第二个界面元素内容视图 动画1内容视图(Content views)包含当前应用所特有的内容并支持相关的交互行为 动画2...* 第三个是元素控件控制元素产生行为或显示信息是APP的组成部分如下拉式菜单时间选择器进度条等
  • 自定义日期时间选择器

    千次阅读 2013-11-25 23:00:15
    由于安卓,IOS,windows phone各家手机系统的不同,如果单纯使用select来实现日期时间选择功能将造成各个HTML在各个不同的手机终端下面的功能操作不一致。  现在我给大家推荐一款基于jQuery开发的插件,这个插件...
  • 时间选择器:HYDatePicker

    2013-11-18 17:01:49
    两种日期时间选择方式: 年月日时分, 年月日。4.实现了循环滚动。(每一组都有12000行左右,如果想要滚到头必须连续不停的向上或向下滚动6000+行, 还不能停。。一旦停止就会回到中间去,求测嘿嘿嘿)5.可以快捷的获得...
  • iOS开发之使用FSCalendar日历选择

    千次阅读 2020-01-14 11:22:34
    FSCalendar日历选择器, 需求说明: 1.需自定义日历顶部,左右小按钮可点击切换月份 2.当天文字颜色为主色调,选中为含有背景色 3.日历样式只显示当月时间 4.周六、周日文字与其他日期颜色不同 5.点击已过去的时间不...
  • 前段时间空余时间比较多,打算尝试做一个图片选择器出来,仔细对比了很多自定义了图片选择器的应用,感觉最喜欢微信的界面效果,当然微博的功能更强大,还支持了LivePhoto,所以打算模仿微信的界面效果,瞄着微博的...
  • 类 UINavigationController 一个容器视图控制,定义了用于导航分层内容的基于...在这个视图控制选择一个 item,在界面上用动画推出一个新的视图控制,从而隐藏原来的视图控制。轻点界面顶端导航栏的返...
  • 该系列是iOS12人机交互指南的翻译,翻译的过程中加深自己的理解。...例如,考虑使用选择器而不是文本字段,因为从预定义选项列表中选择要比输入更容易。尽可能从系统中获取信息。不要强迫用户提供那...
  • iOS 应用启动优化简述

    2020-01-15 23:48:51
    iOS 应用启动优化简述 简单来说,一个应用的启动过程是指,用户点击应用图标开始,到用户看到该应用的第一个界面为止。...Objc 会初始化,包括 Objc 相关类的注册,分类(category)的注册以及选择器(sel...
  • 前段时间空余时间比较多,打算尝试做一个图片选择器出来,仔细对比了很多自定义了图片选择器的应用,感觉最喜欢微信的界面效果,当然微博的功能更强大,还支持了LivePhoto,所以打算模仿微信的界面效果,瞄着微博的...
  • 日期选择器:专门用于处理日期和时间;自定义选择器视图:可以根据需要配置成显示任意数量的组件。 一、UIDatePicker简介 UIDatePicker是一个控制器类,它是UIController的子类,专门用于接受日期、时间和持续时长...
  • 该库公开了一个跨平台的界面,用于显示模式内部的本机日期选择器和时间选择器,从而提供统一的用户和开发人员体验。 在后台,该库使用 。 设置(适用于非EXPO项目) 如果您的项目未使用 ,请使用npm或yarn安装库...
  • 本人还是学生,虽然接触iOS开发时间有一两年,但是都是仿照现有的例子做做,有什么错误希望...选中左侧文件列表中的Main.storyboard,从左下角的文件选择器中拖一个navigation controller进入界面,并将小箭头移到na
  • JavaScript中的Date对象在Safari与IOS中的“大坑”

    万次阅读 热门讨论 2016-05-30 15:50:19
    最近小编在做一个会议室预定的功能,这个功能就像在买电影票时选择座位一样,看看会议室的哪个时间段空闲,有什么设备等等。由于我做的是APP,APP既要兼容Android,又要兼容IOS,刚开始的开发与调试我都是用谷歌浏览...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

ios时间选择器界面