我的应用程序建立在 UIScrollview 上,带有 UIImageView 子视图和各种其他子视图。当我旋转到横向时,我会更改滚动视图的 contentSize 并按比例调整图像视图的大小以利用增加的水平宽度。这意味着高度也会增加以保持比例。
我的问题是,在显示的蓝色子视图的情况下,我需要做些什么来重新定位它,使其在旋转后保持相对位置,因为它的超级视图不再是相同的大小?我已经尝试过 convertRect:toView: 和 converPoint:toView:,但我似乎无法完全正确。
我的应用程序建立在 UIScrollview 上,带有 UIImageView 子视图和各种其他子视图。当我旋转到横向时,我会更改滚动视图的 contentSize 并按比例调整图像视图的大小以利用增加的水平宽度。这意味着高度也会增加以保持比例。
我的问题是,在显示的蓝色子视图的情况下,我需要做些什么来重新定位它,使其在旋转后保持相对位置,因为它的超级视图不再是相同的大小?我已经尝试过 convertRect:toView: 和 converPoint:toView:,但我似乎无法完全正确。
你在使用自动布局吗?如果是这样,在许多情况下,明智地使用约束可以使子视图保持在正确的位置和正确的大小,即使您从横向变为纵向也是如此。但是您必须分享更多关于此视图的其他内容的详细信息,以便我们更具体。
如果不使用自动布局,您通常可以设置视图的自动调整大小掩码,以便它移动到适合您的位置。但是在滚动视图子视图的情况下,您可能会让视图控制器响应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) 您的视图中还有哪些其他内容,以及从纵向到横向和背面的变化是否会导致滚动视图的垂直高度发生任何变化。
要重新定位视图,请更新其框架。frame 属性是 CGRect 类型,它是大小 (CGSize) 和原点 (CGPoint) 的组合。如果你的蓝色视图的大小没有改变,那么只有原点应该被更新。
iOS坐标系从左上角开始:
对于您的蓝色视图,您从右下角计算它的起源,即
origin = contentSize - blueViewSize - padding
分别为x
和y
协调执行此操作,使 CGRect 具有更新的原点,并更新蓝色视图的框架。
UP:这是您手动执行的方式,但您可以(并且最好应该)让 UIKit 自动为您重新定位子视图——在 Xcode 的 Interface Builder 和开发人员手册中了解自动调整大小和自动布局