2017-08-26 2 views
0

Je veux faire ce UIView avec UIBezierPath:Faire Sunburst à Swift avec un UIBezierPath

enter image description here

Avec la capacité en option pour faire tourner (bien que je puisse faire cela sur mon propre si je sais comment dessiner que sunburst (qui est la façon dont j'appelle la vue))

ici la réponse est donnée dans l'objectif C: https://stackoverflow.com/a/14991292/7715250

J'ai essayé de le convertir en Swift avec ce code (copier-coller dans Playground travail):

import UIKit 

class SunBurst: UIView{ 
    override func draw(_ rect: CGRect) { 
     let radius: CGFloat = rect.size.width/2.0 
     UIColor.red.setFill() 
     UIColor.blue.setStroke() 
     let bezierPath = UIBezierPath() 
     let centerPoint = CGPoint(x: rect.origin.x + radius, y: rect.origin.y + radius) 
     var thisPoint = CGPoint(x: centerPoint.x + radius, y: centerPoint.y) 
     bezierPath.move(to: centerPoint) 
     var thisAngle: CGFloat = 0.0 
     let sliceDegrees: CGFloat = 360.0/20/2.0 
     let half: CGFloat = 180 
     let floatRadius = Float(radius) 

     for _ in 0..<20 { 
      let x = CGFloat((floatRadius * cosf(Float(.pi * thisAngle + sliceDegrees/half)))) + centerPoint.x 
      let y = CGFloat((floatRadius * sinf(Float(.pi * thisAngle + sliceDegrees/half)))) + centerPoint.y 
      thisPoint = CGPoint(x: x, y: y) 
      bezierPath.addLine(to: thisPoint) 
      thisAngle += sliceDegrees 
      let x2 = CGFloat((floatRadius * cosf(Float((.pi * thisAngle + sliceDegrees)/half)))) + centerPoint.x 
      let y2 = CGFloat((floatRadius * sinf(Float((.pi * thisAngle + sliceDegrees)/half)))) + centerPoint.y 
      thisPoint = CGPoint(x: x2, y: y2) 
      bezierPath.addLine(to: thisPoint) 
      bezierPath.addLine(to: centerPoint) 
      thisAngle += sliceDegrees 
     } 
     bezierPath.close() 
     bezierPath.lineWidth = 1 
     bezierPath.fill() 
     bezierPath.stroke() 
    } 
} 


let custom = SunBurst(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
custom.backgroundColor = .clear 

Avec ce résultat:

enter image description here

Je pense que je suis absent 1 ligne de code, car il semble presque correct, mais ce que suis-je manque? Je ne suis sûrement pas un expert en Objective C et j'ai utilisé https://objectivec2swift.com/#/home/converter/ pour convertir le code sur le lien avec la réponse. En outre, il semble presque correct, il devrait fonctionner en mode paysage. Quand je baisse la hauteur et conserve la même largeur, le sunburst échoue mal à dessiner. Comment cela peut-il aussi fonctionner dans le paysage?

Merci pour toute aide pour la bonne UIView. Je pense que ce serait bien pour une vue bonus dans un jeu.

Répondre

5

Le problème est un manque de priorité d'opérateur appropriée dans votre degré de calcul radian.

Remplacer chaque utilisation (quatre lignes) de:

.pi * thisAngle + sliceDegrees/half 

avec:

.pi * (thisAngle + sliceDegrees)/half 

Mieux, ajoutez une fonction degreesToRadians de sorte que vous pouvez simplement passer thisAngle + sliceDegrees à et éviter le problème tous ensemble .