使用集合视图自定义布局的可伸缩标题动画

最近,我们开始使用新的UX设计进行应用程序外观设计。 任何电子商务应用程序的“产品详细信息页面”都包含类似的信息,并且格式完全相同:

  1. 产品形象居首
  2. 产品特点
  3. 用户评分,相似的推荐产品,上次查看的产品等位于底部

让我们关注当用户拉下集合视图时产品的伸缩图像动画,图像将以某种视觉效果增长,如下所示:

实现方式:

让我们讨论每个步骤:

步骤A:集合视图设置

  1. 分配自定义布局CustomPDPLayout而不是默认的UICollectionViewFlowLayout。 我们将在稍后讨论有关该课程的更多信息。

2.注册单元格和标题视图

  collectionView.register(AttributeCell.self,forCellWithReuseIdentifier:cellId) 
  collectionView.register(PDPHeaderView.self,forSupplementaryViewOfKind:UICollectionView.elementKindSectionHeader,withReuseIdentifier:headerId) 

AttributeCell单元格 )包含一个文本标签, PDPHeaderViewHeader视图 )包含一个图像。

3.使用UICollectionViewDelegateFlowLayout设置单元格大小和Header大小

 私人租用填充:CGFloat = 16 
  //像元大小 
  func collectionView(_ collectionView:UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath)-> CGSize { 
 返回CGSize(width:collectionView.frame.width-2 * padding,height:50) 
  } 
  //标头大小 
  func collectionView(_ collectionView:UICollectionView,layout collectionViewLayout:UICollectionViewLayout,referenceSizeForHeaderInSection部分:Int)-> CGSize { 
 返回CGSize(width:collectionView.frame.width,height:250) 
  } 

4.从collectionViewLayout配置minimumInteritemSpacing,minimumLineSpacing,sectionInset等(您仍然可以使用UICollectionViewDelegateFlowLayout

 如果让layout = collectionViewLayout为?  CustomPDPLayout { 
  layout.minimumLineSpacing = 8 // 2个像元之间的间距 
  layout.sectionInset = UIEdgeInsets(top:padding,left:padding,bottom:padding,right:padding)//将inset添加到该部分 
  } 

其余的收集视图配置,您可以在此处检查源代码:

ashislaha / StretchyHeaderAnimation
让我们在“产品详细信息”页面上创建酷炫的动画效果。 当用户向下滚动时,标题将随着… github.com而变大。

步骤B:配置集合视图的自定义布局:

  1. 有几个layoutAttributes方法可以重写以获取单元格,修饰视图,页眉视图/页脚视图(补充视图)等的自定义效果。

在这里,我们使用的是最通用的一种

 覆盖func layoutAttributesForElements (在CGRect中)-> [UICollectionViewLayoutAttributes]? 

2.从super中提取布局属性

 让layoutAttributes = super.layoutAttributesForElements(in:rect) 

3.遍历每个属性,并确定要修改的属性。 对于我们的情况,我们想要修改Section Header (进行额外的检查,您可以使用indexPath来确定是否要在第1节Header上伸缩或其他)。

  layoutAttributes?.forEach({(attribute)in 

if attribute.representedElementKind == UICollectionView。 elementKindSectionHeader {...}
})

4.确定滚动方向,当用户下拉时拉伸

 守护让collectionView = collectionView else {return} 
 让contentOffsetY = collectionView.contentOffset.y 
 如果contentOffsetY <0 {...} 

5.根据contentOffset设置属性的新框架

 让width = collectionView.frame.width 
  //当contentOffsetY为-ve时,高度将基于contentOffsetY 
 让高度= attribute.frame.height-contentOffsetY 
  attribute.frame = CGRect(x:0,y:contentOffsetY,width:width,height:height) 

并最后返回layoutAttributes。

6.使布局失去新边界,以便重新绘制布局

 覆写func shouldInvalidateLayout(forBoundsChange newBounds:CGRect)-> Bool { 
 返回真 
  } 

就是这样来扩展标题。

步骤C:在下拉集合的同时做一些Header的视觉效果

这是最后一步,我们将在页眉上添加模糊的视觉效果视图,并使用UIViewPropertyAnimator进行一些动画处理

1.在Header View中添加一个UIViewPropertyAnimator属性(该类可对视图进行动画处理并允许对这些动画进行动态修改)以对其进行动画处理。

 动画师= UIViewPropertyAnimator(持续时间:4.0,曲线:.easeInOut,动画:{...}) 

2.将模糊视觉效果视图添加到“标题视图”。

 让blurEffect = UIBlurEffect(style:.regular) 
 让visulaEffectView = UIVisualEffectView(effect:blurEffect) 

3.在Controller中捕获Header视图以修改动画设计器属性。

 私人var headerView:PDPHeaderView? 
 覆盖func collectionView(_ collectionView:UICollectionView,viewForSupplementaryElementOfKind种类:String,at indexPath:IndexPath)-> UICollectionReusableView { 
  ... 
//创建标头后,更新实例变量
headerView =标头
  ... 
}

4.使用fractionComplete属性设置标题视图的动画 滚动视图的contentOffset (向下/向上)的UIViewPropertyAnimator的设置

 覆盖func scrollViewDidScroll(_ scrollView:UIScrollView){ 
 让contentOffsetY = scrollView.contentOffset.y 
 如果contentOffsetY <0 {//下拉 
  headerView?.animator?.fractionComplete = abs(contentOffsetY)/ 200 
  } else {//拉起 
  headerView?.animator?.fractionComplete = 0.0 //完全可见 
  } 
  } 

那就是所有的人🙂

源代码:

ashislaha / StretchyHeaderAnimation
让我们在“产品详细信息”页面上创建酷炫的动画效果。 当用户向下滚动时,标题将随着… github.com而变大。

即使没有人看,也要做正确的事。 这称为“完整性”。 谢谢。

如果您想查看我的更多作品,请在此处检查:

ashislaha –概述
我是一名软件开发工程师,主要从事iOS开发,机器学习,模式识别,图像… github.com