2016-05-31 6 views
0

CAShapeLayerの範囲を設定する必要がありますか?CAShapeLayer - bounds

シェイプレイヤーを作成し、UIBezierPathでパスを割り当てると、シェイプはビューのサイズの単純な円になります。

レイヤーにpositionまたはboundsを設定していません。間違っていますか?

class View: UIView { 
... 

var backgroundLayer: CAShapeLayer! 

func setup() { 
    // call from init 
    backgroundLayer = CAShapeLayer() 
    backgroundLayer.strokeColor = UIColor.redColor() 
    backgroundLayer.lineWidth = 3 
    backgroundLayer.fillColor = UIColor.clearColor().CGColor 
    layer.addSublayer(backgroundLayer) 
    ... 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    backgroundLayer?.path = circlePath(100) 
    ... 
} 

func circlePath(progress: Int) -> CGPath { 
    let path = UIBezierPath() 
    let inverseProgress = 1 - CGFloat(progress)/100 
    let endAngleOffset = CGFloat(2 * M_PI) * inverseProgress 
    path.addArcWithCenter(localCenter, radius: radius, startAngle: CGFloat(-M_PI), endAngle: CGFloat(M_PI) - endAngleOffset, clockwise: true) 
    return path.CGPath 
} 

... 
} 

答えて

1

これまで見てきたように、レイヤーは境界線を設定しなくてもうまく表示されます。したがって、レイアウトを設定したり、変換を行ったりするときに、境界を設定していない(またはパスの境界ボックスとは異なる境界を持つ)ことが混乱することがあります。

レイアウト、配置、および変換に関しては、考慮すべきいくつかの異なる座標があります。

  1. 層がそれに対して位置決めされるパスは、形状層の座標系
  2. に対して位置決めされ、親の座標系
  3. のパス内の各点は、原点(0,0)に対するものですパス。

形状レイヤーはその中心に対して変形され、形状レイヤーの位置も境界の中心にあります。これは、形状レイヤが境界(0×0)サイズを持たない場合、パスの中心とは対照的に、パス(0,0)の原点の周りに任意の変換(例えば回転)が起こることを意味する。また、シェイプレイヤの位置を設定するときに、パスの中心とは対照的に、パスの原点を概念的に配置することも意味します。ただし、パスの起点がパスの境界ボックスの中心にある場合(たとえば(0,0)を中心とする円)、これは実際問題ではありません。

したがって、境界を設定する必要はありませんが、パスに応じて、位置や変換が設定されたときに明確になることがあります。

+0

クリスタルクリア。 –