iOS中具有自动布局的可伸缩页眉
伸缩头很酷。 人们熟悉更改框架以实现此目的,例如“设计拆解:可伸缩页眉”。 但是通过自动版式,我们可以使用更好的声明性约束来实现
演示项目为StretchyHeader
我使用SnapKit来明确我们需要哪些约束
scrollView
应该将其4个边固定到ViewController 's view
func setupScrollView(){
scrollView = UIScrollView()
scrollView.delegate =自我view.addSubview(scrollView)
scrollView.snp_makeConstraints {制造
make.edges.equalTo(view)
}
}
scrollViewContentView
必须将其4个边固定到scrollView
以帮助确定scrollViewcontentSize
scrollViewContentView
的高度由其子视图确定。 里面的子视图必须将其top
和bottom
到scrollViewContentView
func setupScrollViewContentView(){
scrollViewContentView = UIView()scrollView.addSubview(scrollViewContentView)
scrollViewContentView.snp_makeConstraints {
make.edges.equalTo(scrollView)
make.width.equalTo(view.snp_width)
}
}
header
必须将其顶部固定到scrollView
父级,即ViewController 's view
阅读title
部分,您将看到为了使header
伸缩性,必须将其固定在顶部和底部
但是如果我们向上滚动,这些固定的top
和bottom
约束之间将存在约束冲突
因此,我们必须将headerTopConstraint
优先级声明为999,并且headerLessThanTopConstraint
func setupHeader(){
标头= UIImageView()
header.image = UIImage(named:“ onepiece”)! scrollViewContentView.addSubview(header)
header.snp_makeConstraints {
//将header固定到scrollView的父级,现在是ViewController的视图
//当header向上移动时,headerTopConstraint不够,因此将其优先级设为999,并添加另一个小于或等于约束
make.leading.trailing.equalTo(scrollViewContentView)
self.headerTopConstraint = make.top.equalTo(view.snp_top).priority(999).constraint
self.headerLessThanTopConstraint = make.top.lessThanOrEqualTo(view.snp_top).constraint
}
}
title
必须将其顶部固定在scrollViewContentView
以帮助确定scrollViewContentView
高度
title
还必须将其顶部固定在header
底部,以使header
伸缩性
func setupTitleLabel(){
titleLabel = UILabel()
titleLabel.numberOfLines = 0
titleLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleTitle1)
titleLabel.text =“一件” scrollViewContentView.addSubview(titleLabel)
titleLabel.snp_makeConstraints {
make.leading.equalTo(scrollViewContentView).offset(20)
make.trailing.equalTo(scrollViewContentView).offset(-20)
//固定到标题以使其具有伸缩性
make.top.equalTo(header.snp_bottom).offset(20)
//固定到内容视图以帮助确定scrollView contentSize
make.top.equalTo(scrollViewContentView.snp_top).offset(headerHeight)
}
}
除非您对其进行调整,否则标题始终固定在顶部,在此处为scrollViewDidScroll
在这里,我使用Constraint
,它是SnapKit
一个类,但其想法是更改NSLayoutConstraint
的constant
。
func scrollViewDidScroll(scrollView:UIScrollView){
守护让headerTopConstraint = headerTopConstraint,
headerLessThanTopConstraint = headerLessThanTopConstraint
其他{
返回
令y = scrollView.contentOffset.y
让offset = y> 0? -y:0 headerLessThanTopConstraint.updateOffset(offset)
headerTopConstraint.updateOffset(offset)
}
顺便说一句,您是否刚刚学习了一件作品的故事:]
- 使用约束在UIScrollView上创建视差效果
- 滚动视图视差
原始故事https://github.com/onmyway133/blog/issues/27