如何将视图从容器视图内移动到另一个容器视图内?

时间:2012-06-26 03:15:12

标签: iphone ios uiview nested coordinates

我有一个主要观点。 内部主视图是两个容器视图:按钮容器和显示容器。 每个容器内部分别是按钮和显示字段。

简而言之,我有三个级别的视图:main,sub(容器)和sub-sub(按钮和字段)。

按下按钮时,我想要将该按钮的图像从按钮区域设置为显示区域。也就是说,我需要将它向上移动两级,然后再降低两级。

目前,我正在按钮顶部创建一个与自定义按钮的UIImage相同的UIImage。我移动它,然后在动画结束时将其销毁,所以我不必改变实际的按钮(我想保留它以便我可以重复使用它)。

显然我可以获得这个UIImageView的中心/边界/框架。

但是,我无法确定目的地的坐标。框架和中心是相对于superview,但这只是一个级别。好像有很多数学要做,以便将正确的X和Y偏移加起来到达目的地。

这是UIView的convertRect:toView:还是convertRect:fromView:?我很难确定如何使用它们,或者决定它们是否真的是正确的使用方法。

似乎是一个常见的问题 - 将某些东西从一个“嵌套”视图移动到另一个“嵌套”视图 - 但我已经搜索过但无法找到答案。

1 个答案:

答案 0 :(得分:0)

那些convertRect方法很难掌握。您的视图包含两个子视图subA和subB,subA包含一个按钮,您想要设置从subA移动到subB的按钮的动画。让我们在具有主视图的视图控制器中进行动画....

// subA is the receiver.  that's the coordinate system we care about to start
CGRect startFrame = [subA convertRect:myButton.frame toView:self.view];

// this is the frame in terms of subB, where we want the button to land
CGRect endFrameLocal = CGRectMake(10,10,70,30);
// convert it, just like the start frame
CGRect endFrame = [subB convertRect:endFrameLocal toView:self.view]; 

// this places the button in the identical location as a subview of the main view
// changing the button's parent implicitly removes it from subA
myButton.frame = startFrame;
[self.view addSubview:myButton];

// now we can animate in the view controller's view coordinates
[UIView animateWithDuration:1.0 animations:^{
    myButton.frame = endFrame;  // this frame in terms of self.view
} completion^(BOOL finished) {
    myButton.frame = endFrameLocal;  // this frame in terms of subB
    [subB addSubview:myButton];
}];