2017-12-30 6 views
0

나는 데이터가있는 레이더 차트가 있습니다. 슬라이더의 인덱스를 제공하고 싶습니다. 데이터 개수를 기반으로합니다. 슬라이더를 움직이면 그래프 값이 움직여야합니다. 중간 값 슬라이더의 엄지 손가락으로 이동한다고 가정하십시오. 가까운 지수에.UIslider에서 색인 얻기

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 내가 인덱스가 value.pointIndex 슬라이더를 기억하고 move.In lastSliderValue 퍼센트이다.

@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 

      } 
     } 
    } 

도와주세요, 감사합니다.

+0

이것은 언어/통신 문제 일 가능성이 있지만 * 정확히 * 문제입니까? * 재현 할 수 있도록 무엇을 줄 수 있습니까? 나는 코드를 읽었고 괜찮은 것처럼 보였습니다.하지만 UISlider가 최소/최대 값을 설정하고 값이있는 것이 무엇인지 말해 줄 수 있습니까? 값을 프로그래밍 방식으로 * 설정하려는 것입니까? 사용자가 값을 변경하고 있지만 업데이트하지 않았습니까? 다시 말하지만 아마 저의 투표 일 것입니다. 그러나 실제 문제가 무엇인지 알기가 어렵습니다. – dfd

+0

사실 나는 최소 = 0 및 최대 = 100 슬라이더가 있습니다. 슬라이더에 내가 3 인덱스 (1,2,3) 있다고 가정하면. slider.value = 14, 슬라이더 엄지 이미지는 1로 이동해야합니다 (slidervalue가 있어야합니다 0 번째 위치). 슬라이더. 값 = 85 슬라이더 썸 이미지는 t0 인덱스 3으로 이동해야합니다. 슬라이더 값은 100 번째 위치에 있어야합니다. – Malleswari

+0

일반 슬라이더는이를 수행 할 수 없습니다. 제 생각에는 제 3 자 슬라이더가 있습니다. 당신은 아마 당신이 당신의 질문에 이것을 원한다는 것을 강조해야합니다. 'UISlider'에 최소/최대 1-3이 있고 슬라이더 트랙에서 * relative * 거리를 가져 와서 말하자면 1에서 2 사이의 거리를 구별하는 것이 쉽습니다. 다시, * 문제는 무엇입니까? – dfd

답변

0

슬라이더를 움직일 때 특정 이산 위치에서만 움직이게한다는 것을 의미합니까? 하지만 당신의 사양은 완전히 명확하지 않습니다. 만약 그렇다면, 이것이 내가하는 방식입니다. 슬라이더가 0에서 14로 이동하면 15에서 85로 14가 표시되고 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 
}