我正在使用 CGAffineTransformMake 垂直翻转 UIImageView。它工作正常,但似乎没有保存 UIImageview 的新翻转位置,因为当我尝试第二次翻转它(执行下面的行代码)时,它就不起作用。
shape.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
请帮忙。
提前致谢。
凯达
我正在使用 CGAffineTransformMake 垂直翻转 UIImageView。它工作正常,但似乎没有保存 UIImageview 的新翻转位置,因为当我尝试第二次翻转它(执行下面的行代码)时,它就不起作用。
shape.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
请帮忙。
提前致谢。
凯达
变换不会像您期望的那样自动累加/累加。分配一个变换只变换一次目标。
每个转换都是高度特定的。如果应用将视图旋转 +45 度的旋转变换,您将看到它仅旋转一次。再次应用相同的变换不会将视图额外旋转 +45 度。相同变换的所有后续应用都不会产生可见的效果,因为视图已经旋转了 +45 度,而这就是变换所能做的一切。
要使转换累积,您必须将新转换应用于现有转换,而不仅仅是替换它。因此,如前所述,对于您使用的每个后续轮换:
shape.transform = CGAffineTransformRotate(shape.transform, M_PI);
它将新变换添加到现有变换中。如果您以这种方式添加 +45 度变换,则每次应用时视图将额外旋转 +45。
我和你有同样的问题,我找到了解决方案!我想旋转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;
}
希望这会帮助你。
如果您只想反转先前转换的效果,您可能希望考虑将 shape.transform 属性设置为值 CGAffineTransformIdentity。
当您设置视图的变换属性时,您将替换它具有的任何现有变换,而不是添加到它。因此,如果您分配一个导致旋转的变换,它将忘记您之前配置的任何翻转。
如果您想向之前转换的视图添加额外的旋转或缩放操作,您应该研究允许您指定现有转换的函数。
即而不是使用
shape.transform = CGAffineTransformMakeRotation(M_PI);
用指定的旋转替换现有的变换,你可以使用
shape.transform = CGAffineTransformRotate(shape.transform, M_PI);
这会将旋转应用于现有的变换(可能是什么),然后将其分配给视图。看看苹果的 CGAffineTransformRotate 文档,它可能会澄清一些事情。
顺便说一句,文档说:“如果您不打算重用仿射变换,您可能需要使用 CGContextScaleCTM、CGContextRotateCTM、CGContextTranslateCTM 或 CGContextConcatCTM。”