Jak utworzyć płynnie zmieniający się okrągły UIView?

Próbuję utworzyć widok UIView, który pokazuje półprzezroczysty okrąg z nieprzezroczystą krawędzią wewnątrz jego granic. Chcę móc zmieniać granice na dwa sposoby - wewnątrz a-[UIView animateWithDuration:animations:] blok i w akcji rozpoznawania gestu szczypania, która strzela kilka razy na sekundę. Wypróbowałem trzy podejścia oparte na odpowiedziach w innym miejscu na SO i żadne nie są odpowiednie.

Ustawianie promienia narożnika warstwy widoku wlayoutSubviews daje płynne tłumaczenia, ale widok nie pozostaje okrągły podczas animacji; wygląda na to, że cornerRadius nie jest animowany.

Rysowanie okręgudrawRect: daje spójny widok kołowy, ale jeśli okrąg staje się zbyt duży, zmiana rozmiaru w geście szczypania staje się nierówna, ponieważ urządzenie spędza zbyt wiele czasu na przerysowywaniu okręgu.

Dodanie CAShapeLayer i ustawienie jego właściwości ścieżki wlayoutSublayersOfLayer, który nie animuje wewnątrz animacji UIView, ponieważ ścieżka nie jest niejawnie animowana.

Czy istnieje sposób, aby stworzyć widok, który byłby stale okrągły i płynnie zmieniał rozmiar? Czy jest jakiś inny rodzaj warstwy, którego mogę użyć, aby skorzystać z przyspieszenia sprzętowego?

AKTUALIZACJA

Komentator poprosił mnie o rozwinięcie tego, co mam na myśli, mówiąc, że chcę zmienić granice wewnątrz-[UIView animateWithDuration:animations:] blok. W moim kodzie mam widok zawierający mój widok koła. Widok okręgu (wersja, która używa CornerRadius) zastępuje-[setBounds:] w celu ustawienia promienia narożnika:

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

Granice widoku okręgu są ustawione-[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;
}

Widok jest czasem zmieniany w animacjach, w ten sposób:

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

ale podczas tych animacji, jeśli narysuję widok koła za pomocą warstwy z narożnikiem Promień, to będzie to zabawne kształty. Nie mogę przekazać czasu trwania animacji do layoutSubviews, więc muszę dodać odpowiednią animację wewnątrz-[setBounds].

questionAnswers(4)

yourAnswerToTheQuestion