2017-09-04 23 views
0

UIBezierPath bezierPathWithArcCenterで円を描きたいと思っています。次のように私の見解のinitWithFrameは次のとおりです。UIBezierPath bezierPathWithArcCenterが正しく中央に配置されていません

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self == nil) { 
     return nil; 
    } 

    self.circleLayer = [CAShapeLayer layer]; 
    self.circleLayer.fillColor = UIColor.clearColor.CGColor; 
    self.circleLayer.strokeColor = UIColor.blackColor.CGColor; 
    self.circleLayer.lineWidth = 4; 
    self.circleLayer.bounds = self.bounds; 


    self.startAngle = 0.0; 
    self.endAngle = M_PI * 2; 
    CGPoint center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); 
    CGFloat radius = self.frame.size.height * 0.45; 
    self.circleLayer.path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:self.startAngle endAngle:self.endAngle clockwise:YES].CGPath; 

    [self.layer addSublayer:self.circleLayer]; 

    self.backgroundColor = UIColor.greenColor; 

    return self; 
} 

私はそれが私の見解を中心に黒丸を生み出すと期待されます。ただし、実際の出力は次のようになります。
Actual output

私は間違っていますか?任意の連続した起動は、それが添付された画像のように描かれているにつながる -

EDIT 奇妙な部分は、それがアプリの新規インストール後に正しく描画だということです。どうして?

+0

このコードをdrawRectメソッドで使用してください。 –

+0

'self.circleLayer.frame = self.bounds;'? – Larme

+0

@Larmeでも、それはサブレイヤなので、 '(0、0)'の起源が必要です。または私は間違っていますか? –

答えて

0

この理由は、iOSのバグだと思われます。 CAShapeLayerが検査時に適切

self.circleLayer.bounds = self.bounds; 

設定された境界を有し、層の起源と大きさが微細であるが、唯一をインストールした後、アプリケーションの最初の起動後。その後のアプリの起動により、そのサイズは(0, 0)になります。アプリを削除してもう一度インストールすると、円が正しく描画されます

レイヤのフレームを道路の下にもう一度設定して固定しました。

関連する問題