티스토리 뷰

반응형

시간 설정 시 Picker View에서 시간 제한하기.


사용 목적.

푸시 알림을 사용자가 정해준 시간에만 발송하기 위해 시작시간과 종료 시간을 설정.

피커를 사용하여 시작 시간은 종료시간보다 작게, 종료시간은 시작시간 보다 크게 설정하기 위해 사용.


결과

피커뷰에서 시간을 선택 할 경우 min, max 설정으로 인해 사용자가 시간을 선택 할 수 없게 한다.


코드

피커뷰를 닫을 수 있는 View를 추가하여 닫기 버튼 추가.

시작시간, 종료시간 label 선택 시 picker를 보여주고, 제한값을 준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    pickerCloseButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, height - (30+240), width, 30)];
    [pickerCloseButtonView setBackgroundColor:[UIColor lightGrayColor]];
    pickerCloseButtonView.layer.borderWidth = 0.6f;
    pickerCloseButtonView.layer.borderColor = [[UIColor lightGrayColor] CGColor];
    [self.view addSubview:pickerCloseButtonView];
    [pickerCloseButtonView setHidden:YES];
    
    UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [closeBtn setFrame:CGRectMake(width - 8006030)];
    [closeBtn setTitle:@"닫기" forState:UIControlStateNormal];
    closeBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
    [closeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [closeBtn addTarget:self action:@selector(selectPickerViewClose) forControlEvents:UIControlEventTouchUpInside];
    [pickerCloseButtonView addSubview:closeBtn];
    
    //시간 설정
    [datePIcker addTarget:self action:@selector(changeDatePicker) forControlEvents:UIControlEventValueChanged];
}
 
#pragma mark - DATE PICKER
 
- (IBAction)selectTimeLabel:(UIButton *)sender
{
    [datePIcker setHidden:NO];
    [pickerCloseButtonView setHidden:NO];
    
    datePIcker.tag = sender.tag;
    
    //피커 데이터 초기화.
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.timeStyle = NSDateFormatterShortStyle;
    df.dateStyle = NSDateFormatterShortStyle;
    df.dateFormat = @"HH:mm";
    
    [datePIcker setDate:[self getLimitedDate:(sender.tag==0)?app.sTime:app.eTime] animated:YES];
    
    if (sender.tag == 0)
    {
        //시작시간.
        [startBG setImage:[UIImage imageNamed:@"bg_timesetting_.png"]];
        datePIcker.minimumDate = NULL;
        datePIcker.maximumDate = [self getLimitedDate:app.eTime];
    }else{
        //종료시간.
        [endBG setImage:[UIImage imageNamed:@"bg_timesetting_.png"]];
        datePIcker.maximumDate = NULL;
        datePIcker.minimumDate = [self getLimitedDate:app.sTime];
    }
    
    NSLog(@"minimumData : %@, maximumDate : %@", datePIcker.minimumDate , datePIcker.maximumDate);
    NSLog(@"date : %@, %@", datePIcker.date , [df stringFromDate:datePIcker.date]);
 
    
    //hidden view 위치 정렬.
    CGRect tempFrame = pickerCloseButtonView.frame;
    tempFrame.origin.y = datePIcker.frame.origin.y - pickerCloseButtonView.frame.size.height;
    pickerCloseButtonView.frame = tempFrame;
}
 
 
//최저, 최고 시간을 구한다.
-(NSDate *)getLimitedDate:(NSString *)timeStr
{
    NSDate *date;
    
    NSDateComponents *com;
    
    NSDateFormatter *formatter;
    
    NSDate *today = [NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *weekdayComponentsY = [calendar components:NSYearCalendarUnit fromDate:today];
    NSDateComponents *weekdayComponentsM = [calendar components:NSMonthCalendarUnit fromDate:today];
    NSDateComponents *weekdayComponentsD = [calendar components:NSDayCalendarUnit fromDate:today];
    
    com = [[NSDateComponents alloc] init];
    
    [com setYear:[weekdayComponentsY year]];
    
    [com setMonth:[weekdayComponentsM month]];
    
    [com setDay:[weekdayComponentsD day]];
    
    [com setHour:[[timeStr substringToIndex:2] intValue]];
    
    [com setMinute:[[timeStr substringFromIndex:3] intValue]];
    
    date = [[NSCalendar currentCalendar] dateFromComponents:com];
    
    formatter = [[NSDateFormatter alloc] init];
    
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
    
    return date;
}
 
cs


반응형
댓글
반응형