Как мне создать круговой UIView с плавным изменением размера?
Я пытаюсь создать UIView, который показывает полупрозрачный круг с непрозрачной границей внутри его границ. Я хочу быть в состоянии изменить границы двумя способами - внутри-[UIView animateWithDuration:animations:]
блокировать и с помощью действия распознавателя жеста ущипнуть, которое срабатывает несколько раз в секунду. Я пробовал три подхода, основанные на ответах в других местах, посвященных SO, и ни один из них не подходит.
Setting the corner radius of the view's layer in layoutSubviews
gives smooth translations, but the view doesn't stay circular during animations; it seems that cornerRadius isn't animatable.
Drawing the circle in drawRect:
gives a consistently circular view, but if the circle gets too big then resizing in the pinch gesture gets choppy because the device is spending too much time redrawing the circle.
Adding a CAShapeLayer and setting its path property in layoutSublayersOfLayer
, which doesn't animate inside UIView animations since path isn't implicitly animatable.
Есть ли способ для меня, чтобы создать представление, которое является последовательно круглым и плавно изменяемого размера? Есть ли какой-нибудь другой тип слоя, который я мог бы использовать, чтобы воспользоваться аппаратным ускорением?
ОБНОВИТЬ
Комментатор попросил меня уточнить, что я имею в виду, когда говорю, что хочу изменить границы внутри-[UIView animateWithDuration:animations:]
блок. В моем коде у меня есть представление, которое содержит мое представление круга. Представление круга (версия, которая использует cornerRadius) переопределяет-[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];
}];
но во время этих анимаций, если я рисую круговое представление, используя слой с cornerRadius, получаются забавные формы. Я не могу передать продолжительность анимации в layoutSubviews, поэтому мне нужно добавить правильную анимацию в-[setBounds]
.