计算锚点的旋转角度

时间:2013-10-24 11:55:37

标签: ios calayer cgaffinetransform

我遇到了一个问题,我需要将视图重新定位到预定义的位置。

所有视图都有UIPanGestureRecognizerUIRotationGestureRecognizer,并在控制器视图中定位/旋转。在某个事件中,视图应移动到具有新旋转角度的新位置。

一切正常,但是当一个手势识别器处于活动状态时,anchorPoint已经改变了重新定位/旋转失败。

以下是我尝试使用anchorPoint进行转换的方法。

  - (CGPoint)centerPointWithInVisibleAreaForPoint:(CGPoint)point  
 {
    CGPoint anchorP = self.layer.anchorPoint;
      anchorP.x    -= 0.5;
      anchorP.y    -= 0.5;

    CGRect rect = self.bounds;

    CGFloat widthDelta  = CGRectGetWidth(self.bounds)  * anchorP.x;
    CGFloat heightDelta = CGRectGetHeight(self.bounds) * anchorP.y;

    CGPoint newCenter = CGPointMake(point.x + widthDelta, point.y + heightDelta);

    return newCenter;
}

控制器要求校正中心点并设置视图的中心值。然后使用CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(differenceAngle))设置旋转变换。

我认为问题是由于预定目标角度是基于围绕中心的旋转这一事实引起的,当围绕不同的anchorPoint旋转时,这显然是不同的,但我不知道如何补偿这一点。

1 个答案:

答案 0 :(得分:0)

我找到的唯一解决方案(并且它是最简单的解决方案之一)是将anchorPoint重置为0.5 / 0.5并相应地更正位置。

- (void)resetAnchorPoint
{
   if (!CGPointEqualToPoint(self.layer.anchorPoint, CGPointMake(0.5, 0.5))) {

    CGFloat width = CGRectGetWidth(self.bounds);
    CGFloat height = CGRectGetHeight(self.bounds);

    CGPoint newPoint = CGPointMake(width * 0.5, height * 0.5);
    CGPoint oldPoint = CGPointMake(width * self.layer.anchorPoint.x, height * self.layer.anchorPoint.y);

    newPoint = CGPointApplyAffineTransform(newPoint, self.transform);
    oldPoint = CGPointApplyAffineTransform(oldPoint, self.transform);

    CGPoint position = self.layer.position;
    position.x += (newPoint.x - oldPoint.x);
    position.y += (newPoint.y - oldPoint.y);

    [CATransaction setDisableActions:YES];
    self.layer.position    = position;
    self.layer.anchorPoint = CGPointMake(0.5, 0.5);
    [CATransaction setDisableActions:NO];
  }
}