1

我的用户案例是一个 iphone 应用程序,我在其中对图像的缩放、旋转和平移进行动画处理。

因此,我将所有内容连接起来并将其提供给转换属性,但存在一个问题:

由于我的图像大小不同,因此正确定位它们是一个问题。我习惯了一个倒置的 y 轴坐标系,所以我希望我的图像在 y 轴上精确定位在 60 像素处。

那么,如何从原来的笛卡尔 y 轴变为倒置 y 轴的观点呢?

4

2 回答 2

4

正如 smacl 指出的那样,最简单的方法是通过在视图的原点中使用 (screenheight - viewheight - y) 而不是 y 将原点移动到屏幕的左下角。

但是,您可以使用 CATransform3D 翻转主视图图层的坐标系。我这样做是为了可以在我的 iPhone 应用程序和 Mac 客户端之间共享相同的 Core Animation CALayer 布局代码(iPhone 会反转 CALayers 的正常 Quartz 坐标系以匹配 UIViews 的坐标系)。要启用此功能,您需要做的就是放置线

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);

在您的图层托管 UIView 的初始化代码中。请记住,这将翻转您的 CALayers,因此这些图层中的任何 UIKit 文本渲染也可能需要使用类似于以下的代码进行翻转:

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];

CGContextRestoreGState(context);

您可以使用 CGAffineTransform 进行类似的反转,但您还需要应用转换才能使其工作:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);

您可以使用仿射变换使用 CGPointApplyAffineTransform() 转换原点坐标。

于 2009-03-02T16:13:19.383 回答
1

对于每个 y 坐标,y = top-y,其中 top 是您正在绘制的边界框顶部的 y 坐标。

于 2009-03-02T09:42:54.957 回答