UIDatePicker с интервалом 15 м, но всегда точное время в качестве возвращаемого значения

У меня есть режим UIDatePicker в режиме времени с интервалом в 15 минут.

Скажем, это 7:22 вечера. Значение, отображаемое в списке по дате по умолчанию, представляет собой текущее время, округленное до следующего более высокого/более низкого значения, в этом случае оно равно 7:15 вечера. Если пользователь взаимодействует с устройством выбора даты, показанное значение также возвращает значение. Однако, если не было никакого взаимодействия с пользователем, и я получаю время с [UIDatePicker date], возвращаемое значение является точным текущим временем, то есть 7:22, чтобы придерживаться примера. Есть ли способ всегда получать значение, которое фактически отображается в списке выбора даты, а не в текущее время, даже если пользователь явно не выбрал значение? Я уже пытался установить сборщик вручную с помощью [UIDatePicker setDate:[NSDate date]], но это не меняет поведения.

Любые подсказки? Спасибо заранее!

Ответы

Ответ 1

Это не идеальное решение, но оно работает для меня. Я взял его из другого сообщения и изменил его, чтобы принимать разные значения.

- (NSDate*)clampDate:(NSDate *)dt toMinutes:(int)minutes {
int referenceTimeInterval = (int)[dt timeIntervalSinceReferenceDate];
int remainingSeconds = referenceTimeInterval % (minutes*60);
int timeRoundedTo5Minutes = referenceTimeInterval - remainingSeconds; 
if(remainingSeconds>((minutes*60)/2)) {/// round up
    timeRoundedTo5Minutes = referenceTimeInterval +((minutes*60)-remainingSeconds);            
}
 return [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)timeRoundedTo5Minutes];
}

Введите дату ввода и минутное значение (взятое из UIDatePicker.minuteInterval в случае этого потока), и оно вернет время, зажатое до этого интервала, который вы можете подать на сборщик.

Ответ 2

Я изменил ответ @ima747 для Swift 3/4 и как расширение UIDatePicker. picker.clampedDate

extension UIDatePicker {
    /// Returns the date that reflects the displayed date clamped to the `minuteInterval` of the picker.
    /// - note: Adapted from [ima747's](http://stackoverflow.com/users/463183/ima747) answer on [Stack Overflow](http://stackoverflow.com/info/7504060/uidatepicker-with-15m-interval-but-always-exact-time-as-return-value/42263214#42263214})
    public var clampedDate: Date {
        let referenceTimeInterval = self.date.timeIntervalSinceReferenceDate
        let remainingSeconds = referenceTimeInterval.truncatingRemainder(dividingBy: TimeInterval(minuteInterval*60))
        let timeRoundedToInterval = referenceTimeInterval - remainingSeconds
        return Date(timeIntervalSinceReferenceDate: timeRoundedToInterval)
    }
}