2013-10-31 60 views
0

Figure 1维护子视图相对位置

我的应用程序是建立在有一个UIImageView子视图和其他各种子视图一个UIScrollView。当我旋转到横向时,我更改滚动视图的contentSize并按比例调整图像视图的大小以利用增加的横向宽度。高度的增加意味着保持比例。

我的问题是,在显示蓝色子视图的情况下,我需要做些什么来重新定位它,以便它在旋转后保持它的相对位置,因为它的超级视图不再是相同的大小?我已经尝试过convertRect:toView:和converPoint:toView :,但我似乎无法完全正确。

+0

为了回答这个问题,我想我们需要知道你是否打算在轮换之后调整蓝色方块的大小(保持内容区域按比例,但平方比例在横向上比例较小)。 – hatfinch

回答

1

您在使用自动布局?如果是这样,在许多情况下,即使在从风景转向纵向的情况下,明智地使用约束也可以将该子视图保留在正确的位置和正确的大小。但是你必须分享更多关于这个观点的更多细节,让我们更具体。

如果不使用自动布局,通常可以设置视图的自动调整掩码,以便它移动到正确的位置。但是,在一个滚动视图子视图的情况下,你可能有你的视图控制器可以到viewWillLayoutSubviews响应,更新滚动视图的contentSize和子视图的frame移动,因此:

- (void)viewWillLayoutSubviews 
{ 
    // update the contentSize of the scroll view for the width of the root view, but I'm assuming the 
    // height won't change 

    self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.scrollView.contentSize.height); 

    // adjust the frame of the subview you want to move so that it is a certain offset from the bottom 
    // left corner of the scroll view's `contentSize` (in this case, 10 points from bottom, 10 points from right) 

    self.subviewToMove.frame = CGRectMake(self.scrollView.contentSize.width - self.subviewToMove.frame.size.width - 10, 
              self.scrollView.contentSize.height - self.subviewToMove.frame.size.height - 10, 
              self.subviewToMove.frame.size.width, self.subviewToMove.frame.size.height); 
} 

的细节有所不同根据(a)您是否使用自动布局的细节; (b)是否以编程方式创建子视图;和(c)您在视图中看到的其他内容以及从纵向到横向和背面的更改是否导致滚动视图的垂直高度发生任何更改。

+0

我按照你的建议添加了代码,并在willAnimateRotationToInterfaceOrientation中添加了一些NSLog语句:我确实看到原点现在正在改变,但视图看起来仍然在同一位置。蓝色子视图是uiscrollview的子项,我确实调用了layoutsubviews。无法弄清楚为什么它不移动? – skantner

+0

@skantner我推断你没有使用自动布局?在这种情况下,我可能只是回应'viewWillLayoutSubviews',这是您对'frame'坐标等进行最后一刻调整的机会。查看修订答案中的代码示例。 – Rob

+0

你是对的,我没有使用自动布局。我的应用程序早于它,我从来没有转换。你的方法基本上是我需要做的。我做了一些粗略的测试,我可以看到它会起作用。谢谢! – skantner

0

要重新定位视图,请更新其框架。框架属性的类型是CGRect,它是大小(CGSize)和原点(CGPoint)的组合。如果蓝色视图的大小没有改变,那么只有原点应该更新。

的iOS坐标系统从左上角开始:

ios coordinate system

对于你的蓝视你算算这是从右下角的起源,那就是

origin = contentSize - blueViewSize - padding 

单独做此xy坐标,使CGRect具有更新的原点,并更新蓝色视图的框架。

UP:这是你如何做手工,但你可以(和更好的应该)让UIKit的自动重新定位子视图为你 - 了解在Xcode的界面生成器自动尺寸和自动布局和Developer manuals