【问题标题】:iphone sdk CGAffineTransform getting the angle of rotation of an objectiphone sdk CGAffineTransform 获取对象的旋转角度
【发布时间】:2010-01-12 19:41:38
【问题描述】:

我如何计算任何给定对象(即 uiimageview)的旋转角度?

【问题讨论】:

    标签: ios cocoa-touch


    【解决方案1】:

    技术上你不能,因为变换可以包含一个 skew 操作,它将图像变成平行四边形并且不再定义旋转角度。

    不管怎样,由于旋转矩阵生成

     cos(x)  sin(x)   0
    -sin(x)  cos(x)   0
       0        0     1
    

    你可以恢复角度

    return atan2(transform.b, transform.a);
    

    【讨论】:

    【解决方案2】:

    您可以像这样轻松获得旋转的角度:

    CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
    

    例如:

    view.transform = CGAffineTransformMakeRotation(0.02);
    CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
    NSLog(@"%f", angle); // 0.020000
    

    来自documentation

    Core Animation 扩展了键值编码协议,允许通过键路径获取和设置层的 CATransform3D 矩阵的公共值。表 4 描述了层的 transform 和 sublayerTransform 属性是键值编码和观察兼容的关键路径

    【讨论】:

    【解决方案3】:

    或者你可以使用 acos 和 asin 函数。你会得到完全相同的结果:

     NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );
    

    【讨论】:

    • 你建议的身份只有在没有缩放的情况下才是真实的。如果还有缩放,则必须使用 atan() 函数。
    • 非常有帮助,拍摄和简单的回答 +1
    【解决方案4】:

    你可以试试这个:

    - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    {
        CGPoint newLocationPoint = [[touches anyObject] locationInView:self.superview];
        int x = self.center.x;
        int y = self.center.y;    
        float dx = newLocationPoint.x - x;
        float dy = newLocationPoint.y - y;    
        double angle = atan2(-dx,dy);  
        self.layer.position = self.center;
        self.layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1); 
        NSLog(@"touchesMoved %f %f %d,%d   %f,%f  angle:%f",newLocationPoint.x,newLocationPoint.y,x,y,dx,dy,angle);    
    }
    

    【讨论】:

      【解决方案5】:

      我知道这是一个非常古老的问题,但是,如果像我这样的人使用 CALayers 和 CATransform3D 遇到这个问题,您可以通过以下方式获得角度:

      extension CATransform3D {
      
          var xAxisAngle: CGFloat { get { return atan2(self.m23, self.m33) } }
          var yAxisAngle: CGFloat { get { return atan2(self.m31, self.m11) } }
          var zAxisAngle: CGFloat { get { return atan2(self.m12, self.m11) } }
      
      }
      
      

      【讨论】:

        猜你喜欢
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        相关资源
        最近更新 更多