【问题标题】:Maintaining subview relative location after rotation旋转后保持子视图相对位置
【发布时间】:2013-11-11 21:21:55
【问题描述】:

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

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

【问题讨论】:

  • 要回答这个问题,我想我们需要知道您是否打算在旋转后调整蓝色正方形的大小(您保持内容区域成比例,但正方形按比例缩小) .

标签: ios ipad uiscrollview rotation subview


【解决方案1】:

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

iOS坐标系从左上角开始:

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

origin = contentSize - blueViewSize - padding

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

UP:这是您手动执行的方式,但您可以(并且最好应该)让 UIKit 自动为您重新定位子视图 - 了解 Xcode 的 Interface Builder 中的自动调整大小和自动布局,以及Developer manuals

【讨论】:

    【解决方案2】:

    您是否使用自动布局?如果是这样,在许多情况下,明智地使用约束可以使子视图保持在正确的位置和正确的大小,即使从横向变为纵向也是如此。但是您必须分享更多关于此视图的其他内容的详细信息,以便我们更具体。

    如果不使用自动布局,您通常可以设置视图的自动调整大小掩码,以便它移动到适合您​​的正确位置。但是在滚动视图子视图的情况下,您可能会让视图控制器响应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) 您的视图中还有哪些其他内容,以及从纵向到横向和背面的变化是否会导致滚动视图的垂直高度发生任何变化。

    【讨论】:

    • 我按照您的建议添加了代码,并在 willAnimateRotationToInterfaceOrientation 中添加了一些 NSLog 语句:我确实看到原点现在正在改变,但视图似乎仍在同一位置。蓝色子视图是 uiscrollview 的子视图,我调用 layoutsubviews。不知道为什么它不动?
    • @skantner 我是否推断您没有使用自动布局?在这种情况下,我可能只回复viewWillLayoutSubviews,这是您对frame 坐标等进行最后一分钟调整的机会。请参阅修改后的答案中的代码示例。
    • 你说得对,我没有使用自动布局。我的应用程序早于它,我从未转换过。你的方法本质上是我需要做的。我做了一些粗略的测试,我可以看到它会起作用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2017-11-14
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多