我正在使用CGAffineTransformMake垂直翻转UIImageView。它工作正常,但它似乎没有保存UIImageview的新翻转位置,因为当我尝试第二次翻转它(执行下面的行代码)时它只是不起作用。
shape.transform = CGAffineTransformMake(1,0,0,1,0,0);
请帮忙。提前致谢。
基达
答案 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。”