CGAffineTransformMakeRotation of subview

时间:2012-06-23 18:49:42

标签: objective-c view rotation transform subview

这是场景。我有一个主视图,其方向我想与真正的北方对齐。

在这个视图中,我有7个子视图,以主视图中心周围的七边形图案排列。这些子视图中的每一个与其他子视图基本相同,因此相对于其局部坐标的绘制最有意义。

我以为我会使用CGAffineTransformMakeRotation将子视图旋转2 * M_PI / 7的整数倍,以便正确排列它们。到目前为止一切都很好。

我还以为我会使用CGAffineTransformMakeRotation根据罗盘值旋转主视图。为了测试这一点,到目前为止,我一直在努力编写值。那也没关系。

问题是,我的行为与我的预期不同。我认为子视图的旋转将相对于主视图,但它似乎相对于包含主视图的窗口而言。我有错误的期望吗?我是否需要为子视图旋转组合两个转换?如果我必须那样做那很好,但它与我的预期不同,所以也许我做错了。

以下是旋转主视图的代码。我目前在drawRect中将它作为主视图的m文件的最后一件事。

      float angleFromNorth = 2*43.0 / M_PI;
  //      angleFromNorth = 0.;
  CGAffineTransform transform = CGAffineTransformMakeRotation(angleFromNorth);
  [self setTransform:transform];

以下是旋转每个子视图的代码。此代码位于子视图的drawRect方法中。子视图在m文件中为主视图创建。

      float angle = 2 * M_PI * self.tag / self.NumPlatforms;
  CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
  [self setTransform:transform];

    (lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $1 = 0x06c78ff0 <UIWindow: 0x6c80370; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x6c80450>>
   | <CircusView: 0x6c807a0; frame = (0 0; 768 1024); layer = <CALayer: 0x6c80a40>>
   | <PlatformView: 0x8880cd0; frame = (234 362; 300 300); layer = <CALayer: 0x887d310>>
   | <PlatformView: 0x6c805f0; frame = (173.202 301.202; 421.596 421.596); transform = [0.62349, 0.781832, -0.781832, 0.62349, 0, 0]; tag = 1; layer = <CALayer: 0x6c80820>>
   | <PlatformView: 0x6c81870; frame = (204.383 332.383; 359.235 359.235); transform = [-0.222521, 0.974928, -0.974928, -0.222521, 0, 0]; tag = 2; layer = <CALayer: 0x6c80630>>
   | <PlatformView: 0x8884710; frame = (183.772 311.772; 400.456 400.456); transform = [-0.900969, 0.433884, -0.433884, -0.900969, 0, 0]; tag = 3; layer = <CALayer: 0x887cd80>>
   | <PlatformView: 0x6a91a60; frame = (183.772 311.772; 400.456 400.456); transform = [-0.900969, -0.433884, 0.433884, -0.900969, 0, 0]; tag = 4; layer = <CALayer: 0x6a8a200>>
   | <PlatformView: 0x688f970; frame = (204.383 332.383; 359.235 359.235); transform = [-0.222521, -0.974928, 0.974928, -0.222521, 0, 0]; tag = 5; layer = <CALayer: 0x688a710>>
   | <PlatformView: 0x8884750; frame = (173.202 301.202; 421.596 421.596); transform = [0.62349, -0.781832, 0.781832, 0.62349, 0, 0]; tag = 6; layer = <CALayer: 0x887e290>>
(lldb) 

P.S。现在我遇到了另一个障碍。我认为已经解决了上述情况,下一步将是直截了当的,但结果却是挑战。您可能希望关注评论部分中的链接,以查看由纸张/铅笔和/或Google Sketchup呈现的模型外观。无论如何,下一步是将塔放在平台上。我创建了一个名为Tower的新子类UIView,意图在每个平台上放置三个塔。棘手的部分是方向需要匹配真北,即circusView方向,但放置需要与平台对齐。

为此,我在平台实现文件中创建了(self.window)子视图。我想通过在这个文件中这样做,坐标将相对于这个视图。在轮换之前,他们可能会想到它。但是他们需要保持相对于旋转平台的位置,但是朝向与真北方向对齐。结果是每个平台上以这种方式绘制的矩形应该以相同的方式放置在平台上,但是矩形应该相对于平台旋转,即相对于circusView完全没有(不要问)为什么它被称为马戏团 - 从另一个项目的转换中遗留下来。)

有什么建议吗?我现在想的是,我必须像我最终使平台工作一样初始化塔,然后通过平台旋转的反转来旋转它们。

1 个答案:

答案 0 :(得分:2)

请勿在{{1​​}}中设置子视图的转换。在父母的drawRect:中进行。

layoutSubviews

您可以通过向视图发送static CGFloat radiansForDegrees(CGFloat degrees) { return degrees * 2 * M_PI / 360; } - (void)layoutSubviews { self.transform = CGAffineTransformMakeRotation(radiansForDegrees(43)); CGFloat count = self.platformViews.count; for (UIView *platformView in self.platformViews) { platformView.transform = CGAffineTransformMakeRotation(platformView.tag * 2 * M_PI / count); } } 来触发layoutSubviews,但您可能不需要。系统还会在其他时间自动安排对setNeedsLayout的调用,例如视图大小更改或获取或丢失子视图时。