旋转后维护子视图的相对位置

时间:2013-10-31 18:16:24

标签: ios ipad uiscrollview rotation subview

Figure 1

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

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

2 个答案:

答案 0 :(得分: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)您是否使用autolayout的细节而有所不同; (b)您是否以编程方式创建此子视图; (c)您在视图中拥有的其他内容以及从纵向到横向和背面的更改是否会导致滚动视图的垂直高度发生任何变化。

答案 1 :(得分:0)

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

iOS坐标系从左上角开始:

ios coordinate system

对于蓝色视图,您可以从右下角计算它的原点,即

origin = contentSize - blueViewSize - padding

xy坐标单独执行此操作,使CGRect更新原点,并更新蓝色视图的框架。

UP:这是你手动操作的方法,但你可以(并且应该)让UIKit自动为你重新定位子视图 - 在Xcode的Interface Builder中了解自动调整和自动布局,以及Developer manuals