0

我正在使用 CGAffineTransformMake 垂直翻转 UIImageView。它工作正常,但似乎没有保存 UIImageview 的新翻转位置,因为当我尝试第二次翻转它(执行下面的行代码)时,它就不起作用。

shape.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);

请帮忙。

提前致谢。

凯达

4

3 回答 3

5

变换不会像您期望的那样自动累加/累加。分配一个变换只变换一次目标。

每个转换都是高度特定的。如果应用将视图旋转 +45 度的旋转变换,您将看到它仅旋转一次。再次应用相同的变换不会将视图额外旋转 +45 度。相同变换的所有后续应用都不会产生可见的效果,因为视图已经旋转了 +45 度,而这就是变换所能做的一切。

要使转换累积,您必须将新转换应用于现有转换,而不仅仅是替换它。因此,如前所述,对于您使用的每个后续轮换:

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

它将新变换添加到现有变换中。如果您以这种方式添加 +45 度变换,则每次应用时视图将额外旋转 +45。

于 2009-10-29T22:49:07.857 回答
1

我和你有同样的问题,我找到了解决方案!我想旋转UIImageView,因为我会有动画。要保存图像,我使用此方法:

void CGContextConcatCTM(CGContextRef c, CGAffineTransform transform)

变换参数是您的变换,UIImageView因此您对 imageView 所做的任何事情都与图像相同!我写了一个类别方法UIImage

-(UIImage *)imageRotateByTransform:(CGAffineTransform)transform{
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
rotatedViewBox.transform = transform;
CGSize rotatedSize = rotatedViewBox.frame.size;
[rotatedViewBox release];

// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();

// Move the origin to the middle of the image so we will rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

//Rotate the image context using tranform
CGContextConcatCTM(bitmap, transform);
// Now, draw the rotated/scaled image into the context
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

}

希望这会帮助你。

于 2011-11-05T02:06:58.247 回答
0

如果您只想反转先前转换的效果,您可能希望考虑将 shape.transform 属性设置为值 CGAffineTransformIdentity。

当您设置视图的变换属性时,您将替换它具有的任何现有变换,而不是添加到它。因此,如果您分配一个导致旋转的变换,它将忘记您之前配置的任何翻转。

如果您想向之前转换的视图添加额外的旋转或缩放操作,您应该研究允许您指定现有转换的函数。

即而不是使用

shape.transform = CGAffineTransformMakeRotation(M_PI);

用指定的旋转替换现有的变换,你可以使用

shape.transform = CGAffineTransformRotate(shape.transform, M_PI);

这会将旋转应用于现有的变换(可能是什么),然后将其分配给视图。看看苹果的 CGAffineTransformRotate 文档,它可能会澄清一些事情。

顺便说一句,文档说:“如果您不打算重用仿射变换,您可能需要使用 CGContextScaleCTM、CGContextRotateCTM、CGContextTranslateCTM 或 CGContextConcatCTM。”

于 2009-10-27T22:46:48.490 回答