【问题标题】:Rotating Wheel with labels - how to keep labels horizontal as the wheels rotates?带标签的旋转轮 - 如何在轮子旋转时保持标签水平?
【发布时间】:2014-01-21 20:04:30
【问题描述】:

我一直在寻找如何实现幸运型轮子(运行良好)的解决方案,除了我需要轮子外围的图像/标签保持水平而不随轮子旋转.我实现了以下内容,但标签(在本例中为红色椭圆)没有保持水平。

我附上了我在屏幕上构建红色椭圆的代码:

CGFloat cita = 0;
for(int i = 1; i < 2; ++i)
{
    CGFloat smallCircleRadius = bigCircleRadius / 8.0;
    for (int i = 0; i < 8; i++)
    {

        CGPoint smallCircleCenter = CGPointMake(wheelCenter.x  + bigCircleRadius * cos(cita) - smallCircleRadius/2.0 , wheelCenter.y + bigCircleRadius * sin(cita) - smallCircleRadius / 2.0 );


        CGRect smallCircleRect = CGRectMake(smallCircleCenter.x,smallCircleCenter.y,smallCircleRadius * 2,smallCircleRadius);

        cita += M_PI / 4.0;

        CAShapeLayer *l = [CAShapeLayer layer];
        UIBezierPath * p1 = [UIBezierPath bezierPathWithOvalInRect:smallCircleRect];

        l.path = p1.CGPath;
        l.strokeColor = [[UIColor redColor] CGColor];
        l.fillColor = [[UIColor redColor] CGColor];
        l.lineWidth = 3.0;

        l.anchorPoint = CGPointMake(.5, .5);

        [self.emoticonsArray addObject:l];

        [self.baseWheel.layer addSublayer:l];

      }

   }

下面是转动轮子的函数;我正在编写为标签进行旋转的代码行——我显然在这里做错了,但我不知道是什么。非常感谢任何指导。

-(void)spin:(double)delta
{
currentAngle = currentAngle + delta;

CATransform3D transform = CATransform3DMakeRotation(currentAngle, 0, 0, 1);

[self.baseWheel.layer setTransform:transform];

  // rotate the red labels here.
  for (CAShapeLayer * l in self.emoticonsArray)
  {

    CGPoint miniWheelCenter = [l convertPoint:l.position toLayer:self.baseWheel.layer.superlayer];


    // !! something wrong here!! but what? 
    CATransform3D t_l = CATransform3DMakeRotation(-currentAngle, miniWheelCenter.x/2, miniWheelCenter.y/2, 1);
    [l setTransform:t_l];
  }
}

【问题讨论】:

  • 问题是因为你正在旋转那些标签是子视图的整个轮子。所以随着轮子它们也会旋转。
  • 这是预期的行为。我想做的是让红色椭圆在它们后面跟着轮子移动,同时保持它们的方向不变——这意味着它们应该像现在一样保持水平方向,同时像摩天轮一样绕着圆圈旋转。跨度>

标签: ios animation image-rotation catransform3drotate


【解决方案1】:

CATransform3DMakeRotation 的参数是旋转轴的角度和三个分量。轮子和标签子层的旋转轴应该只是 Z 轴。你得到了这个轮子的权利,但标签错了。

CATransform3D t_l = CATransform3DMakeRotation(-currentAngle, 0, 0, 1);
[l setTransform:t_l];

但是,只使用仿射变换会更简单,它只能绕 Z 轴旋转:

-(void)spin:(double)delta {
    currentAngle = currentAngle + delta;
    self.baseWheel.layer.affineTransform = CGAffineTransformMakeRotation(currentAngle);

    CGAffineTransform labelTransform = CGAffineTransformMakeRotation(-currentAngle);
    for (CAShapeLayer *l in self.emoticonsArray) {
        l.affineTransform = labelTransform;
    }
}

Core Animation 将为您将仿射变换转换为 3D 变换。

【讨论】:

【解决方案2】:

问题是因为您正在旋转这些标签是子视图的整个轮子。所以它们也随着轮子旋转。
最好的方法是计算旋转角度值。根据该角度,计算该圆上标签的新位置,并将标签(不是轮子的子视图)放置在这些新位置。

OR(方法 2)

将旋转变换的负值设置为这些标签。

【讨论】:

  • 如果您仔细查看我的代码,设置负角正是我正在做的事情。我添加了一个新图像 - 第一个让椭圆看起来好像根本没有移动,但它们确实在发生变化,只是不像预期的那样。在代码中我设置了以下内容:CGPoint miniWheelCenter = [l convertPoint:l.position toLayer: self.baseWheel.layer.superlayer]; // !! something wrong here!! but what? CATransform3D t_l = CATransform3DMakeRotation(-currentAngle, miniWheelCenter.x/2, miniWheelCenter.y/2, 1); - 我相信这里有问题。
【解决方案3】:

解决此问题的其他方法是,不要将标签用作轮子的子视图。您只需将它们放在轮子上即可。所以当轮子转动时,标签会在同一个地方。如果我不够清楚,请告诉我

编辑

这里是您的问题的替代解决方案。它并不完美,但可能会给你一个新的思考方向。

  1. png 格式获取您的车轮图像。
  2. 为您的车轮设置透明背景。 (不需要..只是为了美化)
  3. 在车轮上要显示标签的位置打孔。 (我的意思是让这部分透明)。
  4. 现在将标签放在车轮后面。根据所需的旋转角度定位它们。
  5. 现在,当您以精确的角度旋转滚轮时,您将能够看到标签。它就像两层纸。

为什么它不完美 标签不会随轮子移动。因此,您只能在某些角度看到标签。

我不知道您的问题要求背后的确切目的,但我使用这种方法为我的应用创建 Jog dial..

【讨论】:

  • 我需要标签随轮子移动;我只需要它们像摩天轮一样保持水平,这有意义吗?
  • 是的.. 这完全有道理,我想我为您的问题找到了另一种解决方案。 5 分钟后查看我的更新答案。
  • 恐怕我说得不够清楚。我确实需要标签与轮子一起使用 - 就好像它们正在围绕轮子的圆周追踪自己的弧线。我需要改变的是标签上文本的实际角度(一旦我把它放进去)——这样标签上的图像总是保持向北倾斜。摩天轮就是一个很好的例子——各个展位随着摩天轮一起移动,但展位和其中的人总是坐在相同的位置,无论是垂直还是水平方向。位置会改变,但方向不会't。
  • 我发现了另一个 [问题] (stackoverflow.com/questions/17953283/…) 更好地描述了它 - 但关于固定视图的部分从未得到回答 - 也许这会更清楚:
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2013-10-29
相关资源
最近更新 更多