移动到变换视图时保持原始视图方向

时间:2012-05-29 15:37:31

标签: ios uiview cgaffinetransform

enter image description here

enter image description here

enter image description here

在图1中,我有一个名为parentView1的UIView(它是灰色视图)。它有子视图(图中的4)。

在我将CGAffineTransformRotate应用于parentView1之前,我可以拖动一个视图(红色垂直)并放入parentView1,结果如图2所示。

但是,如果我首先在parentView1上执行CGAffineTransformRotate(请参阅代码),然后拖放以将红色垂直视图添加到parentView1中,红色垂直视图也会立即旋转到与parentView1相同(图3)当我放下垂直视图。我不希望它发生。我需要红色垂直视图在被拖走之前以与原始方向相同的方向放置。

反过来也会发生相同的效果:如果已旋转parentView1,则将子视图从parentView1移动到其边界外。

有什么建议吗?

旋转parentView1的代码:

self.parentView1.transform = CGAffineTransformRotate(self.parentView1.transform, degreesToRadians(45));

将视图从父级移动到另一级的代码:

-(void)getNewPosition2:(UIView *)viewToConvert parentView:(UIView *)parentViewx superParentView:(UIView *)superParentView
{
    CGPoint newPoint = [superParentView convertPoint:viewToConvert.center fromView:parentViewx];
//    viewToConvert.layer.position = newPoint;
    viewToConvert.center = newPoint;
    [viewToConvert removeFromSuperview];
    [superParentView addSubview:viewToConvert];
}

调用上面的getNewPostition2方法:

[self getNewPosition2:recognizer.view parentView:self.view superParentView:self.parentView1];

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案,使用parentView1的变换矩阵计算两种情况的角度:将对象移入和移出parentView1。

将对象移动到parentView1:

float angle = (2 * M_PI) - atanf(self.parentView1.transform.b / self.parentView1.transform.a );
viewToConvert.transform = CGAffineTransformRotate(viewToConvert.transform, angle);

将对象移出parentView1:

float angle = atanf(self.parentView1.transform.b / self.parentView1.transform.a);
viewToConvert.transform = CGAffineTransformRotate(viewToConvert.transform, angle);