Iphone CAAffinetTransformationMake旋转问题

Iphone CAAffinetTransformationMake旋转问题,iphone,uiview,core-graphics,Iphone,Uiview,Core Graphics,我对CAAffineTransformationMakeRotation有问题。我试图在ViewDidLoad中将UIView旋转22.5度,延迟1秒后,视图飞入屏幕 代码是: -(void)ViewDidiLoad{ imgView1 = [[UIView alloc] initWithFrame:CGRectMake(20,150,.1,400)]; [imgView1 setBackgroundColor:[UIColor blackColor]]; [self.view add

我对CAAffineTransformationMakeRotation有问题。我试图在ViewDidLoad中将UIView旋转22.5度,延迟1秒后,视图飞入屏幕

代码是:

-(void)ViewDidiLoad{

imgView1 = [[UIView alloc] initWithFrame:CGRectMake(20,150,.1,400)];
    [imgView1 setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:imgView1];
CGAffineTransform trans = CGAffineTransformMakeRotation(3.14159/8);
imgView1.transform = trans;

[self performSelector:@selector(img1_enter) withObject:nil afterDelay:1];
 } 


 -(void)img1_enter{
CGRect frame = [imgView1 frame];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2.99];
frame.origin.x = 550;
[UIView commitAnimations];


[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2.99];
[imgView1 setFrame :frame];
[UIView commitAnimations];
}   
问题是当这个视图飞入时,它的宽度和高度会改变。我尝试过不旋转视图(即不进行仿射变换),它可以正常工作


是否有其他方法旋转视图???

您可以合并现有的变换以分别保留当前大小和纵横比:

imgView1.transform = CGAffineTransformConcat(trans, imgView1.transform);

UIView类的文档还指出,如果变换不是标识变换,则框架属性是未定义的,因此在应用旋转后不得使用它。

可以合并现有变换以保留当前大小和纵横比:

imgView1.transform = CGAffineTransformConcat(trans, imgView1.transform);

UIView类的文档还指出,如果变换不是标识变换,则框架属性是未定义的,因此在应用旋转后不得使用它。

框架矩形表示视图在其superview坐标系内的位置和大小。边界矩形表示视图的内部坐标系,因此边界矩形在某种程度上负责视图的实际像素数量(分别是列和行的数量)

如果contentMode设置为
UIViewContentModeRedraw
,并且您更改了框架矩形,则边界矩形的大小将自动调整为适合框架矩形的大小,反之亦然,否则边界矩形将保持不变。对于渲染,帧矩形和边界矩形之间的差异由自动创建的变换矩阵进行补偿

最后两句话是正确的,如果视图的变换属性是单位矩阵。如果不是,则框架属性无效,只有您负责提供从视图坐标系到其超级视图坐标系的正确转换。因此,如果要应用旋转,还必须应用适当的平移和缩放,以获得相对于超级视图坐标的视图

因此,在本例中,可以将边界矩形设置为
CGRectMake(-width/2,-height/2,width,height)
,并将其变换设置为

CGAffineTransformConcat(
    CGAffineTransformMakeRotation(angle),
    CGAffineTransformMakeTranslation(x, y)
)

,其中x和y是视图在其超级视图坐标系内的中心坐标。

框架矩形表示视图在其超级视图坐标系内的位置和大小。边界矩形表示视图的内部坐标系,因此边界矩形在某种程度上负责视图的实际像素数量(分别是列和行的数量)

如果contentMode设置为
UIViewContentModeRedraw
,并且您更改了框架矩形,则边界矩形的大小将自动调整为适合框架矩形的大小,反之亦然,否则边界矩形将保持不变。对于渲染,帧矩形和边界矩形之间的差异由自动创建的变换矩阵进行补偿

最后两句话是正确的,如果视图的变换属性是单位矩阵。如果不是,则框架属性无效,只有您负责提供从视图坐标系到其超级视图坐标系的正确转换。因此,如果要应用旋转,还必须应用适当的平移和缩放,以获得相对于超级视图坐标的视图

因此,在本例中,可以将边界矩形设置为
CGRectMake(-width/2,-height/2,width,height)
,并将其变换设置为

CGAffineTransformConcat(
    CGAffineTransformMakeRotation(angle),
    CGAffineTransformMakeTranslation(x, y)
)

,其中x和y是视图在其超级视图坐标系内的中心坐标。

他们说如果使用CGAffineTransformation,则应使用边界而不是框架。。你能告诉我怎么用吗?对不起,我对发生的事情有错误的理解。我刚刚发布了一个新的答案,它应该澄清边界/框架/转换的实际工作原理。他们说如果你使用CGAffineTransformation,那么你应该使用边界而不是框架。。你能告诉我怎么用吗?对不起,我对发生的事情有错误的理解。我刚刚发布了一个新的答案,它应该澄清边界/框架/转换的东西实际上是如何工作的。非常感谢你澄清我的疑问。。。。事实上,你的第一个答案帮了我的忙..我稍微改变了我的方法,然后使用了你的代码,它成功了..)因此,我将其标记为适当的答案:)再次感谢……)非常感谢你澄清我的疑问。。。。事实上,你的第一个答案帮了我的忙..我稍微改变了我的方法,然后使用了你的代码,它成功了..)因此,我将其标记为适当的答案:)再次感谢……)