做了一个预产期计算器,首先看一下效果图:
对于预产期的计算方法网上可以查到很多,我简单说下比较容易理解的,最后一次月经时间加上280天(平均月经周期28天 * 10个月),根据月经周期有一点浮动,最后的公式应该为:末次月经时间 + 280天 + (月经周期 - 28天)。
前两篇文章写了自定义UIDatePicker日期选择器视图和自定义UIPickerView天数选择器视图,相关代码可以点击连接查看,下面贴上控制器代码:
#import "ViewController.h"
#import "HWDatePicker.h"
#import "HWDaysPicker.h"
#define mainW [UIScreen mainScreen].bounds.size.width
#define mainH [UIScreen mainScreen].bounds.size.height
@interface ViewController ()<UITextFieldDelegate, HWDatePickerDelegate, HWDaysPickerDelegate>
@property (nonatomic, strong) UITextField *predicted;
@property (nonatomic, strong) UITextField *menstrualTime;
@property (nonatomic, strong) UITextField *menstrualDays;
@property (nonatomic, strong) HWDatePicker *datePicker;
@property (nonatomic, strong) HWDaysPicker *daysPicker;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
//创建控件
[self creatControl];
}
- (void)creatControl
{
NSArray *textArray = @[@" 您的预产期是:", @" 末次月经时间", @" 月经周期天数"];
NSArray *placeholderArray = @[@"", @"请设置末次时间", @"请设置周期天数"];
//textField
for (int i = 0; i < 3; i++) {
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(mainW * 0.05, mainW * 0.25 + mainW * 0.15 * i, mainW * 0.8, mainW * 0.12)];
textField.background = [UIImage imageNamed:@"textFieldBj"];
textField.delegate = self;
textField.placeholder = placeholderArray[i];
//左视图
UILabel *left = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, mainW * 0.4, mainW * 0.12)];
left.textAlignment = NSTextAlignmentLeft;
left.text = textArray[i];
left.textColor = [UIColor grayColor];
textField.leftView = left;
textField.leftViewMode = UITextFieldViewModeAlways;
//右视图
UILabel *right = [[UILabel alloc] initWithFrame:CGRectMake(mainW * 0.12 - 15, 0, 15, mainW * 0.12)];
textField.rightView = right;
textField.rightViewMode = UITextFieldViewModeAlways;
textField.textAlignment = NSTextAlignmentRight;
[self.view addSubview:textField];
if (i == 0) {
self.predicted = textField;
}else if (i == 1) {
self.menstrualTime = textField;
}else {
self.menstrualDays = textField;
}
}
//计算按钮
UIButton *computeBtn = [[UIButton alloc] initWithFrame:CGRectMake(mainW * 0.49, mainW * 0.7, mainW * 0.36, mainW * 0.11)];
[computeBtn setImage:[UIImage imageNamed:@"computeBtn"] forState:UIControlStateNormal];
[computeBtn addTarget:self action:@selector(computeBtnOnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:computeBtn];
//日期选择器
_datePicker = [[HWDatePicker alloc] initWithFrame:CGRectMake(mainW * 0.05, mainH, mainW * 0.9, mainW * 0.5)];
_datePicker.delegate = self;
[self.view addSubview:_datePicker];
}
//天数选择器
- (HWDaysPicker *)daysPicker
{
if (_daysPicker == nil) {
_daysPicker = [[HWDaysPicker alloc] initWithFrame:CGRectMake(mainW * 0.05, mainH, mainW * 0.9, mainW * 0.5)];
_daysPicker.delegate = self;
[self.view addSubview:_daysPicker];
}
return _daysPicker;
}
//计算按钮点击事件
- (void)computeBtnOnClick
{
if ([_menstrualTime.text isEqualToString:@""]) {
NSLog(@"未设置末次月经时间");
}else if ([_menstrualDays.text isEqualToString:@""]) {
NSLog(@"未设置月经周期天数");
}else {
[_daysPicker dismiss];
[_datePicker dismiss];
NSInteger days = 280 + ([_menstrualDays.text integerValue] - 28);
_predicted.text = [self computeDateWithDays:days];
}
}
//计算一定天数后的新日期
- (NSString *)computeDateWithDays:(NSInteger)days
{
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *myDate = [dateFormatter dateFromString:_menstrualTime.text];
NSDate *newDate = [myDate dateByAddingTimeInterval:60 * 60 * 24 * days];
return [dateFormatter stringFromDate:newDate];
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if (textField == _predicted) {
return NO;
}else if (textField == _menstrualTime) {
if (_datePicker.frame.origin.y != mainH) {
[_datePicker dismiss];
}else{
[_daysPicker dismiss];
[_datePicker show];
}
return NO;
}else if (textField == _menstrualDays) {
if (self.daysPicker.frame.origin.y != mainH) {
[_daysPicker dismiss];
}else {
[_datePicker dismiss];
[self.daysPicker show];
}
return NO;
}
return YES;
}
#pragma mark - HWDatePickerDelegate
- (void)datePickerView:(HWDatePicker *)datePickerView didClickSureBtnWithSelectDate:(NSString *)date
{
_menstrualTime.text = date;
}
#pragma mark - HWDaysPickerDelegate
- (void)daysPickerView:(HWDaysPicker *)daysPicker didSelectRowWithDays:(NSString *)days
{
_menstrualDays.text = days;
}
@end