在UIslider上获取索引

问题描述 投票:0回答:1

我有雷达图表数据。我想给滑块索引根据数据计数。如果我移动滑块,图形值应该移动。如果我在中间值滑块拇指的下方应该转到近指数。

for _ in 0..<3 {
  let mind = arc4random_uniform(mult) + min
  let bre = arc4random_uniform(mult) + min
  let rel = arc4random_uniform(mult) + min
  dataPoints.append(GraphDataPoints(mindfulness: Double(mind), breathing: Double(bre), relaxation: Double(rel)))
}
self.setChartData(mindfulness: dataPoints[0].mindfulness, breathing: dataPoints[0].breathing, relaxation: dataPoints[0].relaxation)
numberofPointsOnSlider = Float(100 / (dataPoints.count - 1))

numberofPointsOnSlider是要移动的百分比。在lastSliderValue中我存储滑块value.pointIndex有索引。

@objc func sliderTouchEvents(slider:UISlider,event: UIEvent){
        slider.isContinuous = true

        if let touchEvent = event.allTouches?.first{
            switch touchEvent.phase{

            case .began:
                    lastSliderValue = slider.value
                break
            case .moved:
                if  slider.value.truncatingRemainder(dividingBy: numberofPointsOnSlider)  == 0{

                    if lastSliderValue < slider.value || lastSliderValue > slider.value{
                        pointIndex = Int(slider.value / numberofPointsOnSlider)
                        self.isIncrement = false
                    }
                     lastSliderValue = slider.value
               }
                if !animation {
                    if pointIndex >= 0 && pointIndex < dataPoints.count  {

                        var  percentToMove:Float = 0

                        if lastSliderValue > slider.value && pointIndex > 0  {

                            percentToMove = (100 * (numberofPointsOnSlider - (slider.value.truncatingRemainder(dividingBy: numberofPointsOnSlider) ))) / numberofPointsOnSlider
                            mindfulDiff = Float(dataPoints[pointIndex].mindfulness - dataPoints[pointIndex - 1].mindfulness)

                            relaxationDiff = Float(dataPoints[pointIndex].relaxation - dataPoints[pointIndex - 1].relaxation)

                            breathingDiff = Float(dataPoints[pointIndex].breathing - dataPoints[pointIndex - 1].breathing)

                        }else if lastSliderValue < slider.value && pointIndex < dataPoints.count - 1 {

                            percentToMove = (100 * (slider.value.truncatingRemainder(dividingBy: numberofPointsOnSlider) )) / numberofPointsOnSlider

                            mindfulDiff = Float(dataPoints[pointIndex].mindfulness - dataPoints[pointIndex + 1].mindfulness)

                            relaxationDiff = Float(dataPoints[pointIndex].relaxation - dataPoints[pointIndex + 1].relaxation)
                            breathingDiff = Float(dataPoints[pointIndex].breathing - dataPoints[pointIndex + 1].breathing)
                        }

                        mp = Float(dataPoints[pointIndex].mindfulness) - (mindfulDiff / 100 ) * percentToMove
                        rp = Float(dataPoints[pointIndex].relaxation) - (relaxationDiff / 100 ) * percentToMove
                        bp = Float(dataPoints[pointIndex].breathing) - (breathingDiff / 100) * percentToMove
                        UIView.animate(withDuration: 10, animations: {
                            self.setChartData(mindfulness: Double(self.mp) , breathing: Double(self.bp) , relaxation: Double(self.rp) )
                        })

                    }
                    else {
                        if (pointIndex < 0) {
                            pointIndex = 0

                        }
                    }
                }

                break
            case .ended:

                let progDiff = lastSliderValue - slider.value
                print("End movie, \(pointIndex) , \(slider.value) ,progDiff: \(progDiff)")

                if progDiff < 0{
                    if (progDiff * -1) >= numberofPointsOnSlider / 2 {
                        animation = true

                        UIView.animate(withDuration: 10, animations: {
                            slider.value += self.numberofPointsOnSlider + progDiff
                        })
                        pointIndex = Int(slider.value / numberofPointsOnSlider)+1
//                        if isIncrement {
//                            pointIndex += pointIndex
//                        }else  {
//                            isIncrement = true
//
//                        }
                            mindfulDiff = Float(dataPoints[pointIndex].mindfulness - Double(mp))
                            relaxationDiff = Float(dataPoints[pointIndex].relaxation - Double(rp))
                            breathingDiff = Float(dataPoints[pointIndex].breathing - Double(bp))

                        doGraphAnimate()
                        }else {
                        animation = true
                        UIView.animate(withDuration: 10, animations: {
                            slider.value = self.lastSliderValue
                        })


                        mindfulDiff = Float(dataPoints[pointIndex].mindfulness - Double(mp))
                        relaxationDiff = Float(dataPoints[pointIndex].relaxation - Double(rp))
                        breathingDiff = Float(dataPoints[pointIndex].breathing - Double(bp))

                        doGraphAnimate()
                    }
                }else if progDiff > 0{

                    if progDiff >= numberofPointsOnSlider / 2 {
                        animation = true
//                        if isIncrement {
//                            print("pointIndex : \(pointIndex)")
//                            pointIndex += pointIndex
//                            print("pointIndex Incremented : \(pointIndex)")
//                        }else{
//                                isIncrement = true
//                        }
                        pointIndex = Int(slider.value / numberofPointsOnSlider)
                        UIView.animate(withDuration: 10, animations: {
                            slider.value -= self.numberofPointsOnSlider - (self.lastSliderValue - slider.value)
                        })

                        mindfulDiff = Float(dataPoints[pointIndex].mindfulness - Double(mp))
                        relaxationDiff = Float(dataPoints[pointIndex].relaxation - Double(rp))
                        breathingDiff = Float(dataPoints[pointIndex].breathing - Double(bp))
                        doGraphAnimate()

                    }
                    else {
                        animation = true
                        UIView.animate(withDuration: 10, animations: {
                            slider.value = self.lastSliderValue
                        })

                        mindfulDiff = Float(dataPoints[pointIndex].mindfulness - Double(mp))
                        relaxationDiff = Float(dataPoints[pointIndex].relaxation - Double(rp))
                        breathingDiff = Float(dataPoints[pointIndex].breathing - Double(bp))

                        doGraphAnimate()
                    }
                }

            default :
                break

            }
        }
    }

帮帮我,谢谢。

ios swift uislider ios-charts
1个回答
0
投票

你的意思是你希望滑块在移动时只在某些离散位置移动吗?但你的规格并不完全清楚。如果是这样,这就是我,所以如果滑块从0移动到14它将显示14,从15到85,它将显示85.我让你适应以获得你想要的确切工作。我将这个IBAction用于滑块

@IBAction fileprivate func changeRowSlider(_ sender: NSSlider) {

    let movedPosition = Int(sender.doubleValue)
    if movedPosition == 0 {
        sender.integerValue = 0
        return
    }
     if movedPosition <= 14 {
        sender.integerValue = 14
        return
    }
     if movedPosition <= 85 {
        sender.integerValue = 85
        return
    }
    sender.integerValue = 100  // last case: move to maxValue
}
© www.soinside.com 2019 - 2024. All rights reserved.