objective-c - UIImageView 的轨道旋转和变换

标签 objective-c ios cocoa-touch

我有一个围绕我 View 中心的圆圈。它连续旋转 360 度。使用我的以下代码可以正常工作:

-(void) rotateGear: (UIImageView*) view angle:(int)angle arc:(float)arc
{
    float x1 = view.frame.origin.x + view.frame.size.width/2;
    float y1 = view.frame.origin.y + view.frame.size.height/2; 
    float radius = sqrtf(powf(160.0f - x1 ,2.0f) + powf(240.0f - y1, 2.0f));

    float x = 160.0f + radius * (cos(arc + M_PI + (angle * (M_PI / 180.0f))));
    float y = 240.0f + radius * (sin(arc + M_PI + (angle * (M_PI / 180.0f))));

    view.frame = CGRectMake(x - view.frame.size.width/2, y - view.frame.size.height/2, view.image.size.width, view.image.size.height);
}

上面的代码根据传入的参数计算新位置并将图像移动到新位置,使其看起来就像是在与主视图的中心完美相关地移动。一切都很完美。

但是,我想让围绕中心旋转的 View /球体在旋转时也旋转。在另一个计时器中,我尝试:

littleGear.transform = 
        CGAffineTransformRotate(CGAffineTransformIdentity, M_PI * (angle) / 180.0);

事情变得疯狂。球体开始在屏幕周围翻转、扑打、折叠和弯曲。如果我删除第一个代码,即轨道旋转,它会正常工作——它会完美地旋转到位。

从本质上讲,它们都可以正常工作,直到组合在一起,然后一切都变得疯狂。我的第一个猜测是矩阵随着所有的旋转而被淹没,但我不确定如何解决它。有什么想法吗?

最佳答案

frame 不是 UIView 的存储属性,它是根据其他参数的数量计算的 - View 中心、边界、当前变换,因此如果您为 View 设置了非平凡的变换,您将无法再直接设置其框架。

在你的情况下,旋转齿轮基本上只是改变它的位置,你可以设置齿轮的中心而不是框架 - 这样所有 View 属性应该保持一致的状态:

-(void) rotateGear: (UIImageView*) view angle:(int)angle arc:(float)arc
{
    ...    
    view.center = CGPointMake(x, y);
}

附言如果您还想更改 View 的大小 - 更改其 bounds 属性而不是 frame

关于objective-c - UIImageView 的轨道旋转和变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917821/

相关文章:

objective-c - 如何循环包含在 CATransaction block 中的几个 CABasicAnimations?

iphone - 在表格 View 中插入图像?

ios - 仅在 XCode 6 上横向

iphone - 在 IM 风格的应用程序中接收新消息的最佳方式

ios - 使用未声明的标识符 'kUTTypeMovie'

objective-c - ceil() 没有像我预期的那样工作

ios - 使用 .map 将一个类的数组映射到另一个类的数组

ios - 当空间受限时减少元素之间的空间量

ios - 将 UITextView 中的文本垂直和水平居中