使用AutoLayout

时间:2018-06-13 23:17:48

标签: ios swift autolayout constraints

我在自动布局的滚动视图中设置内容。滚动视图中的对象从上到下固定到前一个对象,因此它们在另一个之下。我有一个页脚视图,最后添加到这些对象下面。

这里有一个问题:当内容很少时,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实现这一目标?

2 个答案:

答案 0 :(得分:13)

仅使用自动布局非常容易...无需代码。

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

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

enter image description here

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

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

结果:

enter image description here enter image description here enter image description here

答案 1 :(得分:1)

您需要检查scrollView的ContentSize并使用所需的值修改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()
    }
}

<强>故事板

enter image description here

我使用了具有相等高度的四视图并且最后将一个footerView附加为第四视图

FooterView Top Constraint

enter image description here

用作footerViewTopConstraint

的最高约束

<强>输出

案例1 - 大小大于scrollView Height

enter image description here

案例2 - 预期产出

enter image description here