2017-12-30 16 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)があるとします。スライダの値が14の場合、スライダサムイメージはインデックス1に移動します(slidervalueは0番目の位置)。slider.value = 85スライダのサム画像はt0のインデックス3に移動する必要があります(スライダの値は100番目の位置にある必要があります) – Malleswari

+0

一般的なスライダではできません。私が考えることができるサードパーティのスライダがあります。あなたはおそらくあなたの質問にこれを欲しいと強調するべきです。 '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 
} 
関連する問題