相关疑难解决方法(0)

使用CABasicAnimation不止一次旋转UIImageView

我正在使用CABasicAnimation UIImageView顺时针旋转90度,但我需要让它在最初90度旋转后从其位置再旋转90度.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.duration = 10;
animation.additive = YES;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.fromValue = [NSNumber numberWithFloat:DEGREES_TO_RADIANS(0)];
animation.toValue = [NSNumber numberWithFloat:DEGREES_TO_RADIANS(90)];
[_myview.layer addAnimation:animation forKey:@"90rotation"];
Run Code Online (Sandbox Code Playgroud)

使用上面的代码最初工作,图像保持90度角.如果我再次调用它使其再旋转90度,则动画开始时跳回0并旋转90度,而不是90度到180度.

我的印象是,animation.additive = YES;会导致进一步的动画使用当前状态作为起点.

有任何想法吗?

core-animation ios

13
推荐指数
2
解决办法
2万
查看次数

圆形(圆形)UIView使用AutoLayout调整大小...如何在调整大小动画期间为cornerRadius设置动画?

我有一个可以调用的子类UIView CircleView.CircleView会自动将圆角半径设置为其宽度的一半,以使其成为圆形.

问题是当"CircleView"通过AutoLayout约束调整大小时......例如在设备轮换上 ......由于"cornerRadius"属性必须赶上,并且操作系统仅发送,因此在调整大小之前它会严重失真单个"边界"更改为视图的框架.

我想知道是否有人有一个好的,明确的策略来实现"CircleView"的方式在这种情况下不会扭曲,但仍然会将其内容掩盖为圆形并允许在所述UIView周围存在边框.

uiview ios

13
推荐指数
1
解决办法
5334
查看次数

如何创建平滑可调整大小的圆形UIView?

我正在尝试创建一个UIView,它显示一个半透明的圆圈,其边界内有一个不透明的边框.我希望能够以两种方式改变界限 - 在一个-[UIView animateWithDuration:animations:]块内和一个捏动手势识别器动作,每秒触发几次.我已经尝试了三种基于SO其他地方的答案的方法,但没有一种方法是合适的.

  1. 设置视图图层的角半径可以layoutSubviews提供平滑的平移,但在动画期间视图不会保持圆形; 似乎cornerRadius不可动画.

  2. 绘制圆圈可以drawRect:得到一致的圆形视图,但如果圆圈太大,那么在捏合手势中调整大小会变得不稳定,因为设备花费了太多时间重绘圆圈.

  3. 添加CAShapeLayer并设置其路径属性layoutSublayersOfLayer,该属性不会在UIView动画内部制作动画,因为路径不是隐式可动画的.

有没有办法让我创建一个始终循环且平滑可调整大小的视图?我可以使用其他类型的层来利用硬件加速吗?

UPDATE

当我说我想改变一个-[UIView animateWithDuration:animations:]区块内的界限时,一位评论者要求我扩展我的意思.在我的代码中,我有一个包含我的圆视图的视图.圆形视图(使用cornerRadius的版本)覆盖-[setBounds:]以设置角半径:

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

圆视图的边界设置为-[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;
}
Run Code Online (Sandbox Code Playgroud)

视图有时会在动画中调整大小,如下所示:

[UIView animateWithDuration:0.33 animations:^(void) {
    myView.frame = …
Run Code Online (Sandbox Code Playgroud)

core-graphics uiview uiviewanimation

10
推荐指数
2
解决办法
8034
查看次数