【问题标题】:View at the bottom in a UIScrollView, with AutoLayout在 UIScrollView 的底部查看,带有 AutoLayout
【发布时间】:2018-11-23 15:32:53
【问题描述】:

我正在使用自动布局在滚动视图中设置内容。滚动视图中的对象从上到下固定在前一个对象上,因此它们在彼此之下。我在这些对象下方添加了一个页脚视图。

这里有个问题:当内容很少时,contentView 会小于屏幕高度,因此页脚视图会出现在屏幕中间的某个位置(这是正常行为)。但我想阻止这种情况,并使视图保持在底部的某个位置。

换句话说,我想设置一个双重约束,例如:

Put this view below all the objects in the scrollview 
AND
keep this view at a distance of max [some number] of the bottom of the screen

以始终满足两个约束的方式:

  • 如果内容的高度大于屏幕,则向下滚动后视图显示在底部
  • 如果高度较小,则视图被“固定”到屏幕底部,在内容底部和视图顶部之间留出相对较大的空间

如何使用 AutoLayout 实现这一点?

【问题讨论】:

  • 查看我对仅自动布局解决方案的回答。

标签: ios swift autolayout constraints


【解决方案1】:

仅使用自动布局相当容易...无需代码。

关键是使用“内容视图”来保存元素,并在“底部”元素和“页脚”视图之间使用greater-than-or-equal 约束。

在这张图片中,黄色是主视图,绿色是滚动视图,蓝色是内容视图,标签是灰色,页脚视图是粉红色。

  • 从一个全新的视图控制器开始
  • 添加滚动视图,普通约束(我一直使用20,所以我们可以看到框架)
  • 向滚动视图添加UIView - 这将是我们的“内容视图”
  • 将 contentView Top/Bottom/Leading/Trailing 全部等于 0 约束到 scrollView
  • 将 contentView 的 Width 和 Height 都约束为 scrollView 的值
  • 添加您的元素 - 我在这里使用了 3 个标签
  • 像往常一样约束标签...我用过:
    • LabelA - 顶部/前导/尾随全部位于20,与60 的LabelB 的垂直间距
    • LabelB - 在20 的前导/尾随,与60 的LabelC 的垂直间距
    • LabelC - 在20 前导/尾随
  • LabelC 也设置为 Number of Lines: 0,因此它将扩展为多行文本
  • 添加UIView 作为“页脚视图”(我在其中贴了一个标签)
  • 将footerView Leading/Trailing/Bottom 全部限制在20(以便我们可以看到框架)
  • 要么在footerView上设置一个高度约束,要么使用它的内容来约束它的高度
  • 从LabelC到footerView添加一个Vertical Spacing约束,设置为>= 40
  • 最后一步,将contentView的Height约束改为Priority: 250

现在,当您扩展/收缩 LabelC 的高度时,footerView 将保持至少 40-pts 的垂直空间。当 LabelC 大到足以将 footerView 推到底部下方时,scrollView 将变为可滚动的。

结果:

【讨论】:

  • 嗯...我认为我没有错过任何步骤...您可以在此处获取我的故事板 - 看看有什么不同,如果有的话:gist.github.com/DonMag/7576d0710163ae4f53f7508c1fed35f6
  • 这正是我想要的。效果很好。非常感谢!
  • 神奇的答案,就像一个魅力;)给那个人一瓶酒?
  • 它也对我有用,很好的答案,易于应用,工作正常。顶部
  • 由精心制作的图像支持的教科书解释。非常感谢!
【解决方案2】:

你需要检查 scrollView 的 ContentSize 并使用所需的 Value 修改 FooterView Top Constraint

我的班级代码

import UIKit

class scrollViewDrag: UIViewController
{
    /// ScrollView Outlet
    @IBOutlet weak var mainScrollView: UIScrollView!

    /// Footer View top spacing constraint
    @IBOutlet weak var footerViewTopConstraint: NSLayoutConstraint!

    /// Used for ScrollView Height
    var screenHeight = CGFloat()

    /// Did Load
    override func viewDidLoad() {
        super.viewDidLoad()

    }

    /// Function used to check for height 
    func checkForHeight(){
        /// Get scrollView Height
        screenHeight = mainScrollView.frame.size.height

        /// Check contentSize Height ?
        if mainScrollView.contentSize.height >= screenHeight {
            /// When ScrollView is having height greater than your scrollView Height
            /// Footer will scroll along other Views
        }
        else{
            /// Issue Case
            let spacingValue = screenHeight-mainScrollView.contentSize.height
            footerViewTopConstraint.constant = spacingValue
        }
    }

    /// Call the height function in DidAppear
    override func viewDidAppear(_ animated: Bool) {
        checkForHeight()
    }
}

故事板

我使用了等高的四个视图,最后一个 footerView 被附加为第四个视图

FooterView 顶部约束

顶部约束用作footerViewTopConstraint

输出

案例 1 - Size 大于 scrollView 高度

案例 2 - 预期输出

【讨论】:

  • 这确实有效!虽然我认为有一种方法可以仅使用约束来实现这一目标,而无需手动计算。
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多