【问题标题】:Swift - Child UIView in UIScrollview not showing until after rotationSwift - UIScrollview 中的子 UIView 直到旋转后才显示
【发布时间】:2015-10-18 02:01:53
【问题描述】:

在使用自动布局构建基本 UIScrollView 示例时,我遇到了一些奇怪的行为。

在 Storyboard 编辑器中,我添加了一个 UIScrollView 作为默认 UIView 的子项,并在其中添加了一个新 UIView 并将其命名为 contentView:

查看

--滚动视图

----内容视图

我在 contentView 中添加了一些标签和文本框,并将它们的约束设置为父容器(contentView)。

我还将 contentView 的约束设置为 UIScrollView,将 UIScrollView 设置为其父级,最后将 contentView 设置为使用与顶级 UIView 相同的高度和宽度。添加约束后,关于缺少约束的所有错误或警告都消失了,屏幕在 Storyboard 编辑器中看起来完全符合我的要求。

为了便于故障排除,我将主视图着色为蓝色,将 UIScrollView 着色为黄色,并将 contentView 着色为绿色。

当我在模拟器或真机上运行应用程序时,文本字段缩小而不是 200 宽,标签 3 及其文本框丢失(很可能在屏幕外)并且屏幕为黄色,表示 UIScrollView 是正在显示。一旦我旋转屏幕,一切看起来都和它应该的完全一样:

Gifycat image link as I can't post images yet

打印出框架的宽度:

  • 视图宽度:320.0
  • scrollView 宽度:240.0
  • contentView 宽度:240.0

我已经使用 Xcode 6.4 和 7.0 beta 4 在 Swift 1 和 2 中复制了这种行为。

【问题讨论】:

  • 我认为你需要在 UIScrollView 上对其父视图进行约束
  • 抱歉,我错过了描述中的那部分,现在将对其进行编辑,因为 UIScrollview 确实对其父级有限制
  • 这真的是你如何设置约束的问题,你有没有约束宽度和水平约束?有时,从最少的数量开始并“向上”工作是最容易的
  • @thefredelement 为 UIScrollView 我设置了尾随空间、前导空间、底部空间和顶部空间的约束到它的父级。对于 contentView,我将它的父级(scrollView)设置为相同,但也将它的宽度和高度设置为等于顶层视图的宽度和高度
  • 需要定义滚动视图内部的视图,以便滚动视图知道它必须滚动什么。这将是包含您的文本字段的 UIView。我认为您的最后一个 UIView 有点多余,如果您不需要它,我建议将元素直接放入 UIScrollView,尽管它们需要高度和宽度约束

标签: ios iphone swift uiscrollview


【解决方案1】:

所以我设法通过覆盖 viewController.swift 中的 viewDidLayoutSubviews() 函数来修复子 UIView

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let widthConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: parentView.frame.width)

        contentView.addConstraint(widthConstraint)

        let heightConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: parentView.frame.height)
        contentView.addConstraint(heightConstraint)
    }

parentView 是顶级 UIView 的出口,而 contentView 是 UIScrollView 中子 UIView 的出口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-01-28
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多