UIViewController在UIScrollView中没有为所有iPhone正确调整

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIViewController在UIScrollView中没有为所有iPhone正确调整相关的知识,希望对你有一定的参考价值。

我试图复制一个类似Tinder的菜单,在UIViewControllers中有3个UIScrollView,顶部有一个自定义菜单选项卡,每个UIViewController都有一个按钮。我面临一个有趣的问题,其中UIViewControllers视图完全适合scrollView.frame,但仅适用于iPhone 8.相比之下,对于iPhone SE,它留下了白色边缘,对于iPhone 8+,它似乎重叠了内部的视图scrollView.view。有人可以解释为什么会发生这种情况以及如何解决这个问题?

这是我的代码,我正在调整我的UIViewControllers设置我的UIScrollView

import UIKit

class MainViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var navigationView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpHorizontalScrollViews()
    }

    func setUpHorizontalScrollViews(){

        let view = (
            x: self.view.bounds.origin.x,
            y: self.view.bounds.origin.y,
            width: self.view.bounds.width,
            height: self.view.bounds.height
        )

        let scrollWidth  = 3 * view.width
        let scrollHeight  = view.height
        scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight)
        scrollView.contentOffset.x = view.x

        if let messagesView = self.storyboard?.instantiateViewController(withIdentifier: "MessagesVC") as UIViewController! {
            self.addChildViewController(messagesView)
            self.scrollView.addSubview(messagesView.view)
            messagesView.didMove(toParentViewController: self)
            messagesView.view.frame = CGRect(x: 0,
                                             y: 0,
                                             width: view.width,
                                             height: view.height
            )
        }


        if let friendsView = self.storyboard?.instantiateViewController(withIdentifier: "FriendsVC") as UIViewController! {
            self.addChildViewController(friendsView)
            self.scrollView.addSubview(friendsView.view)
            friendsView.didMove(toParentViewController: self)
            friendsView.view.frame = CGRect(x: view.width,
                                            y: 0,
                                            width: view.width,
                                            height: view.height
            )
        }


        if let settingsView = self.storyboard?.instantiateViewController(withIdentifier: "SettingsVC") as UIViewController! {
            self.addChildViewController(settingsView)
            self.scrollView.addSubview(settingsView.view)
            settingsView.didMove(toParentViewController: self)
            settingsView.view.frame = CGRect(x: 2 * view.width,
                                             y: 0,
                                             width: view.width,
                                             height: view.height
            )
        }

        // offset to the second view
        self.scrollView.contentOffset.x = view.width

    }

    override var shouldAutorotate: Bool {
        return false
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

这就是我的安装程序的样子。顶部是MainViewController,包含UIScrollView,底部是3个应该进入scrollView的viewcontrollers。 enter image description here

这就是我想要的样子,以及它在iPhone 8中设置的方式:enter image description here

这就是它在iPhone SE上的样子,我的问题是:

enter image description here

答案

问题是因为你在setUpHorizontalScrollViews中调用viewDidLoad()方法,所以UIViewController还没有布局子视图,还计算它们的最终大小。

它在iPhone 8中工作,因为最有可能的是它具有您在界面构建器中使用的相同屏幕尺寸。

解决方案1

为了解决这个问题,您可以将代码移动到viewDidAppear()方法。但是,一旦打开UIViewController,这将导致丑陋的效果(除非您添加全屏加载)。

解决方案2

像这样添加view.layourIfNeeded()

override func viewDidLoad() {
    super.viewDidLoad()
    view.layourIfNeeded()
    setUpHorizontalScrollViews()
}

以上是关于UIViewController在UIScrollView中没有为所有iPhone正确调整的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 中的两个 UIviewControllers - 如何在它们之间调用方法

UIScroll 中心图像

何时使用 UITouch 与 UIScroll

UIScroll 视图 + UIView + UITableview 问题

容器视图和滚动视图呈现偏移的表示

UIScroll 及其嵌套元素