xcode устанавливает прогресс Просмотр по дате окончания
Мне нужна ваша помощь с UIProgressView.
Мне нужно обновить мой прогресс с текущей даты до конечной даты, которую я выберу.
Этот метод обновляет только метку и показывает, сколько времени осталось до окончания временного круга.
-(void)updateProgressDate {
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [cal components:units fromDate:[NSDate date] toDate:destDate options:0];
[_dateLabel setText:[NSString stringWithFormat:@"%d%c %d%c %d%c %d%c %d%c", [components month], 'm', [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']];
}
-(void)viewDidLoad {
destDate = [NSDate dateWithTimeIntervalSince1970:1369342800];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateProgressDate) userInfo:nil repeats:YES];
}
Как я могу реализовать NSDateComponents для UIProgressView?
Спасибо
Обновлено:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
//1369342800
currentDate = [NSDate date];
destDate = [NSDate dateWithTimeIntervalSince1970:1369342800];
timeRemain = [destDate timeIntervalSinceDate:currentDate];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateProgressDate) userInfo:nil repeats:YES];
}
-(void)updateProgressDate {
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [cal components:units fromDate:currentDate toDate:destDate options:0];
//[_dateLabel setText:[NSString stringWithFormat:@"%d%c %d%c %d%c %d%c", [components month], 'm', [components day], 'd', [components hour], 'h', [components minute], 'm']];
[_dateLabel setText:[NSString stringWithFormat:@"%dm %dd %dh %dm", [components month], [components day], [components hour], [components minute]]];
[_progDate setProgress:_progDate.progress = timeRemain]; // here i did += -= right now my progress bar filled but that's not right. my circle 24 day until 24 day next month
// как я понимаю 1% месяца это 0,03 верно?
NSLog([NSString stringWithFormat:@"Remain time: %dm %dd %dh %dm"], timeRemain);
}
так что лейбл все в порядке, но индикатор всегда заполнен.
Где я не прав?
Спасибо
2 ответа
Вам нужно использовать setProgress:
,
UIProgessView принимает от 0,0 до 1,0 в качестве аргумента. вам нужно рассчитать оставшееся время в процентах с коэффициентом 100, а затем разделить его на 100,0, чтобы получить его в диапазоне от 0,0 до 1,0, и передать его в setProgress:
Редактировать:
Вместо указания char в качестве параметра его можно использовать как:
[_dateLabel setText:[NSString stringWithFormat:@"%dm %dd %dh %dm %ds", [components month], [components day], [components hour], [components minute], [components second]]];
Также вы не должны передавать строку, вы должны предоставить float. И сам NSTimeInterval находится в поплавке.
Как я уже сказал, вам нужно конвертировать время в проценты, а затем конвертировать его в указанный диапазон.
Итак, вот правильный код, по крайней мере, теперь я могу вычислить прошедшее время и отправить его в режим просмотра:
-(void)billRangeOperations {
today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];
NSString *currentDateFormated = [dateFormatter stringFromDate:today];
int dateFormated = [currentDateFormated intValue];
NSLog(@"Today is: %i", dateFormated);
//calculate how much days in current month ******************************************
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps = [cal components:units fromDate:today];
NSRange days = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:today];
NSUInteger numberOfDaysInMonth = days.length;
NSLog(@"%i Days in current month: %i", numberOfDaysInMonth, comps.month);
// end calculating ******************************************************************
// calculating elapsed billing range ************************************************
//dateFormated = 26; //Uncomment this string to check manually, how your billing works if date will be from 25 day of month !!!!!!!!!!!!!!!!!!!!!!!!
if (dateFormated < 25) {
int remainDaysInCurrentMonth = days.length - 25;
NSLog(@"Days Remain to the end of month: %i", remainDaysInCurrentMonth);
int elapsedTime = remainDaysInCurrentMonth + dateFormated;
NSLog(@"Elapsed Days: %i", elapsedTime);
float progress = elapsedTime * 100 / days.length;
NSLog(@"Progress Days: %f", progress);
float progressTimeFormated = progress / 100;
NSLog(@"Going to ProgressView: %f", progressTimeFormated);
// *************************************************************
[progV setProgress:progressTimeFormated animated:YES];
// remain days to the end period to text string *************************************
int remainDaysPeriod = 25 - dateFormated;
remainDays.text = [NSString stringWithFormat:@"%i", remainDaysPeriod];
// **********************************************************************************
} else if (dateFormated >= 25) {
//***** calculating days in next month *************************
comps.month = comps.month+1;
NSRange range = [cal rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:[cal dateFromComponents:comps]];
NSLog(@"%i Days in next month: %i", range.length, comps.month);
//**************************************************************
int remainDaysInCurrentMonth = range.length - 25;
NSLog(@"Days Remain in current month: %i", remainDaysInCurrentMonth);
int elapsedTime = dateFormated - 25;
NSLog(@"Elapsed Time: %i", elapsedTime);
float progress = elapsedTime * 100 / range.length;
NSLog(@"Progress time: %f", progress);
float progressTimeFormated = progress / 100;
NSLog(@"Going to ProgressView: %f", progressTimeFormated);
// end calculating elapsed billing range
[progV setProgress:progressTimeFormated animated:YES];
// remain days to the end period ********************************************************
int remainDaysPeriod = remainDaysInCurrentMonth+25-elapsedTime;
remainDays.text = [NSString stringWithFormat:@"%i", remainDaysPeriod];
// **************************************************************************************
NSLog(@"More than 25");
}
}