Wie erstelle ich ein nahtlos anpassbares kreisförmiges UIView?

Ich versuche, eine UIView zu erstellen, die einen halbtransparenten Kreis mit einem undurchsichtigen Rand innerhalb seiner Grenzen zeigt. Ich möchte in der Lage sein, die Grenzen auf zwei Arten zu ändern - innerhalb eines-[UIView animateWithDuration:animations:] Block und in einer Prise Gestenerkennungsaktion, die mehrmals pro Sekunde ausgelöst wird. Ich habe drei Ansätze ausprobiert, die auf Antworten an anderer Stelle auf SO basieren, und keiner ist geeignet.

Festlegen des Eckenradius der Ebene in der AnsichtlayoutSubviews Ermöglicht reibungslose Übersetzungen, aber die Ansicht bleibt bei Animationen nicht kreisförmig. es scheint, dass cornerradius nicht animierbar ist.

Zeichnen des KreisesdrawRect: Gibt eine konsistente kreisförmige Ansicht wieder. Wenn der Kreis jedoch zu groß wird, wird die Größenänderung in der Kneifgeste abgehackt, da das Gerät zu viel Zeit für das erneute Zeichnen des Kreises benötigt.

Hinzufügen eines CAShapeLayer und Festlegen seiner Pfadeigenschaft inlayoutSublayersOfLayer, das in UIView-Animationen nicht animiert, da der Pfad nicht implizit animierbar ist.

Gibt es eine Möglichkeit für mich, eine Ansicht zu erstellen, die durchgehend kreisförmig ist und deren Größe sich problemlos ändern lässt? Gibt es eine andere Art von Ebene, die ich verwenden könnte, um die Hardwarebeschleunigung zu nutzen?

AKTUALISIEREN

Ein Kommentator hat mich gebeten, das zu erläutern, was ich meine, wenn ich sage, dass ich die Grenzen innerhalb von a ändern möchte-[UIView animateWithDuration:animations:] Block. In meinem Code habe ich eine Ansicht, die meine Kreisansicht enthält. Die Kreisansicht (die Version, die cornerRadius verwendet) überschreibt-[setBounds:] um den eckenradius einzustellen:

-(void)setBounds:(CGRect)bounds
{
    self.layer.cornerRadius = fminf(bounds.size.width, bounds.size.height) / 2.0;
    [super setBounds:bounds];
}

Die Grenzen der Kreisansicht werden festgelegt-[layoutSubviews]:

-(void)layoutSubviews
{
    // some other layout is performed and circleRadius and circleCenter are
    // calculated based on the properties and current size of the view.

    self.circleView.bounds = CGRectMake(0, 0, circleRadius*2, circleRadius*2);
    self.circleView.center = circleCenter;
}

Die Größe der Ansicht wird manchmal in Animationen geändert.

[UIView animateWithDuration:0.33 animations:^(void) {
    myView.frame = CGRectMake(x, y, w, h);
    [myView setNeedsLayout];
    [myView layoutIfNeeded];
}];

Wenn ich in diesen Animationen die Kreisansicht mithilfe einer Ebene mit einem cornerRadius zeichne, werden lustige Formen erstellt. Ich kann die Animationsdauer nicht an layoutSubviews übergeben, daher muss die richtige Animation hinzugefügt werden-[setBounds].

Antworten auf die Frage(4)

Ihre Antwort auf die Frage