gpt4 book ai didi

iphone - CGAffineTransform Invert 不反转 View 变换

转载 作者:行者123 更新时间:2023-11-28 18:41:19 24 4
gpt4 key购买 nike

我想缩放+平移一个 View ,然后将此转换设置为动画。但是 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;
}

最佳答案

CGAffineTransformInvert 反转变换矩阵,并返回一个矩阵,该矩阵乘以原始结果在 CGAffineTransformIdentity 中。

如果你想反转平移/比例,你应该自己跟踪它们。

附言。矩阵非常复杂,它们不存储平移/缩放/旋转值,它们由几个值组成,当乘以坐标时会得到平移/缩放/旋转值,所以你不能期望反转矩阵得到一个平移、缩放和旋转倒置的矩阵。

您可以阅读更多关于它们的信息 here .

编辑以回答您的评论:

在处理矩阵时,操作顺序很重要,如果旋转然后平移,结果将不同于平移然后旋转。

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

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

你需要这样做:

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

[view setTransform:reversed1];

如果您之前没有修改 View 的转换,您可以这样做:

[view setTransform:CGAffineTransformIdentity];

零旋转,零平移,比例为 1。

关于iphone - CGAffineTransform Invert 不反转 View 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com