Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么使用CGAffineTransformMakeRotation旋转视图时会更改其位置_Ios_Objective C_Rotation - Fatal编程技术网

Ios 为什么使用CGAffineTransformMakeRotation旋转视图时会更改其位置

Ios 为什么使用CGAffineTransformMakeRotation旋转视图时会更改其位置,ios,objective-c,rotation,Ios,Objective C,Rotation,我有以下超级简单的动画,我基本上是旋转一个视图,从它的原始角度/中心旋转2弧度,它旋转得很好。我唯一的误解是,当旋转发生时,为什么视图会从它的原始位置移动 [UIView animateWithDuration:1.0 animations:^{ self.someView.transform = CGAffineTransformMakeRotation( 2 ); }]; 当使用上面的代码旋转时,为什么视图会移动 我目前正试图辨别出这些信息 理解锚 我找到了这些线

我有以下超级简单的动画,我基本上是旋转一个视图,从它的原始角度/中心旋转2弧度,它旋转得很好。我唯一的误解是,当旋转发生时,为什么视图会从它的原始位置移动

[UIView animateWithDuration:1.0 animations:^{
        self.someView.transform = CGAffineTransformMakeRotation( 2 );
    }];
当使用上面的代码旋转时,为什么视图会移动

我目前正试图辨别出这些信息

理解锚

我找到了这些线索,但没有给出具体的答案。

非常感谢

CGAffineTransformMakeRotation的“锚定点”是视图的X,Y。您可以尝试以下方法:

CGPoint center = self.someView.center;
[UIView animateWithDuration:1.0 animations:^{
    self.someView.transform = CGAffineTransformMakeRotation( 2 );
    self.someView.center = center;
}];

您需要设置视图的锚定点以进行旋转

self.somview.layer.anchorPoint = CGPointMake(0.5, 0.5);
然后开始旋转
来自苹果的文档

@属性(非原子)CGAffineTransform转换
属性可以设置动画。使用beginAnimations:context:class
方法开始,commitAnimations类方法结束
动画块。默认值为中心值(或)
锚点(如果更改)
链接:


这里的图像
-如您所见,对于X和Y,定位点是值在0.0-1.0之间的点 旋转时,旋转将围绕这些点进行

注意:您需要导入QuartzCore

由于@fs\u tigre请求,我正在添加另一个答案。问题在于xib文件中的自动布局,不幸的是,不知道为什么会影响转换
下面是我为解决这个问题所做的步骤:

1-首先,您需要摆脱自动布局(是的,您必须)
取消选中“使用自动布局”

2-删除视图中将要旋转的所有约束和自动调整大小遮罩,如屏幕截图所示 (这里有我的蓝色框,请参见右侧的自动调整大小,未选择任何内容)

我对你的轮换代码做了一些更改

self.someView.layer.anchorPoint = CGPointMake(0.5, 0.5);
    // one degree = pi/180. so...
    // rotate by 90
    CGFloat radians = (M_PI/180) * 90;
    [UIView animateWithDuration:1.0 animations:^{
        self.someView.transform = CGAffineTransformRotate(self.someView.transform, radians);
    }];

单击“旋转”
并查看神奇之处:)

它应该围绕视图的中心旋转,除非您更改了视图图层的定位点。你能描述一下位置的变化吗?或者发布一些图片,显示视图是如何改变位置的?我没有移动锚点,事实上,上面的代码是我在一个操作/方法中唯一的代码,当点击按钮时会触发。我会尝试一下,让你知道。ThanksI尝试了这段代码,但也没有成功,它仍然会在视图开始旋转之前移动视图。但如果我将旋转角度更改为3.14弧度或6.28弧度,它会起作用。我仍然不知道如何理解这一点,设置锚点没有任何影响,仍然移动其位置。有趣的是,如果我将旋转更改为3.14弧度(180度)或6.28弧度(360度),它甚至可以在不设置锚定点的情况下正常工作<代码>-(iAction)rotateIt:(id)发送方{[UIView animateWithDuration:1.0动画:^{self.view1.transform=CGAffineTransformMakeRotation(3.14);self.view2.transform=CGAffineTransformMakeRotation(6.28);}];}@end此代码工作正常。为什么它只适用于3.14和6.28弧度?它似乎是默认的0.5,0.5,因为如果我将它更改为其他类似的值,
self.somview.layer.anchorPoint=CGPointMake(0.7,0.7)它实际上响应这些新值,但如果我将其设置为
self.somview.layer.ancorpoint=CGPointMake(0.5,0.5)这没有什么区别,它的行为就像什么都没有设置一样。(参见我在原始帖子中发布的图片)。我想知道这是否与自动布局有关。即使我没有对试图旋转的视图应用任何约束,也可能会受到以下事实的影响:在您在Xcode 5中创建的任何新项目中默认设置了自动布局。“我发现了这个线程-”讨论了自动布局对转换的影响。如果您确认此视图禁用了自动布局,然后我会试着在我这边测试,然后回到你身边。谢谢你Basheer_CAD,不幸的是,我现在不能确认这一点,因为我不在办公桌上,但我一回到家就会做。非常感谢您抽出时间提供帮助。@fs_tigre这里有一个视频给您,非常感谢您抽出时间并实际试用过。这回答了我的问题。我想如果你想转换视图并使用自动布局,你必须使用子视图,正如马特·纽伯格在文章第三条建议中所描述的那样。没问题@fs_tigre,很高兴help@fs_tigre,我没有试过,但我认为这是一个很好的解决办法。但是当我处理很多动画时,我喜欢禁用自动布局,以避免它们的头痛。为什么要使用CGPointMake(0.5,0.5)?如何让它充满活力