【问题标题】:Why does a view changes position when rotating it using CGAffineTransformMakeRotation为什么使用 CGAffineTransformMakeRotation 旋转视图时视图会改变位置
【发布时间】:2014-04-06 01:41:33
【问题描述】:

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

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

为什么用上面的代码旋转时视图会移动?

我目前正在尝试识别CGAffineTransform Reference 中的信息。

了解锚point

我找到了这个帖子,但没有给出具体的答案。 Why rotating imageView, it changes position?

非常感谢

【问题讨论】:

  • 它应该围绕视图的中心旋转,除非您更改了视图层的锚点。您能否描述位置变化或发布图像以显示视图如何更改位置?
  • 我没有移动锚点,实际上上面的代码是我在一个动作/方法中的唯一代码,当点击按钮时触发。

标签: ios objective-c rotation


【解决方案1】:

您需要将视图的锚点设置为旋转。

self.somview.layer.anchorPoint = CGPointMake(0.5, 0.5);

然后开始旋转。
来自 Apple 文档

@property(nonatomic) CGAffineTransform transform
对此进行更改 属性可以动画。使用 beginAnimations:context: 类 方法开始和 commitAnimations 类方法结束 动画块。默认值是中心值(或 锚点(如果更改) 链接:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instp/CALayer/anchorPoint


图片来自这里http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
- 如您所见,锚点是 X 和 Y 值为 0.0 - 1.0 的点 当您旋转时,旋转将围绕这些点
注意:您需要导入 QuartzCore

【讨论】:

  • 我还是不知道明白这个,设置锚点没有任何作用,仍然移动它的位置。有趣的是,如果我将旋转更改为 3.14 弧度(180 度)或 6.28 弧度(360 度),它甚至无需设置锚点就可以正常工作。 - (IBAction)rotateIt:(id)sender { [UIView animateWithDuration:1.0 animations:^{ 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.anchorPoint = CGPointMake(0.5, 0.5); 它不会t 有所作为,它只是表现得好像什么都没有设置。 (请参阅我在原始帖子中发布的图片)。
  • 我想知道这是否与自动布局有关。无论如何,我没有对尝试旋转的视图应用任何约束,这可能会受到您在 Xcode 5 中创建的任何新项目中默认设置自动布局这一事实的影响。“我找到了这个线程 - stackoverflow.com/questions/12943107/…”谈到影响转换的自动布局。
  • 如果您确认此视图的自动布局已禁用,那么我将尝试在我这边进行测试并回复您。
  • 谢谢 Basheer_CAD,很遗憾,由于我不在办公桌前,我目前无法确认这一点,但我一回到家就会这样做。非常感谢您花时间提供帮助。
【解决方案2】:

由于@fs_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);
    }];

点击rotate 看看魔法:)

【讨论】:

  • @fs_tigre 这是给你的视频dropbox.com/s/4wxar56o4jbyrdg/video.mov
  • 非常感谢您抽出宝贵时间并实际尝试过。这回答了我的问题。我想如果您想转换视图并想使用 atutolayout,您将不得不使用子视图,如 Matt Neuburg 的帖子的第三个建议中所述。 stackoverflow.com/questions/12943107/…
  • 没问题@fs_tigre,很乐意提供帮助
  • @fs_tigre,我没有尝试过,但我认为这是一个很好的解决方案。但是当我处理很多动画时,我喜欢禁用自动布局,以避免他们头疼
  • 为什么选择 CGPointMake(0.5, 0.5) ?如何让它动态
【解决方案3】:

CGAffineTransformMakeRotation 的“锚点”是视图的 X、Y。你可以试试这个:

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

【讨论】:

  • 我会试试这个,让你知道。谢谢
  • 我尝试了这段代码,但它也不起作用,它仍然会在视图开始旋转之前移动视图。但如果我将旋转角度更改为 3.14 弧度或 6.28 弧度,它会起作用。
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2020-12-30
相关资源
最近更新 更多