2017-01-30 1 views
1

Ich arbeite in Swift 3.0 und habe UIBezierPath verwendet, um Kreise zu zeichnen. Mein Code ist unten. Egal, was ich ändere, die Ränder des Kreises sind immer noch abgeschnitten. Die Kreise sind in Bildansichten. Ich habe versucht, die Höhe/das Gewicht der Ansicht zu manipulieren, sowie es zu ändern "aspect fill" "aspect fit" "center" usw. Ein Tutorial habe ich mir auch gesagt, wenn ich "var multiplier: CG Float = 1.0 "bis 0.85 oder eine andere Nummer, wird der Ausschnitt weg sein. Ich habe das versucht und es hat nicht funktioniert. Wie kann ich das beheben?Kreise in Swift - kann nicht von Clipping loswerden

class Circle1: UIView { 
    var multiplier:CGFloat = 0.85 
    //this takes away the "clippinh" you might see in the view 

    var centerOfCirclesView: CGPoint{ 
     return CGPoint(x:bounds.midX, y:bounds.midY) 
    } 
    var halfOfViewsSize: CGFloat{ 
     return min(bounds.size.height, bounds.size.width)/2 
    } 

    var lineWidth:CGFloat = 1.0 

    //circle radius compute 

    var full = CGFloat(M_PI * 2) 
    var quarter = CGFloat(M_PI/2) 
    var half = CGFloat(M_PI) 
    var threeQuarters = CGFloat(3 * M_PI/2) 


    func drawCircleCenteredAt(_:CGPoint, withRadius radius:CGFloat) -> UIBezierPath{ 
     let circlePath = UIBezierPath(arcCenter: centerOfCirclesView, 
             radius: halfOfViewsSize, 
             startAngle: 00, 
             endAngle: full, 
             clockwise: false) 
     circlePath.lineWidth = lineWidth 

     return circlePath 
    } 

    override func draw(_ rect: CGRect) { 
     UIColor(hue: 0.7194, saturation: 0, brightness: 0.52, alpha: 1.0).set() 
     lineWidth = 15.0 
     drawCircleCenteredAt(centerOfCirclesView, withRadius: halfOfViewsSize).stroke() 
    } 

} 

class Circle2: UIView { 

    var multiplier:CGFloat = 0.85 
    //this takes away the "clippinh" you might see in the view 

    var centerOfCirclesView: CGPoint{ 
     return CGPoint(x:bounds.midX, y:bounds.midY) 
    } 
    var halfOfViewsSize: CGFloat{ 
     return min(bounds.size.height, bounds.size.width)/2 
    } 

    var lineWidth:CGFloat = 1.0 

    //circle radius compute 

    var full = CGFloat(M_PI * 2) 
    var quarter = CGFloat(M_PI/2) 
    var half = CGFloat(M_PI) 
    var threeQuarters = CGFloat(3 * M_PI/2) 


    func drawCircleCenteredAt(_:CGPoint, withRadius radius:CGFloat) -> UIBezierPath{ 
     let circlePath = UIBezierPath(arcCenter: centerOfCirclesView, 
             radius: halfOfViewsSize, 
             startAngle: 00, 
             endAngle: half, 
             clockwise: false) 
     circlePath.lineWidth = lineWidth 

     return circlePath 
    } 
} 
+0

Sie benötigen Radius zu vermindern, dass entweder durch Ihre 0,85 Multiplikator multipliziert oder um 0,5 * Linienbreite subtrahiert wird. – vacawama

+0

Sie sollten '.pi' anstelle von' M_PI' in Swift 3 –

Antwort

0

Sie benötigen radius, so dass Ihr Kreis zu reduzieren, ist nicht abgeschnitten. Zum Beispiel in Circle1 Pass in halfOfViewSize - 0.5 * lineWidth für die radius-drawCircleCenteredAt(_:withRadius:) und dann diesen Radius verwenden, wenn Sie die UIBezierPath erstellen:

func drawCircleCenteredAt(_:CGPoint, withRadius radius:CGFloat) -> UIBezierPath { 
    let circlePath = UIBezierPath(arcCenter: centerOfCirclesView, 
            radius: radius,    // Changed this to radius 
            startAngle: 0, 
            endAngle: full, 
            clockwise: false) 
    circlePath.lineWidth = lineWidth 

    return circlePath 
} 

override func draw(_ rect: CGRect) { 
    UIColor(hue: 0.7194, saturation: 0, brightness: 0.52, alpha: 1.0).set() 
    lineWidth = 15.0 
    drawCircleCenteredAt(centerOfCirclesView, withRadius: halfOfViewsSize - 0.5 * lineWidth).stroke() 
} 

Ihr multiplier ist keine Wirkung, weil Sie nicht es überall verwenden. Sie können auch Ihre radius reduzieren, indem Sie halfOfViewSize * multiplier verwenden, wenn Sie Ihre UIBezierPath erstellen.


Hier ist der modifizierte Code, der die Einstellung der Farben und Linienbreiten von der draw(_:) Routine entfernt.

class Circle1: UIView { 
    var centerOfCirclesView: CGPoint{ 
     return CGPoint(x:bounds.midX, y:bounds.midY) 
    } 

    var halfOfViewsSize: CGFloat{ 
     return min(bounds.size.height, bounds.size.width)/2 
    } 

    var lineWidth:CGFloat = 1.0 

    var color = UIColor(hue: 0.7194, saturation: 0, brightness: 0.52, alpha: 1.0) 
    //circle radius compute 

    var full = CGFloat.pi * 2 
    var quarter = CGFloat.pi/2 
    var half = CGFloat.pi 
    var threeQuarters = 3 * CGFloat.pi/2 

    func drawCircleCenteredAt(_:CGPoint, withRadius radius:CGFloat) -> UIBezierPath{ 
     let circlePath = UIBezierPath(arcCenter: centerOfCirclesView, 
             radius: radius,      // Changed this to radius 
             startAngle: 0, 
             endAngle: full, 
             clockwise: false) 
     circlePath.lineWidth = lineWidth 

     return circlePath 
    } 

    override func draw(_ rect: CGRect) { 
     color.set() 
     drawCircleCenteredAt(centerOfCirclesView, withRadius: halfOfViewsSize - 0.5 * 15.0).stroke() 
    } 
} 

Hier ist eine Demo, die in einem Swift Spielplatz läuft:

Demo of overlapping circles in Swift Playground

+0

verwenden Alles sieht gut aus! Jetzt ist der Kreis mit der kleineren Breite jedoch nicht innerhalb des Kreises mit der größeren Breite zentriert. Weißt du, wie das zu korrigieren ist? – CodingK8

+0

Ich habe festgestellt, dass du wahrscheinlich nicht weißt, was das bedeutet. Der Kreis mit der kleineren Breite liegt auf dem Kreis mit der größeren Breite. Wenn es abgeschnitten wurde, wurde es zentriert, und jetzt ist es nicht. die äußere Grenze liegt an der äußeren Grenze des anderen Kreises. Irgendeine Idee, wie man es wieder zentriert? Vielen Dank! – CodingK8

+0

Sie brauchen nur beide Kreise, um den gleichen Radius zu haben. Verwenden Sie also die 'lineWidth' aus dem dickeren Kreis bei der Berechnung des' Radius' für beide Kreise. – vacawama