2017-09-04 2 views
0

Ich habe eine Ansicht, in der ich einen Kreis mit UIBezierPath bezierPathWithArcCenter zeichnen möchte. Meine Ansicht des initWithFrame ist wie folgt:UIBezierPath bezierPathWithArcCenter nicht richtig zentriert

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

erwartete ich, dass ein schwarzer Kreis meiner Ansicht zentriert erzeugen würde. Die tatsächliche Ausgabe sieht jedoch so aus:
Actual output

Was mache ich falsch?

EDIT Der seltsamste Teil ist, dass es richtig nach einem frischen gezogen ist die App-Installation - alle aufeinander folgende Starts führen es angebracht, wie in dem Bild gezeichnet wird. Warum?

+0

Versuchen Sie, diesen Code in der drawRect-Methode zu verwenden –

+0

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

+0

@Larme gut, es ist eine Unterschicht, so muss es '(0, 0)' Herkunft haben. Oder liege ich falsch? –

Antwort

0

Der Grund dafür scheint ein Fehler in iOS zu sein. Die CAShapeLayer hat seine Grenzen richtig eingestellt

self.circleLayer.bounds = self.bounds; 

Auf sie die Kontrolle, die Herkunft und die Größe der Schicht ist in Ordnung, aber erst nach dem ersten Start der App nach installieren. Jeder nachfolgende Start der App führt dazu, dass seine Größe (0, 0) ist. Wenn Sie die App entfernen und erneut installieren, wird der Kreis ordnungsgemäß gezeichnet. einmal.

Ich reparierte es, indem ich den Rahmen der Schicht wieder weiter die Straße setze.