如何围绕任意点旋转对象?
|
我想以圆形而不是直线的方式围绕任意点旋转UILabel。这是我的代码,最后一点很完美,但它在起点和终点之间经过一条直线。
- (void)rotateText:(UILabel *)label duration:(NSTimeInterval)duration degrees:(CGFloat)degrees {
/* Setup the animation */
[UILabel beginAnimations:nil context:NULL];
[UILabel setAnimationDuration:duration];
CGPoint rotationPoint = CGPointMake(160, 236);
CGPoint transportPoint = CGPointMake(rotationPoint.x - label.center.x, rotationPoint.y - label.center.y);
CGAffineTransform t1 = CGAffineTransformTranslate(label.transform, transportPoint.x, -transportPoint.y);
CGAffineTransform t2 = CGAffineTransformRotate(label.transform,DEGREES_TO_RADIANS(degrees));
CGAffineTransform t3 = CGAffineTransformTranslate(label.transform, -transportPoint.x, +transportPoint.y);
CGAffineTransform t4 = CGAffineTransformConcat(CGAffineTransformConcat(t1, t2), t3);
label.transform = t4;
/* Commit the changes */
[UILabel commitAnimations];
}
没有找到相关结果
已邀请:
4 个回复
嘘崇蔡对
使用关键帧动画来真正改变锚点是非常过头的。 锚点是从其应用所有变换的点,默认锚点是中心。通过将锚点移动到(0,0),您可以改为使图层从最底角旋转。通过将锚点设置为x或y超出0.0-1.0的范围,可以使图层绕其边界之外的点旋转。 有关更多信息,请阅读《 Core Animation编程指南》中有关“图层几何和变换”的部分。它会通过图像进行详细介绍,以帮助您理解。 编辑:要记住的一件事 图层的框架(也是视图的框架)是使用位置,边界和锚点计算的。更改anchorPoint将更改视图在屏幕上的显示位置。您可以通过更改锚点后重新设置框架来解决此问题(这将为您设置位置)。否则,您可以将位置设置为旋转到自己的位置。文档(链接到上面)也提到了这一点。 应用于您的代码 应该更新称为““ transportPoint \”的点,以计算旋转点和标签左下角之间的差除以宽度和高度。
我还将旋转点作为您方法的参数。完整的更新代码如下:
迪擅哨乘傅
讹巳漓把备
是完成此工作的正确工具。大多数UIKit动画都在起点和终点之间。不考虑中间点。 CAKeyframeAnimation允许您定义那些中间点以提供非线性动画。您将必须为动画提供适当的贝塞尔曲线路径。您应查看ѭ6和Apple文档中提供的内容,以了解其工作原理。
晤默报