Как создать круговой UIView с плавным изменением размера?

Я пытаюсь создать UIView, который показывает полупрозрачный круг с непрозрачной рамкой внутри его границ. Я хочу иметь возможность изменять границы двумя способами - внутри блока -[UIView animateWithDuration:animations:]и в действии распознавания жестов, которое срабатывает несколько раз в секунду. Я пробовал три подхода, основанные на ответах в других местах на SO, и ни один из них не подходит.

  1. Установка углового радиуса слоя представления в layoutSubviewsобеспечивает плавное перемещение, но представление не остается круглым во время анимации; кажется, что angleRadius не анимируется.

  2. Рисование круга в drawRect:дает постоянный круговой вид, но если круг становится слишком большим, изменение размера жестом сжатия становится прерывистым, потому что устройство тратит слишком много времени на перерисовку круга.

  3. Добавление CAShapeLayer и установка его свойства path в layoutSublayersOfLayer, которое не анимируется внутри анимации UIView, поскольку path не является неявно анимируемым.

Есть ли способ создать постоянно круглое представление с плавным изменением размера? Есть ли какой-то другой тип слоя, который я мог бы использовать, чтобы воспользоваться преимуществами аппаратного ускорения?

ОБНОВЛЕНИЕ

Комментатор попросил меня пояснить, что я имею в виду, когда говорю, что хочу изменить границы внутри блока -[UIView animateWithDuration:animations:]. В моем коде у меня есть представление, которое содержит мое представление круга. Представление в виде круга (версия, в которой используется angleRadius) переопределяет -[setBounds:]для установки радиуса угла:

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

Границы представления в виде круга устанавливаются в -[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;
}

Вид иногда изменяется в анимации, например так:

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

но во время этих анимаций, если я рисую круг, используя слой с угловым радиусом, он принимает забавные формы. Я не могу передать продолжительность анимации в layoutSubviews, поэтому мне нужно добавить правильную анимацию в -[setBounds].

10
задан Simon 5 June 2012 в 10:29
поделиться