CGAffineTransformInvert不反转视图转换

max*_*nev 0 iphone core-animation ios

我想缩放+翻译视图,然后将此转换动画回来.但是CGAffineTransformInvert返回一个不同的变换(无法理解它的逻辑).

#import <UIKit/UIKit.h>
@interface TestView : UIView {
    UIView *view;
    CGAffineTransform transform;
}
@end


#import "TestView.h"
#import <QuartzCore/QuartzCore.h>
@implementation TestView
- (void)testAnimation:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context {
    CGAffineTransform transformInverted = CGAffineTransformInvert(transform);
    [UIView beginAnimations:@"test2" context:NULL];
    [UIView setAnimationDuration:3.0];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    view.transform = transformInverted;
    [UIView commitAnimations];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        view = [[UIView alloc] initWithFrame:CGRectMake(150, 150, 100, 100)];
        view.backgroundColor = [UIColor greenColor];
        [self addSubview:view];

        CGAffineTransform transform1 = CGAffineTransformTranslate(view.transform, -150, -150); 
        transform = CGAffineTransformScale(transform1, (float)1/2, (float)1/2); 

        [UIView beginAnimations:@"test1" context:NULL];
        [UIView setAnimationDuration:3.0];
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(testAnimation:finished:context:) ];

        view.transform = transform;

        [UIView commitAnimations];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

Emi*_*aez 5

CGAffineTransformInvert反转变换矩阵,并返回一个矩阵,当乘以原始结果时CGAffineTransformIdentity.

如果要反转翻译/比例,您应该自己跟踪它们.

PS.矩阵非常复杂,它们不存储平移/缩放/旋转值,它们由几个值组成,当乘以坐标时会给出平移/缩放/旋转值,因此您不能期望反转矩阵并得到一个矩阵,其平移,缩放和旋转.

你可以在这里阅读更多相关信息.

编辑回答您的意见:

使用矩阵时,操作顺序很重要,如果旋转然后翻译,结果将与翻译然后旋转时的结果不同.

要反转应用于矩阵的操作,您应该以相反的顺序应用相反的操作,在这种情况下,要反转这个:

CGAffineTransform transform1 = CGAffineTransformTranslate(view.transform, x1, x2);
CGAffineTransform transform2 = CGAffineTransformScale(transform1, r1, r2);
CGAffineTransform transform3 = CGAffineTransformRotate(transform2, a);
Run Code Online (Sandbox Code Playgroud)

你需要这样做:

CGAffineTransform reversed3 = CGAffineTransformRotate(transform3, -a);
CGAffineTransform reversed2 = CGAffineTransformScale(reversed3, 1/r1, 1/r2);
CGAffineTransform reversed1 = CGAffineTransformTranslate(reversed2, -x1, -x2);

[view setTransform:reversed1];
Run Code Online (Sandbox Code Playgroud)

如果之前没有修改过视图的变换,你可以这样做:

[view setTransform:CGAffineTransformIdentity];
Run Code Online (Sandbox Code Playgroud)

这是零旋转,零平移和1的标度.