我在自动布局的滚动视图中设置内容。滚动视图中的对象从上到下固定到前一个对象,因此它们在另一个之下。我有一个页脚视图,最后添加到这些对象下面。
这里有一个问题:当内容很少时,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实现这一目标?
答案 0 :(得分:13)
仅使用自动布局非常容易...无需代码。
关键是使用“内容视图”来保存元素,并在“底部”元素和“页脚”视图之间使用greater-than-or-equal
约束。
在此图像中,黄色是主视图,绿色是滚动视图,蓝色是内容视图,标签是灰色,页脚视图是粉红色。
20
,所以我们可以看到框架)UIView
- 这将是我们的“内容视图”0
到scrollView 20
的顶部/前导/尾随,60
的LabelB的垂直间距20
的领先/尾随,与60
的LabelC的垂直间距20
Number of Lines: 0
,因此它将展开多行文字UIView
作为“页脚视图”(我在其中贴了一个标签)20
约束footerView前导/尾随/底部(所以我们可以看到框架)>= 40
Priority: 250
现在,当你扩展/收缩LabelC的高度时,footerView将保持至少 40-pts的垂直空间。当LabelC变得足够大以“推”底部下方的footerView时,scrollView将变为可滚动。
结果:
答案 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()
}
}
<强>故事板强>
我使用了具有相等高度的四视图并且最后将一个footerView附加为第四视图
FooterView Top Constraint
用作footerViewTopConstraint
<强>输出强>
案例1 - 大小大于scrollView Height
案例2 - 预期产出