44

3我有一个可以通过触摸操作的图像。

可以说它是一个向上的箭头图像。在它旋转 180 度后,箭头现在指向下方,我想重置 CGAffineTransform 属性,以便它认为它现在转回 0 度。

我想要这个,因为无论图像的角度是 0 还是 180,我都必须平移、旋转、缩放等。

提前致谢。

已编辑 Ater 5 回复:

嗯,我不确定这些答案是否符合我的要求。我很抱歉没有说清楚。

  1. 带有向上箭头的图像被触摸并向右移动 - 一切都很好。
  2. 使用旋转手势旋转图像并旋转 180 度 - 一切都很好
  3. 图像现在被触摸并向右移动 - 由于坐标是颠倒的,现在图像上下跳跃,使我的其他动画序列变得混乱。

为了防止上述问题和其他一些问题,我想在旋转 180 度后重置所有内容。例如,一旦图像旋转 180 度,CGAffineTransform 属性就知道它已旋转 180%。我想在那个时候重新设置属性,所以 CGAffineTransform 认为它的转角是 0 度而不是 180 度,即使图像在视觉上是颠倒的。我希望这发生在没有任何视觉变化的情况下,只要它旋转到 180 度。

希望这更清楚......

4

5 回答 5

78

如果您尝试重置转换,以使图像显示为原来的样子,您可以简单地将转换设置回身份。

self.imageView.transform = CGAffineTransformIdentity

如果您想对变换后的图像应用任意变换,最简单的方法是使用接受现有变换的 CGAffineTransform 方法。只需发送现有的转换。例如:

CGAffineTransform scale = CGAffineTransformMakeScale(zoom, 1);
self.imageView.transform = CGAffineTransformConcat(self.imageView.transform, scale);

如果您真的需要完全没有任何转换的图像,则必须将其重新绘制到另一个图像中。这也不是那么难,但我不推荐它作为你的第一个解决方案。此代码适用于任意视图的 UIView 类别的上下文,包括 UIImageView:

- (UIImage *) capture {
    CGRect screenRect = self.frame;
    CGFloat scale = [[UIScreen mainScreen] scale];
    UIGraphicsBeginImageContextWithOptions(screenRect.size, YES, scale);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);

    [self.layer renderInContext: ctx];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}
于 2011-05-13T18:03:04.557 回答
54

斯威夫特 3斯威夫特 4斯威夫特 5

您可以使用以下命令重置 CGAffineTransform:

self.imageView.transform = CGAffineTransform.identity

较短的版本是.identity这样的:

self.imageView.transform = .identity
于 2017-10-15T15:22:50.037 回答
5

昨天做了类似但更简单的事情。

查找任何现有的变换值。然后,将其作为新变换的偏移量。

查看示例:

// Rotate right/clockwise

CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((90 + degrees) * M_PI/180);
imageView.transform = transform;

// Rotate left/anticlockwise

CGFloat radians = atan2f(imageView.transform.b, imageView.transform.a);
CGFloat degrees = radians * (180 / M_PI);
// Yeah yeah, I like degrees.
CGAffineTransform transform = CGAffineTransformMakeRotation((-90 + degrees) * M_PI/180);
imageView.transform = transform;

如果您希望将现有的变换值添加到新的变换中以构成正确的移动,这只是一个提示。对比例等使用相同的方法。

有些人建议使用 CABasicAnimation 并将附加属性设置为 YES。但无法让它发挥作用。

于 2011-05-13T18:39:40.493 回答
4

目标 C:

self.transform = CGAffineTransformIdentity;
于 2018-03-06T11:58:15.017 回答
2

您可以组合多个转换。例如:

CGAffineTransform rotation = CGAffineTransformMakeRotation(up ? 0 : M_PI);
imageView.transform = CGAffineTransformScale(rotation,xScale, yScale);
于 2011-05-13T18:07:53.027 回答