2017-11-14 4 views
0

Ich habe einen Beizer Weg mit Start & Endwinkel, die einen ganzen KreisWie finde ich den Endwinkel für Beizerpath für eine in swift gezogene Kurve?

circle = UIView(frame: CGRect(x: 100, y: 100, width: 200, height:200)) 
     circle.layoutIfNeeded() 
     self.view.addSubview(circle) 
     let centerPoint = CGPoint (x: circle.bounds.width/2, y: circle.bounds.width/2) 
     let circleRadius : CGFloat = circle.bounds.width/2 * 0.83 
     circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(-0.5 * M_PI), endAngle: CGFloat(1.5 * M_PI), clockwise: true) 

Danach i & es in den Kreis voll füllt nicht zeichnen Sie eine Kurve auf diesem Kreis erstellen gezogen.

progressCircle = CAShapeLayer() 
     progressCircle.path = circlePath?.cgPath 
     progressCircle.strokeColor = UIColor.red.cgColor 
     progressCircle.fillColor = UIColor.clear.cgColor 
     progressCircle.lineWidth = 4.0 
     progressCircle.strokeStart = 0 
     progressCircle.strokeEnd = 0.7 
     circle.layer.addSublayer(progressCircle) 

Danach i Bild hinzufügen mag bei dann so der Kurve am Ende zu tun, dass ich einen anderen biezer path.But erstellt hier Problem ist es sollte als die Kurve beendet werden end.So i nicht in der Lage bin zu finden Endwinkel für den Beizer-Pfad basierend auf dem endStroke von CASHAPELAYER. Bitte sagen Sie mir, wie ich den Endwinkel des neuen Beizer-Pfades basierend auf dem Kurvenendpunkt finden kann. Fortschritt Prozentsatz an Stellen auf der Basis der 360-Grad-

let centerPoint = CGPoint (x: circle.bounds.width/2, y: circle.bounds.width/2) 
     let circleRadius : CGFloat = circle.bounds.width/2 * 0.83 
     let arcStartAngle: Double = 0.0 


     let rotationDiff = 360 - abs((0.0 - 270)) 
     let startAngle: CGFloat = -1.57 
     let endAngle: CGFloat = CGFloat(Double.pi * 0.7) 
     let bpath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: startAngle, endAngle: endAngle, clockwise: true) 

enter image description here

Antwort

0
class ViewController: UIViewController { 

    var array = [[CGFloat:CGFloat]]() 
    var midX : CGFloat = CGFloat() 
    var midY : CGFloat = CGFloat() 
    let radius : CGFloat = 100.0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     midX = self.view.frame.midX 
     midY = self.view.frame.midY 

     let path = UIBezierPath() 
     path.addArc(withCenter: CGPoint.init(x: midX, y: midY), radius: radius, startAngle: 0, endAngle:2 * .pi, clockwise: true) 
     let shape = CAShapeLayer() 
     shape.path = path.cgPath 
     shape.lineWidth = 5.0 
     shape.fillColor = UIColor.clear.cgColor 
     shape.strokeColor = UIColor.lightGray.cgColor 
     self.view.layer.addSublayer(shape) 


     var temp090x = [CGFloat:CGFloat]() 
     var temp90180x = [CGFloat:CGFloat]() 
     var temp180270x = [CGFloat:CGFloat]() 
     var temp270360x = [CGFloat:CGFloat]() 



     for i in 1...360 { 
      let path3 = UIBezierPath() 
      path3.move(to: CGPoint.init(x: midX, y: midY)) 
      path3.addLine(to:CGPoint.init(x: midX + radius * sin(CGFloat(i)), y:midY + radius*cos(CGFloat(i)))) 
      //design path in layer 
      if midX + radius * sin(CGFloat(i)) > midX && midY + radius*cos(CGFloat(i)) < midY { 
       temp090x[midX + radius * sin(CGFloat(i))] = midY + radius*cos(CGFloat(i)) 
      }else if midX + radius * sin(CGFloat(i)) > midX && midY + radius*cos(CGFloat(i)) > midY { 
       temp90180x[midX + radius * sin(CGFloat(i))] = midY + radius*cos(CGFloat(i)) 
      }else if midX + radius * sin(CGFloat(i)) < midX && midY + radius*cos(CGFloat(i)) > midY { 
       temp180270x[midX + radius * sin(CGFloat(i))] = midY + radius*cos(CGFloat(i)) 
      }else if midX + radius * sin(CGFloat(i)) < midX && midY + radius*cos(CGFloat(i)) < midY { 
       temp270360x[midX + radius * sin(CGFloat(i))] = midY + radius*cos(CGFloat(i)) 
      } 
      let shapeLayer3 = CAShapeLayer() 
      shapeLayer3.path = path3.cgPath 
      shapeLayer3.strokeColor = UIColor.clear.cgColor 
      shapeLayer3.lineWidth = 1.0 
      self.view.layer.addSublayer(shapeLayer3) 
     } 

     let tempSorted090x = BubbleAsceSort(array: temp090x) 
     let tempSorted90180x = BubbleDescSort(array: temp90180x) 
     let tempSorted180270x = BubbleDescSort(array: temp180270x) 
     let tempSorted270360x = BubbleAsceSort(array: temp270360x) 

     for item in tempSorted090x { 
      array.append(item) 
     } 
     for item in tempSorted90180x { 
      array.append(item) 
     } 
     for item in tempSorted180270x { 
      array.append(item) 
     } 
     for item in tempSorted270360x { 
      array.append(item) 
     } 

     let lbl = UILabel() 
     lbl.frame = CGRect.init(x: 0, y: 0, width: 30, height: 30) 
     lbl.backgroundColor = UIColor.black 
     lbl.layer.cornerRadius = 15 


     for i in 1...180 { 
      let xpos = Array(array[i-1].keys)[0] 
      let ypos = Array(array[i-1].values)[0] 

      let xpos1 = Array(array[i].keys)[0] 
      let ypos1 = Array(array[i].values)[0] 

      let path3 = UIBezierPath() 
      path3.move(to: CGPoint.init(x: xpos, y: ypos)) 
      path3.addLine(to:CGPoint.init(x: xpos1, y:ypos1)) 
      let shapeLayer3 = CAShapeLayer() 
      shapeLayer3.path = path3.cgPath 
      shapeLayer3.strokeColor = UIColor.red.cgColor 
      shapeLayer3.lineWidth = 5.0 
      self.view.layer.addSublayer(shapeLayer3) 


     } 
     lbl.center = CGPoint.init(x: Array(array[180].keys)[0], y: Array(array[180].values)[0]) 
     self.view.addSubview(lbl) 
    } 

    func BubbleDescSort(array : [CGFloat:CGFloat]) -> [[CGFloat:CGFloat]] { 
     var sortedArray = Array(array.keys) 
     var sortedvalueArray = Array(array.values) 
     var sortedAboveIndex = sortedArray.count-1 // Assume all values are not in order 
     repeat { 
      var lastSwapIndex = 0 

      for i in 1...sortedAboveIndex{ 
       if (sortedArray[i] as AnyObject) as! CGFloat > (sortedArray[i - 1] as AnyObject) as! CGFloat { 
        sortedArray.swapAt(i, i-1) 
        sortedvalueArray.swapAt(i, i-1) 
        lastSwapIndex = i 
       } 
      } 
      sortedAboveIndex = lastSwapIndex 

     } while (sortedAboveIndex != 0) 
     var index = 0 
     var arr = [[CGFloat:CGFloat]]() 
     for item in sortedArray { 
      var dic = [CGFloat:CGFloat]() 
      dic[item] = sortedvalueArray[index] 
      arr.append(dic) 
      index += 1 
     } 
     return arr 
    } 

    func BubbleAsceSort(array : [CGFloat:CGFloat]) -> [[CGFloat:CGFloat]] { 
     var sortedArray = Array(array.keys) 
     var sortedvalueArray = Array(array.values) 
     var sortedAboveIndex = sortedArray.count-1 // Assume all values are not in order 
     repeat { 
      var lastSwapIndex = 0 

      for i in 1...sortedAboveIndex{ 
       if (sortedArray[i - 1] as AnyObject) as! CGFloat > (sortedArray[i] as AnyObject) as! CGFloat { 
        sortedArray.swapAt(i, i-1) 
        sortedvalueArray.swapAt(i, i-1) 
        lastSwapIndex = i 
       } 
      } 
      sortedAboveIndex = lastSwapIndex 

     } while (sortedAboveIndex != 0) 
     var index = 0 
     var arr = [[CGFloat:CGFloat]]() 
     for item in sortedArray { 
      var dic = [CGFloat:CGFloat]() 
      dic[item] = sortedvalueArray[index] 
      arr.append(dic) 
      index += 1 
     } 
     return arr 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

In diesem Code, den Sie brauchen. in der oberen Grenze von for loop und Round lbl Mittelpunkt x und y pos. Hier ist nur 180 ersetzen, um Ihren Fortschritt Prozentsatz

+0

Warum 2 * Pi als Ende Winkel hängen von dem Fortschritt von Cashapelayer gemacht, die in roter Farbe ist – Techiee

+0

Progressvalue *. Pi, das ist Ihr zweiter Winkel. Hier ist 0 bis 2 * pi der volle Kreis. –

+0

Dieser Wert ist nicht korrekt, da er genauso wie die rote Formebene – Techiee

Verwandte Themen