使用另一个视图的中心作为锚点旋转视图

时间:2015-01-18 05:22:07

标签: ios objective-c cgaffinetransform

我有两个图像视图。第一个是蓝色箭头,第二个是白色圆圈,用黑色圆点表示圆圈的中心。

我正在尝试旋转箭头,因此它的锚点是图片中的黑点

enter image description here

现在我将箭头图层的锚点设置为像这样计算的点

CGFloat y = _userImageViewContainer.center.y - CGRectGetMinY(_directionArrowView.frame);
CGFloat x = _userImageViewContainer.center.x - CGRectGetMinX(_directionArrowView.frame);
CGFloat yOff = y / CGRectGetHeight(_directionArrowView.frame);
CGFloat xOff = x / CGRectGetWidth(_directionArrowView.frame);

_directionArrowView.center = _userImageViewContainer.center;

CGPoint anchor = CGPointMake(xOff, yOff);
NSLog(@"anchor: %@", NSStringFromCGPoint(anchor));

_directionArrowView.layer.anchorPoint = anchor;

由于锚点被设置为视图的百分比,即中心的坐标是(.5,.5),我正在计算黑点落在箭头框架中的高度百分比。但是我的数学,即使在手工锻炼之后,仍然会导致.5,这是不对的,因为当箭头处于原始位置(垂直,点向上)时,它会超过一半。

我正在根据用户的指南针标题进行旋转

CLHeading *heading = [notif object];

// update direction of arrow
CGFloat degrees = [self p_calculateAngleBetween:[PULAccount currentUser].location.coordinate
                                            and:_user.location.coordinate];


_directionArrowView.transform = CGAffineTransformMakeRotation((degrees - heading.trueHeading) * M_PI / 180);

旋转是正确的,它只是不起作用的锚点。有关如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:1)

我总是发现锚点的东西片状,特别是旋转。我试试这样的事情。

    CGPoint convertedCenter = [_directionArrowView convertPoint:_userImageViewContainer.center fromView:_userImageViewContainer ];

     CGSize offset = CGSizeMake(_directionArrowView.center.x - convertedCenter.x, _directionArrowView.center.y - convertedCenter.y);
 // I may have that backwards, try the one below if it offsets the rotation in the wrong direction..
//  CGSize offset = CGSizeMake(convertedCenter.x -_directionArrowView.center.x , convertedCenter.y - _directionArrowView.center.y); 
     CGFloat rotation = 0; //get your angle (radians)

     CGAffineTransform tr = CGAffineTransformMakeTranslation(-offset.width, -offset.height);
          tr = CGAffineTransformConcat(tr, CGAffineTransformMakeRotation(rotation) );
          tr = CGAffineTransformConcat(tr, CGAffineTransformMakeTranslation(offset.width, offset.height) );


    [_directionArrowView setTransform:tr];

NB。 UIView上的transform属性是可动画的,因此如果需要,你可以将最后一行放在动画块中。

答案 1 :(得分:0)

也许更好地使用更简单的解决方案 - 使箭头图像尺寸更大,更方形。所以黑点将位于图像的中心。

请比较附加的图像,你明白我在说什么

中心有黑点的新图像

enter image description here

带有移位点的旧图像

enter image description here

现在您可以轻松使用标准锚点(0.5,0.5)来旋转已编辑的图像