【发布时间】:2012-05-19 21:42:05
【问题描述】:
我正在尝试创建一个 UIView,它显示一个半透明的圆圈,其边界内有一个不透明的边框。我希望能够以两种方式更改边界 - 在 -[UIView animateWithDuration:animations:] 块内和在每秒触发几次的捏手势识别器操作中。我已经根据 SO 上其他地方的答案尝试了三种方法,但没有一种是合适的。
在
layoutSubviews中设置视图层的圆角半径可以提供平滑的平移,但在动画期间视图不会保持圆形;似乎cornerRadius 是不可动画的。-
在
drawRect:中绘制圆圈会提供始终如一的圆形视图,但如果圆圈变得太大,则在捏合手势中调整大小会变得不稳定,因为设备花费太多时间重绘圆圈。 添加一个 CAShapeLayer 并在
layoutSublayersOfLayer中设置它的路径属性,它不会在 UIView 动画中进行动画处理,因为路径不是隐式可动画的。
有没有办法让我创建一个始终圆形且可平滑调整大小的视图?我可以使用其他类型的层来利用硬件加速吗?
更新
当我说我想更改 -[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] 中添加正确的动画。
【问题讨论】:
-
1 应该保持圆形,只要您将圆角半径和大小一起设置动画(可能在 CAAnimationGroup 中)。在任何时候,cornerRadius 都需要是宽度的一半,宽度需要与高度相同。
-
我需要它在 animateWithDuration:animations: 中工作 - 可以与 CAAnimationGroup 一起使用吗?
-
animateWithDuration:分组本身,因此不需要显式动画组。只要圆角半径保持在矩形边的一半,就可以将圆角半径与大小一起设置动画。
-
嗯......好吧,它没有。发生的情况是新的圆角半径立即显示,然后动画从那里开始。
-
另请参阅this question,其中用户遇到与cornerRadius 相同的问题。
标签: uiview core-graphics uiviewanimation