UI Slider Время дня после полуночи?

Так что это уникальная ситуация. У меня есть двойной слайдер, который я сделал с помощью swift, чтобы сделать выбор временного диапазона, как у Kayak. К сожалению, мое время должно быть от 00:00 до 04:00 следующего утра.

Было легко получить его с 00:00 до 23:59, используя шкалу 86340 секунд для управления ползунком. Я просто включаю это в эту маленькую функцию и вырываю правильный диапазон на обоих концах / ручках:

func getTimeStringFromSeconds(seconds: Double) -> String {
    let dcFormatter = NSDateComponentsFormatter()
    dcFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehavior.Pad
    dcFormatter.allowedUnits = [NSCalendarUnit.Hour, NSCalendarUnit.Minute]
    dcFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Positional
    return dcFormatter.stringFromTimeInterval(seconds)!
}

Как вы можете видеть на скриншоте выше, у меня вместо шкалы 100740 секунд. Как я могу заставить его выйти за пределы 23:59, затем сбросить на 00:00 и перейти на следующий день? Я могу сделать это до 28:00, как видно выше, что технически будет 4 утра, но я хочу, чтобы все началось сначала и показывало 04:00, а не 28:00. Какое хорошее решение для этого?

Как примечание, мое единственное решение до сих пор было своего рода взломом, чтобы заставить ярлык сказать 0:00, сбрасывая секунды до 0,00, когда он превышает 86340. Масштаб по-прежнему составляет 100740, но есть некоторая математика, подобная следующей, чтобы сделать лейбл говорит иначе, не связываясь со значением ручки (upperValue):

if upperKnobLayer.highlighted {
            upperValue += valueDelta
            upperValue = max(min(maximumValue, upperValue), lowerValue)
            var upperDouble = Double(round(upperValue))
            if upperDouble > 86340.00 {
                let newValue = upperDouble - 86340
                upperDouble = 0.00 + newValue
            }
            upperTime = getTimeStringFromSeconds(upperDouble)
}

2 ответа

Решение

Это поможет опубликовать реализацию вашего средства выбора, но обычно вы хотите, чтобы тип значения ползунков был NSTimeIntervals. Тогда у вас может быть контрольная дата, которая будет в полночь 00:00 сегодняшнего дня. Вы можете использовать NSDate(timeIntervalSince:referenceDate), чтобы затем получить NSDate, представляющий любую дату, начиная с этой ссылочной даты, которая может быть соответствующим образом отформатирована и отображена на экране. Дополнительным преимуществом этого способа является то, что фактический день даты будет правильным, если ваш timeInterval перенесет его на следующий день.

Как насчет нормализации до дневной ценности секунд.

return dcFormatter.stringFromTimeInterval(seconds % 86340)!
Другие вопросы по тегам