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的高度由其子视图确定。 里面的子视图必须将其topbottomscrollViewContentView

  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伸缩性,必须将其固定在顶部和底部

但是如果我们向上滚动,这些固定的topbottom约束之间将存在约束冲突

因此,我们必须将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一个类,但其想法是更改NSLayoutConstraintconstant

  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