CAAffineTransformationMakeRotation问题

时间:2010-11-30 10:21:07

标签: iphone uiview core-graphics

我遇到CAAffineTransformationMakeRotation问题。 M试图在ViewDidLoad中旋转22.5度的UIView,并在延迟1秒后,View飞入屏幕。

代码是:

-(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];
}   

问题在于,当此视图飞入时,宽度和高度会发生变化。我试过没有旋转View(即没有AffineTransformation),它运行正常。

还有其他方法来旋转View ??

2 个答案:

答案 0 :(得分:1)

您可以合并现有的变换以保留当前大小和宽高比:

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

此外,UIView类的文档说如果转换不是标识转换,则frame属性是未定义的,因此在应用旋转后不得使用它。

答案 1 :(得分:0)

框架矩形表示其超视图坐标系内视图的位置和大小。 bounds-rectangle表示视图的内部坐标系,因此bounds-rectangle对视图的实际像素数量(分别为列数和行数)负责。

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

如果视图的transform-property是单位矩阵,则最后两个句子才为真。如果不是,则frame-property无效,并且您自己负责提供从视图的坐标系到其超视图的坐标系的适当变换。因此,如果要应用旋转,还可以应用适当的平移和缩放,以使视图相对于其超视图的坐标获得所需的视图。

因此,在您的情况下,您可以将bounds-rectangle设置为CGRectMake(-width/2, -height/2, width, height)并将其变换设置为

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

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