zoukankan      html  css  js  c++  java
  • iOS 自定义只有年月的DatePikerView

    头文件:

    @interface YearMonthPikerView : UIView
    
    @property (nonatomic,copy) void(^cancelBlock)();
    
    @property (nonatomic,copy) void(^sureBlock)(NSString*,NSString*);
    
    @end

    实现文件:

    #import "YearMonthPikerView.h"
    
    static const int loop = 20;
    
    @interface YearMonthPikerView()<UIPickerViewDelegate,UIPickerViewDataSource>
    
    @property (weak, nonatomic) IBOutlet UIButton *cancelBtn;
    
    @property (weak, nonatomic) IBOutlet UIButton *sureBtn;
    
    @property (weak, nonatomic) IBOutlet UIPickerView *ymPikerView;
    
    @property (nonatomic,strong) NSArray *monthsArr;   //月份的数组
    
    @property (nonatomic,strong) NSArray *yearsArr;    //年份的数组
    
    @property (nonatomic,strong) NSDateFormatter *formatter;
    
    @property (nonatomic,strong) NSString *currentYear;
    
    @property (nonatomic,strong) NSString *currentMonth;
    
    @property (nonatomic,assign) BOOL isCurrentYear;
    
    @property (nonatomic,strong) NSString *selectYear;
    
    @property (nonatomic,strong) NSString *selectMonth;
    
    @end
    
    @implementation YearMonthPikerView
    
    - (void)awakeFromNib{
        [super awakeFromNib];
        
        self.ymPikerView.delegate = self;
        self.ymPikerView.dataSource = self;
        
        //初始化
        self.monthsArr = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12"];
        
        [self.formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"] ];
        NSDate *currentDate = [NSDate date];
        
        [self.formatter setDateFormat:@"MM"];
        self.currentMonth = [self.formatter stringFromDate:currentDate];
        self.selectMonth = self.monthsArr[(self.currentMonth.integerValue-1)];
        
        [self.formatter setDateFormat:@"yyyy"];
        self.currentYear = [self.formatter stringFromDate:currentDate];
        self.selectYear = self.currentYear;
        
        NSMutableArray <NSString*>*yearsArr = [NSMutableArray array];
        [yearsArr addObject:self.currentYear];
        
        int nowYear = [self.currentYear intValue];
        for (int i=0; i<loop; i++) {
            nowYear = nowYear - 1;
            NSString *nowYearStr = [NSString stringWithFormat:@"%d",nowYear];
            [yearsArr insertObject:nowYearStr atIndex:0];
        }
        self.yearsArr = yearsArr;
        self.isCurrentYear = YES;
        [self.ymPikerView selectRow:(self.yearsArr.count-1) inComponent:0 animated:YES];
        [self.ymPikerView selectRow:(self.currentMonth.intValue-1) inComponent:1 animated:YES];
        
    }
    
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
        return 2.0;
    }
    
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
        if (component==0) {
            return self.yearsArr.count;
        }else if (component==1){
            if (self.isCurrentYear) {
                return self.currentMonth.integerValue;
            }else{
                return self.monthsArr.count;
            }
        }else{
            return 0;
        }
    }
    
    
    - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
        if (component==0) {
            NSString *year = self.yearsArr[row];
            year = [year stringByAppendingString:@""];
            return year;
        }else if (component==1){
            NSString *month = self.monthsArr[row];
            month = [month stringByAppendingString:@""];
            return month;
        }else{
            return nil;
        }
    }
    
    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
        if (component==0 && row==self.yearsArr.count-1) {
            self.isCurrentYear = YES;
            [self.ymPikerView reloadComponent:1];
            
            self.selectYear = self.yearsArr[row];
        }else if (component==0){
            self.isCurrentYear = NO;
            [self.ymPikerView reloadComponent:1];
            
            self.selectYear = self.yearsArr[row];
        }else if (component==1){
            self.selectMonth = self.monthsArr[row];
        }
    }
    
    
    - (IBAction)cancelBtnClick:(UIButton *)sender {
        if (self.cancelBlock) {
            self.cancelBlock();
        }
    }
    
    
    - (IBAction)sureBtnClick:(UIButton *)sender {
        if (self.sureBlock) {
            self.sureBlock(self.selectYear, self.selectMonth);
        }
    }
    
    
    #pragma mark - 懒加载
    - (NSDateFormatter*)formatter{
        if (_formatter==nil) {
            _formatter = [[NSDateFormatter alloc]init];
        }
        return _formatter;
    }
    
    @end

    效果如下图:

    Demo地址如下:https://github.com/LuPing-Kuang/iOS-YearMonthPickerView

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/Caersi/p/6741987.html
Copyright © 2011-2022 走看看