ios - 带标签的旋转轮 - 如何在轮子旋转时保持标签水平?

标签 ios animation image-rotation catransform3drotate

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

This is how it should always look, no matter where the wheel has rotated

enter image description here

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

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];
  }
}

最佳答案

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;
    }
}

核心动画将为您将仿射变换转换为 3D 变换。

关于ios - 带标签的旋转轮 - 如何在轮子旋转时保持标签水平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267968/

相关文章:

css - woorank 加载程序 (css) 如何工作?

javascript - 禁用 Bootstrap 的折叠打开/关闭动画

java - 我如何在java中通过字节数组旋转图像?

ios - 在 Xcode/iOS 项目之间共享文件

ios - 动画到新的 MKMapCamera 后的回调

ios - 如何根据随机数组索引显示正确的 label.text

ios - Objective-C CGAffineTransformRotate 不起作用

image - FFmpeg旋转的透明图像颜色填充无法正常工作

ios - 在 Sprite Kit 中播放声音

c++ - 将 std::string 转义为 NSString*