2017-01-30 4 views
1

私はSwift 3.0で作業していて、UIBezierPathを使ってサークルを描いています。私のコードは以下の通りです。私が何を変えても、サークルのエッジはクリッピングされます。円はイメージビューにあります。私はビューの高さ/重さを操作しようとしましたが、それを "アスペクト・フィル" "アスペクト・フィッティング" "センター"などに変更しました。私が見たチュートリアルでは、 "var multiplier:CG Float = 1.0 0.85または別の数値にすると、クリッピングはなくなります。私はこれを試して、それは動作しませんでした。これをどうすれば解決できますか?スウィフトのサークル - クリッピングを取り除くことができません

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

あなたの0.85乗算器または0.5 *線幅を減算することにより乗算することにより、どちらかあなたの半径を小さくする必要があります。 – vacawama

+0

Swift 3では 'M_PI'の代わりに' .pi'を使うべきです –

答えて

0

サークルがクリップされないように、radiusを減らす必要があります。例えば、Circle1に、あなたはUIBezierPathを作成するときにその半径を使用し、その後drawCircleCenteredAt(_:withRadius:)radiusためhalfOfViewSize - 0.5 * lineWidthに渡し、:

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() 
} 

あなたはどこにでもそれを使用していないので、あなたのmultiplierは何の効果も持っていません。 UIBezierPathを作成するときにhalfOfViewSize * multiplierを使用してradiusを減らすこともできます。ここ


draw(_:)ルーチンから色や線幅の設定が削除され変更されたコードです。ここで

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() 
    } 
} 

はスウィフト遊び場で実行されているデモです:

Demo of overlapping circles in Swift Playground

+0

すごくいいですね!ただし、幅の狭い円は、幅の広い円の中心に配置されません。これを修正する方法を知っていますか? – CodingK8

+0

私はあなたがおそらくそれが意味することを理解していないことに気付きました。小さな幅を持つ円は、より大きな幅を持つ円の上に横たわっています。それが切り取られたとき、それは中心に置かれ、今はそうではありません。外側の境界線は、他方の円の外側境界線と一致する。どのようにそれを再び中心化するための任意のアイデア?ありがとう! – CodingK8

+0

同じ半径を持つためには、両方の円が必要です。したがって、両方の円の 'radius'の計算では太い円の' lineWidth'を使います。 – vacawama

関連する問題