以编程方式在 UIScrollView 中居中子视图

Posted

技术标签:

【中文标题】以编程方式在 UIScrollView 中居中子视图【英文标题】:Centering a sub view in UIScrollView programmatically 【发布时间】:2017-10-01 07:56:15 【问题描述】:

我在 SO 上看到一堆类似的问题,但没有一个能解决我的问题。

我正在添加一个UIView 作为UIScrollView 的子视图。 UIView 有 3*scrollView.width 和 3*scrollView.height。所以我相应地设置了UIScrollViewcontentSize。当应用程序启动时,我希望 scrollView 窗口位于 subView 的中间,类似这样 --

          -------------------
          |                 |
          |    ________     | 
          |    |      |     |   
          |    |      |     |
          |    -------      |
          |                 |
          -------------------

内部窗口应该是scrollView,也是用户在应用启动时看到的UIView 的一部分。但是,我无法做到这一点。 scrollView 始终设置为原点 (0,0)

我这样做了 -

let margins = view.layoutMarginsGuide
scrollView.leftAnchor.constraint(equalTo: margins.leftAnchor).isActive = true
scrollView.rightAnchor.constraint(equalTo: margins.rightAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: 0).isActive = true
scrollView.topAnchor.constraint(equalTo: margins.topAnchor).isActive = true

scrollView.center = self.view.center // view is the base view of which scrollView is a subview of. 
subView.leftAnchor.constraint(equalTo: scrollView.leftAnchor, constant: -1*scrollView.frame.width)
subView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: -1*scrollView.frame.height)

【问题讨论】:

【参考方案1】:

据我了解,您在其中有 UIScrollViewUIView 并滚动内容大小为视图高度/宽度的 3 倍,当应用启动时,您需要滚动的中心。

在这种情况下,我尝试使用情节提要尽可能地关闭,所以我做了什么,

    添加了 UIScrollView 和约束

Top 空间到 SuperView,Trailing 到 SuperView,LeadingBottom 到 superView。

    UIScrollView 内添加了 UIView 并带有约束。

Top 空间到 SuperView,Trailing 到 SuperView,LeadingBottom 到 superView 与 Height and Width 等于 UIView (that we have on top of UIScrollView),乘数为 3。

这就是故事板的全部内容,现在我们唯一需要设置的就是setContentOffsetUIScrollView 像这样。

override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)

        let contentOffsetX = (scrollView.contentSize.width/2) - (view.bounds.width/2)
        let contentOffsetY = (scrollView.contentSize.height/2) - (view.bounds.height/2)

        scrollView.setContentOffset(CGPoint(x: contentOffsetX, y: contentOffsetY), animated: true)
    

我们完成了。我希望它会帮助你。 你也可以在Github.com找到代码库

快乐学习。

【讨论】:

啊,谢谢。我需要在 scrollView 上正确设置 contentOffset。那就是解决我的问题。非常感谢您花时间在 github 上发布代码。

以上是关于以编程方式在 UIScrollView 中居中子视图的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 中居中子视图

如何在 UIView 中居中子视图?

在具有较大 contentSize 的 UIScrollView 中居中 UIImageView

如何以编程方式控制 Android AbsoluteLayout 中子视图的大小

具有水平分页的 UIScrollView 不居中子视图

在 UIScrollView 中居中 UIButtons