我正在尝试创建一个 UIView,它显示一个半透明的圆圈,其边界内有一个不透明的边框。我希望能够以两种方式更改边界 - 在-[UIView animateWithDuration:animations:]
块内和在每秒触发几次的捏手势识别器动作中。我已经根据 SO 其他地方的答案尝试了三种方法,但没有一种是合适的。
设置视图层的圆角半径可以
layoutSubviews
提供平滑的平移,但视图在动画期间不会保持圆形;似乎cornerRadius 是不可动画的。绘制圆圈
drawRect:
会产生一致的圆形视图,但如果圆圈变得太大,则在捏合手势中调整大小会变得不稳定,因为设备花费了太多时间来重绘圆圈。添加一个 CAShapeLayer 并将其 path 属性设置为
layoutSublayersOfLayer
,它不会在 UIView 动画中进行动画处理,因为 path 不是隐式可动画的。
有没有办法让我创建一个始终圆形且可平滑调整大小的视图?我可以使用其他类型的层来利用硬件加速吗?
更新
当我说我想更改-[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]
.