Como faço para criar um UIView circular redimensionável sem problemas?

Eu estou tentando criar um UIView que mostra um círculo semitransparente com uma borda opaca dentro de seus limites. Eu quero ser capaz de mudar os limites de duas maneiras - dentro de um-[UIView animateWithDuration:animations:] bloquear e em uma ação de reconhecimento de gesto de aperto que dispara várias vezes por segundo. Eu tentei três abordagens baseadas em respostas em outro lugar no SO, e nenhuma é adequada.

Definir o raio do canto da camada da vista nolayoutSubviews dá traduções suaves, mas a visão não fica circular durante as animações; parece que o cornerRadius não é animador.

Desenhar o círculo emdrawRect: dá uma visão circular consistente, mas se o círculo ficar muito grande, o redimensionamento no gesto de pinça fica instável porque o dispositivo está gastando muito tempo redesenhando o círculo.

Adicionando um CAShapeLayer e definindo sua propriedade de caminho emlayoutSublayersOfLayer, que não anima dentro das animações do UIView, pois o caminho não é implicitamente animavel.

Existe uma maneira de eu criar uma visão que seja consistentemente circular e suavemente redimensionável? Existe algum outro tipo de camada que eu poderia usar para aproveitar a aceleração de hardware?

ATUALIZAR

Um comentarista me pediu para expandir o que quero dizer quando digo que quero mudar os limites dentro de um-[UIView animateWithDuration:animations:] quadra. No meu código, tenho uma visão que contém minha visão de círculo. A vista de círculo (a versão que usa o cornerRadius) substitui-[setBounds:] a fim de definir o raio do canto:

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

Os limites da visão de círculo são definidos em-[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;
}

Às vezes, a visualização é redimensionada em animações, assim:

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

mas durante essas animações, se eu desenhar a vista do círculo usando uma camada com um cornerRadius, elas são formas engraçadas. Não consigo passar a duração da animação para o layoutSubviews, por isso preciso de adicionar a animação correta-[setBounds].

questionAnswers(4)

yourAnswerToTheQuestion