应用CGAffineTransformRotate后更新帧的原点

时间:2014-08-11 16:59:13

标签: ios objective-c frame cgaffinetransform bounds

我有x和y坐标,以及我需要放置在原始位置的UIImageView的旋转。一旦旋转,坐标对应于视图。

我发现的问题是,如果我使用给定的x和y初始化视图,然后执行旋转,则最终位置不正确,因为应用转换的顺序不正确:< / p>

float x, y, w, h; // These values are given 

UIImageView *imageView = [[UIImageView alloc] init];

// Apply transformations
imageView.frame = CGRectMake(x, y, w, h);
imageView.transform = CGAffineTransformRotate(imageView.transform, a.rotation);

如果我尝试使用x和y来翻转视图,那么最后的x和y就完全错了:

float x, y, w, h; // These values are given 

UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(0, 0, w, h);

// Apply transformations
imageView.transform = CGAffineTransformTranslate(imageView.transform, x, y);
imageView.transform = CGAffineTransformRotate(imageView.transform, a.rotation);

在尝试使用不正确的结果旋转后,我尝试更新视图的中心。

我正在寻找一些关于如何处理这个问题的建议或提示,以达到我需要的结果。

先谢谢!

2 个答案:

答案 0 :(得分:1)

我正在使用此C函数围绕中心进行旋转变换:

static inline CGAffineTransform CGAffineTransformMakeRotationAroundCenter(double width, double height, double rad) {
    CGAffineTransform t = CGAffineTransformMakeTranslation(height/2, width/2);
    t = CGAffineTransformRotate(t, rad);
    t = CGAffineTransformTranslate(t, -width/2, -height/2);

    return t;
}

您需要以弧度为单位指定宽度,高度和角度。

这能解决你的问题吗?

答案 1 :(得分:1)

我能够通过计算框架应该在的原始Y位置和变换视图的原点之间的Y轴偏移来解决这个问题。

本回答中针对类似问题提供的函数提供了一种通过在所有新角中创建具有最小X和Y的点来计算帧的新原点的方法:

-(CGPoint)frameOriginAfterTransform 
{
    CGPoint newTopLeft = [self newTopLeft];
    CGPoint newTopRight = [self newTopRight];
    CGPoint newBottomLeft = [self newBottomLeft];
    CGPoint newBottomRight = [self newBottomRight];

    CGFloat minX = fminf(newTopLeft.x, fminf(newTopRight.x, fminf(newBottomLeft.x, newBottomRight.x)));
    CGFloat minY = fminf(newTopLeft.y, fminf(newTopRight.y, fminf(newBottomLeft.y, newBottomRight.y)));

    return CGPointMake(minX, minY);
}

之后我计算了Y轴的偏移并将其应用到变换视图的中心:

// Adjust Y after rotating to compensate offset
CGPoint center = imageView.center;
CGPoint newOrigin = [imageView frameOriginAfterTransform]; // Frame origin calculated after transform
CGPoint newCenter = CGPointZero;
newCenter.x = center.x;
newCenter.y = center.y + (y - newOrigin.y);
imageView.center = newCenter;

由于某种原因,偏移仅影响Y轴,虽然起初我认为它会影响X和Y.

希望这有帮助!