iOS:自动布局的问题。模拟器结果随着情节提要的变化而变化

Posted

技术标签:

【中文标题】iOS:自动布局的问题。模拟器结果随着情节提要的变化而变化【英文标题】:iOS: A Issue with Auto Layout. Simulator Result Changes As Storyboard Changes 【发布时间】:2017-12-16 00:17:38 【问题描述】:

我正在制作我的第一个 ios 应用。我遇到了自动布局和滚动视图的问题。所以现在我在主故事板上有一个滚动视图。滚动视图应该占据整个屏幕。我还有其他三个 xib 文件。每一个都是滚动视图中的一个页面。所以我可以实现类似可滚动演练的东西。我现在的问题是。如果我改变主情节提要的大小,我从模拟器得到的结果会有所不同。

此外,当应用程序加载时,它不会立即在屏幕上显示我拥有的内容。它只会显示纯黑色背景。我需要先在屏幕上滚动,然后所有的文字、图像都会显示出来。我也不确定出了什么问题。我的主故事板没有背景颜色。这可能与上述问题有关吗?


第一个问题的一些例子,如果我将我的主故事板更改为 iPhone Plus 大小。模拟器将显示 iPhone Plus 设备的正确尺寸,但不适用于普通 iPhone 和 iPhone X。如下图所示。

如果我将故事板更改为常规 iPhone 尺寸。 iPhone 8 将显示正确的尺寸,但 plus 和 X 将关闭。

这就是我为滚动视图设置约束的方式。

这就是我在代码中设置单个 xib 和滚动视图的方式。

override func viewDidLoad() 
    super.viewDidLoad()

    //Set up individual view for scroll view

    let xOrigin = self.view.frame.width

    creditScreen = CreditScreenView(nibName: "CreditScreenView", bundle: nil)

    mainScroll.addSubview(creditScreen.view)

    forWeather = ForcastScreenView(nibName: "ForcastScreenView", bundle: nil)

    mainScroll.addSubview(forWeather.view)

    nowWeather  = NowScreenView(nibName: "NowScreenView", bundle: nil)

    mainScroll.addSubview(nowWeather.view)

    //mainScroll.translatesAutoresizingMaskIntoConstraints = true

    // set up the size for each view
    creditScreen.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)

    forWeather.view.frame = CGRect(x: xOrigin, y: 0, width: self.view.frame.width, height: self.view.frame.height)

    nowWeather.view.frame = CGRect(x: xOrigin * 2, y: 0, width: self.view.frame.width, height: self.view.frame.height)

    mainScroll.contentSize = CGSize(width: CGFloat(view.frame.width * 3), height: CGFloat(view.frame.height))
    mainScroll.contentOffset.x = view.frame.width * 3

    mainScroll.setContentOffset(CGPoint(x: view.frame.width * 2, y: 0), animated: true)

    //Set up the location manager here.
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()



我不确定是什么导致了问题,也许是我设置 xib 的方式?当我搜索这个问题时,有人建议在主故事板中放置一个视图作为***视图,然后将滚动视图放在该***视图中。它对我不起作用。有人可以帮助解决这个问题吗?谢谢!

这里是源代码的 GitHub,以备不时之需。 https://github.com/lucky13820/air

【问题讨论】:

请编辑您的问题以包含实际代码或代码截图 @Paulw11 我用实际代码替换了屏幕截图。我应该添加更多代码吗?我认为这些是唯一与布局相关的代码。我做了故事板中的所有约束。 【参考方案1】:

要回答您的黑屏问题,请使用此代码

mainScroll.setContentOffset(CGPoint(x: view.frame.width * 2, y: 0), 动画:真)

以正确的比例将其向右移动,我已经在 iPhone 8、8 plus 和 X 中进行了测试。

【讨论】:

【参考方案2】:

经过更多研究和反复试验,我修复了它。

我添加了两行代码,并在属性检查器中关闭了滚动视图的自动调整大小子视图。

mainScroll.contentSize = CGSize(width: CGFloat(xOrigin * 3), height: CGFloat(self.view.frame.height))

mainScroll.translatesAutoresizingMaskIntoConstraints = true

谢谢大家。

【讨论】:

以上是关于iOS:自动布局的问题。模拟器结果随着情节提要的变化而变化的主要内容,如果未能解决你的问题,请参考以下文章

修改已经使用自动布局布局的情节提要

在 ios 中使用情节提要添加滚动视图

@IBDesignable 错误:无法更新自动布局状态

UICollectionView 自动布局约束正在打破

无法在情节提要中启用自动布局

UIScrollView 不能使用情节提要垂直滚动(使用自动布局)?