Я пытаюсь создать UIView, который показывает полупрозрачный круг с непрозрачной рамкой внутри его границ. Я хочу иметь возможность изменять границы двумя способами - внутри блока -[UIView animateWithDuration:animations:]
и в действии распознавания жестов, которое срабатывает несколько раз в секунду. Я пробовал три подхода, основанные на ответах в других местах на SO, и ни один из них не подходит.
Установка углового радиуса слоя представления в layoutSubviews
обеспечивает плавное перемещение, но представление не остается круглым во время анимации; кажется, что angleRadius не анимируется.
Рисование круга в drawRect:
дает постоянный круговой вид, но если круг становится слишком большим, изменение размера жестом сжатия становится прерывистым, потому что устройство тратит слишком много времени на перерисовку круга.
Добавление 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]
.