我正在尝试旋转 UIImageView
360度,并在线查看了几个教程 . 如果没有 UIView
停止或跳到新位置,我可以得不到任何一个工作 .
- 我怎样才能做到这一点?
我尝试过的最新事情是:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
但是如果我使用2 * pi,它根本不会移动(因为它是相同的位置) . 如果我尝试做pi(180度),它可以工作,但如果我再次调用该方法,它会向后旋转 .
EDIT :
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
也不起作用 . 它会转到 180
度,暂停一瞬间,然后重新开始重新调整到_420775度 .
26 回答
创建动画
将它添加到这样的视图中
这个答案有何不同?如果大多数函数返回对象而不是仅仅操作某些对象,那么您将获得更清晰的代码 .
斯威夫特3:
Nate的上述答案非常适合停止和开始动画并提供更好的控制 . 我很感兴趣为什么你的工作没有用,他的确如此 . 我想在这里分享我的发现和一个更简单的代码版本,它可以连续动画UIView而不会拖延 .
这是我用的代码,
我使用'CGAffineTransformRotate'而不是'CGAffineTransformMakeRotation',因为前者返回在动画进行时保存的结果 . 这将防止在动画期间跳转或重置视图 .
另一件事是不使用'UIViewAnimationOptionRepeat',因为在动画开始重复之前,它会重置变换,使视图跳回到原始位置 . 您可以递归而不是重复,以便永远不会将变换重置为原始值,因为动画块几乎永远不会结束 .
最后一点是,你必须以90度(M_PI / 2)而不是360度或180度(2 * M_PI或M_PI)的步长变换视图 . 因为变换是正弦和余弦值的矩阵乘法 .
因此,假如你使用180度变换,180的余弦产生-1,使得视图每次都在相反的方向变换(如果你将变换的弧度值改为M_PI,注意 - Nate的答案也会有这个问题) . 360度转换只是要求视图保持原样,因此您根本看不到任何旋转 .
我从已检查的解决方案中对Swift Extension的贡献:
Swift 4.0
Deprecated :
使用UIView可以通过以下方式执行360度动画 .
使用 CABasicAnimation
这是UIView的扩展函数,用于处理启动和停止旋转操作:
现在使用, UIView.animation 封闭:
Swift 4.0
对于xamarin ios:
David Rysanek的精彩回答更新至 Swift 4 :
@ ram的answer真的很有帮助 . 这是答案的Swift版本 .
这对我有用:
一个Swift3版本:
并记得在
viewWillAppear
中调用startRotate
而不是viewDidLoad
.如果您想要做的就是无休止地旋转图像,这非常有效,并且非常简单:
根据我的经验,这可以完美地工作,但是要确保你的图像能够在没有任何偏移的情况下围绕其中心旋转,或者图像动画一旦进入PI就会“跳跃” .
要更改旋转方向,请更改
angle
(angle *= -1
)的符号 .Update @AlexPretzlav的评论让我重新审视了这一点,我意识到当我写这个时,我正在旋转的图像沿着垂直轴和水平轴镜像,这意味着图像确实只旋转90度然后重置,尽管看起来像它一直在继续旋转 .
因此,如果你的图像像我的图像一样,这将很有效,但是,如果图像不对称,你会注意到90度后“快照”回到原始方向 .
要旋转非对称图像,最好使用接受的答案 .
其中一个不太优雅的解决方案,如下所示,将真正旋转图像,但重新启动动画时可能会出现明显的断断续续:
正如@ richard-j-ross-iii建议的那样,您也可以使用块来执行此操作,但是由于块正在捕获自身,因此您将收到保留循环警告:
使用四分之一转,并逐步增加转弯 .
Swift :
如果有人想要nates的解决方案但是很快,那么这是一个粗略的快速翻译:
这就是我如何向正确方向旋转360度 .
找到了一个方法(我修改了一下),对我来说非常有效:iphone UIImageView rotation
Swift 4 ,
Ref
我开发了一个闪亮的动画框架,可以为你节省时间!使用它可以很容易地创建这个动画:
要停止此动画,只需将
nil
设置为endlessRotater
即可 .如果您有兴趣,请看看:https://github.com/hip4yes/Animatics
我认为你应该更好地添加
UIVIew
类别:实施UIView(旋转)
不使用这种方法:)
这是我作为UIView扩展的快速解决方案 . 它可以被视为在任何UIImageView上模拟UIActivityIndicator行为 .
在Swift中,您可以使用以下代码进行无限循环:
斯威夫特4
斯威夫特3
停止就像:
我在repository找到了很好的代码,
这是我的代码我根据我对速度的需要做了一些小改动:)
UIImageView+Rotate.h
UIImageView+Rotate.m
感谢Richard J. Ross III的想法,但我发现他的代码并不是我所需要的 . 我相信
options
的默认值是给你UIViewAnimationOptionCurveEaseInOut
,这在连续动画中看起来不对 . 此外,我添加了一个检查,以便我可以在需要时(或者 infinite ,但是 indefinite 持续时间)在偶数四分之一圈停止我的动画,并使加速度在前90度内上升,并在最后90度内减速(在要求停止后):更新
我添加了处理再次开始旋转的请求的能力(
startSpin
),而之前的旋转正在逐渐减少(完成) . 示例项目here on Github .您也可以使用UIView和块执行相同类型的动画 . 这是一个类扩展方法,可以以任何角度旋转视图 .