Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中使用带日期而不是数字的范围滑块?_Ios_Swift_Uislider - Fatal编程技术网

Ios 如何在Swift中使用带日期而不是数字的范围滑块?

Ios 如何在Swift中使用带日期而不是数字的范围滑块?,ios,swift,uislider,Ios,Swift,Uislider,我正在研究range slider的这个实现:我看到它的lowerValue和upperValue默认设置为0.2和0.8: @IBInspectable var lowerValue: Double = 0.2 { didSet { if lowerValue < minimumValue { lowerValue = minimumValue } updateLayerFrames() } } @

我正在研究range slider的这个实现:我看到它的lowerValue和upperValue默认设置为0.2和0.8:

@IBInspectable var lowerValue: Double = 0.2 {
    didSet {
        if lowerValue < minimumValue {
            lowerValue = minimumValue
        }
        updateLayerFrames()
    }
}

@IBInspectable var upperValue: Double = 0.8 {
    didSet {
        if upperValue > maximumValue {
            upperValue = maximumValue
        }
        updateLayerFrames()
    }
}
@IBInspectable var lowerValue:Double=0.2{
迪塞特{
如果下限值<最小值{
lowerValue=最小值
}
updateLayerFrames()
}
}
@IBInspectable var upperValue:双精度=0.8{
迪塞特{
如果上限值>最大值{
上限值=最大值
}
updateLayerFrames()
}
}
它还将minimumValue和maximumValue设置为0和1:

@IBInspectable var minimumValue: Double = 0.0 {
    willSet(newValue) {
        assert(newValue < maximumValue, "RangeSlider: minimumValue should be lower than maximumValue")
    }
    didSet {
        updateLayerFrames()
    }
}

@IBInspectable var maximumValue: Double = 1.0 {
    willSet(newValue) {
        assert(newValue > minimumValue, "RangeSlider: maximumValue should be greater than minimumValue")
    }
    didSet {
        updateLayerFrames()
    }
}
@IBInspectable var minimumValue:Double=0.0{
willSet(新值){
断言(newValueminimumValue,“范围滑块:maximumValue应大于minimumValue”)
}
迪塞特{
updateLayerFrames()
}
}
我想更改此滑块的行为,使其成为范围日期选择器-maximumValue应该是当前日期,minimumValue应该是过去的某个日期,例如6个月前。 你能帮我一下吗?并给我一些提示,这个范围滑块是否可以这样做?

这个应该可以

class ViewController: UIViewController {

    var slider:UISlider?
    // These number values represent each slider position
    let daysInPast = [14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] //Add your values here - this sets from two past weeks to current day
    let secondsPerDay = 86400
    var oldIndex = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        slider = UISlider(frame: self.view.bounds)
        self.view.addSubview(slider!)

        // slider values go from 0 to the number of values in your numbers array
        var numberOfSteps = Float(numbers.count - 1)
        slider!.maximumValue = numberOfSteps;
        slider!.minimumValue = 0;

        // As the slider moves it will continously call the -valueChanged:
        slider!.continuous = true; // false makes it call only once you let go
        slider!.addTarget(self, action: "valueChanged:", forControlEvents: .ValueChanged)
    }

    func valueChanged(sender: UISlider) {
        // round the slider position to the nearest index of the numbers array
        var index = (Int)(slider!.value + 0.5);
        slider?.setValue(Float(index), animated: false)
        var dayInPast = daysInPast[index]; // <-- This numeric value you want

        if oldIndex != index {

            let today = NSDate() //today
            //every day value in the slider will be multiplied by number of seconds in day
            let pickedDate = today.dateByAddingTimeInterval(-secondsPerDay * dayInPast)
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components([.Month, .Year, .Day], fromDate: pickedDate)
            let month = components.month
            let year = components.year
            let day = components.day

            print("Date picked with slider is \(month)/\(day), \(year)")

            oldIndex = index
        }
    }
}
类ViewController:UIViewController{
变量滑块:UISlider?
//这些数值表示每个滑块位置
让daysinpass=[14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]//在此处添加您的值-设置从过去两周到当前一天的值
让secondsPerDay=86400
var oldIndex=0
重写func viewDidLoad(){
super.viewDidLoad()
slider=UISlider(帧:self.view.bounds)
self.view.addSubview(滑块!)
//滑块值从0到数字数组中的值数
var numberOfSteps=Float(numbers.count-1)
滑块!.maximumValue=步数;
滑块!.minimumValue=0;
//当滑块移动时,它将不断调用-valueChanged:
slider!.continuous=true;//false使其仅在释放后调用
slider!.addTarget(自身,操作:“valueChanged:”,forControlEvents:.valueChanged)
}
func值已更改(发送方:UISlider){
//将滑块位置四舍五入到数字数组的最近索引
var指数=(Int)(滑块!.value+0.5);
滑块?设置值(浮动(索引),动画:假)
var dayInPast=daysinpass[index];//这应该可以做到

class ViewController: UIViewController {

    var slider:UISlider?
    // These number values represent each slider position
    let daysInPast = [14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] //Add your values here - this sets from two past weeks to current day
    let secondsPerDay = 86400
    var oldIndex = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        slider = UISlider(frame: self.view.bounds)
        self.view.addSubview(slider!)

        // slider values go from 0 to the number of values in your numbers array
        var numberOfSteps = Float(numbers.count - 1)
        slider!.maximumValue = numberOfSteps;
        slider!.minimumValue = 0;

        // As the slider moves it will continously call the -valueChanged:
        slider!.continuous = true; // false makes it call only once you let go
        slider!.addTarget(self, action: "valueChanged:", forControlEvents: .ValueChanged)
    }

    func valueChanged(sender: UISlider) {
        // round the slider position to the nearest index of the numbers array
        var index = (Int)(slider!.value + 0.5);
        slider?.setValue(Float(index), animated: false)
        var dayInPast = daysInPast[index]; // <-- This numeric value you want

        if oldIndex != index {

            let today = NSDate() //today
            //every day value in the slider will be multiplied by number of seconds in day
            let pickedDate = today.dateByAddingTimeInterval(-secondsPerDay * dayInPast)
            let calendar = NSCalendar.currentCalendar()
            let components = calendar.components([.Month, .Year, .Day], fromDate: pickedDate)
            let month = components.month
            let year = components.year
            let day = components.day

            print("Date picked with slider is \(month)/\(day), \(year)")

            oldIndex = index
        }
    }
}
类ViewController:UIViewController{
变量滑块:UISlider?
//这些数值表示每个滑块位置
让daysinpass=[14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]//在此处添加您的值-设置从过去两周到当前一天的值
让secondsPerDay=86400
var oldIndex=0
重写func viewDidLoad(){
super.viewDidLoad()
slider=UISlider(帧:self.view.bounds)
self.view.addSubview(滑块!)
//滑块值从0到数字数组中的值数
var numberOfSteps=Float(numbers.count-1)
滑块!.maximumValue=步数;
滑块!.minimumValue=0;
//当滑块移动时,它将不断调用-valueChanged:
slider!.continuous=true;//false使其仅在释放后调用
slider!.addTarget(自身,操作:“valueChanged:”,forControlEvents:.valueChanged)
}
func值已更改(发送方:UISlider){
//将滑块位置四舍五入到数字数组的最近索引
var指数=(Int)(滑块!.value+0.5);
滑块?设置值(浮动(索引),动画:假)

var dayInPast=daysinpass[index];//谢谢,不过我想制作一个范围日期时间选择器,这样用户可以在两个日期之间选择一个范围,并且可以在滑块上修改两个日期。在您的解决方案中,只能选择一个日期:(您在操作中没有提到这一点。也就是说,上面的代码可以很容易地调整为使用自定义范围-您只需稍加努力即可。谢谢,不过我想制作一个范围日期时间选择器,以便用户可以在两个日期之间选择一个范围-他可以在滑块上修改两个日期。在您的解决方案中,可以选择single date only:(您在OP中没有提到这一点。也就是说,上面的代码可以很容易地调整为使用自定义范围-您只需稍加努力。