CGAffineTransformMake - 如何保存UIimageview的状态以进一步处理它

时间:2009-10-27 04:06:41

标签: objective-c iphone cgaffinetransform

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

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

请帮忙。

提前致谢。

基达

3 个答案:

答案 0 :(得分:5)

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

每个转换都是高度特异的。如果应用旋转视图+45度的旋转变换,您将看到它只旋转一次。再次应用相同的变换不会使视图再旋转+45度。相同变换的所有后续应用都不会产生可见效果,因为视图已经旋转+45度,这就是变换所做的全部。

要使变换累积,您已将新变换应用于现有变换,而不是仅替换它。因此,如前所述,每次后续轮换都使用:

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

将新变换添加到现有变换。如果以这种方式添加+45度变换,视图将在每次应用时再旋转+45。

答案 1 :(得分: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;

}

希望这会对你有所帮助。

答案 2 :(得分:0)

如果您只想反转上一次转换的效果,可以考虑将shape.transform属性设置为值CGAffineTransformIdentity。

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

如果要向之前转换过的视图添加其他旋转或缩放操作,则应调查允许您指定现有转换的函数。

即。而不是使用

shape.transform = CGAffineTransformMakeRotation(M_PI);

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

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

这会将旋转应用于现有变换(可能是什么),然后将其分配给视图。看看Apple's documentation for CGAffineTransformRotate,它可能会澄清一些事情。

BTW,文档说:“如果你不打算重用仿射变换,你可能想要使用CGContextScaleCTM,CGContextRotateCTM,CGContextTranslateCTM或CGContextConcatCTM。”