iOS开发专题

UITableView的几种上拉和下拉效果总结

2017-05-07  本文已影响400人  摸着石头过河_崖边树

前言######

最近在写demo的时候,有用到几种TableView上拉和下拉的效果,就顺便总结了一下,demo是分为几个模块写的,可以独立使用,希望对朋友们有帮助。

代码地址:tableView常用的上拉和下拉效果

代码效果##

demo技术点:下拉放大、下拉回弹、上拉放大、上拉回弹效果、自定义tableView的dataSouce等


效果图.png

功能分析###

一、上拉回弹效果
核心思想:改变最后一个cell的y值和高度
步骤:
1.计算刚好拖到底部时候的offset
刚好拖动到底部的距离 = scrollView.contentSize.height - scrollView.frame.size.height
要是在向上拖动一点点就会导致整个tableView被拖起来,所以

偏移量 offset = scrollView.contentOffset.y -(scrollView.contentSize.height - scrollView.frame.size.height);

2、拿到之前在cellForRowAtIndexPath保存的最后一个cell
这个代码在cellForRowAtIndexPath

//保存最后一个cell和cell的y值   
if(sectionModel.tableViewRowArray.count-1  == indexPath.row)
{
     self.lastCell = scaleCell;
}

3、计算变化的高度

注意: [LZBScaleTableViewCell getScaleTableViewCellHeight]是cell的固定高度
cellFrame.size.height = [LZBScaleTableViewCell getScaleTableViewCellHeight] + offset;

4.最后给cell赋值

cell.coverImageView.bounds = cellFrame;
cell.coverImageView.center = CGPointMake(cellFrame.size.width *0.5, cellFrame.size.height *0.5);

完整的代码demo

- (void)pullUpTranslationScrollView:(UIScrollView *)scrollView
{
  CGFloat offset = scrollView.contentOffset.y -(scrollView.contentSize.height - scrollView.frame.size.height);
 if(offset >0)
 {
  //拿到最后一个cell
   LZBScaleTableViewCell *cell = self.lastCell;
   CGRect cellFrame = cell.frame;
   cellFrame.size.height = [LZBScaleTableViewCell getScaleTableViewCellHeight] + offset;
   cell.coverImageView.bounds = cellFrame;
   cell.coverImageView.center = CGPointMake(cellFrame.size.width *0.5, cellFrame.size.height *0.5);
  }
 }
注意点:改变coverImageView的时候一定不要习惯性的设置 _coverImageView.contentMode = UIViewContentModeScaleAspectFill;
  _coverImageView.clipsToBounds = YES;

二、上拉放大效果
这个效果比较简单,大同小异,直接上代码,也可以参考简书:tableView的上拉放大效果

 - (void)pullUpBottomViewScaleWithScrollView:(UIScrollView *)scrollView
{
CGFloat offset = scrollView.contentOffset.y -(scrollView.contentSize.height - ([UIScreen mainScreen].bounds.size.height -naviView_Height));
if(offset > 0)
{
    //拿到最后一个cell
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.dataSource itemSectionObjectWithIndexPathSection:self.sectionArray.count -1].items.count-1 inSection:self.sectionArray.count -1];
    LZBScaleTableViewCell *cell =[self.tableView cellForRowAtIndexPath:indexPath];
   //计算放大系数
    CGFloat percent =  1 + offset/[LZBScaleTableViewCell getScaleTableViewCellHeight];
    CGRect cellFrame = cell.coverImageView.bounds;
    CGPoint cellCenter = cell.coverImageView.center;
    cellCenter.x = cellCenter.x;
    //改变CenterY
    cellCenter.y = ([LZBScaleTableViewCell getScaleTableViewCellHeight] + offset ) * 0.5;
    //放大宽、高
    cellFrame.size.width = [UIScreen mainScreen].bounds.size.width * percent;
    cellFrame.size.height = [LZBScaleTableViewCell getScaleTableViewCellHeight] * percent;
    cell.coverImageView.center = cellCenter;
    cell.coverImageView.bounds = cellFrame;
 }
}

三、下拉放大
只是计算offset的方式不一样而已,核心思想一致

- (void)pullDownScrollScaleWithScrollView:(UIScrollView *)scrollView
{
  if(scrollView.contentOffset.y < 0)
{
   //获取第一个cell
   LZBScaleTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
   CGFloat cellHeight = [LZBScaleTableViewCell getScaleTableViewCellHeight];
   //获得offset
   CGFloat offset = -scrollView.contentOffset.y;
   CGFloat percent = (offset + cellHeight)/cellHeight;
   //获得cell的尺寸
   CGRect cellFrame = cell.coverImageView.frame;
   CGPoint cellCenter = cell.coverImageView.center;
   cellFrame.size.width = [UIScreen mainScreen].bounds.size.width *percent;
   cellFrame.size.height = cellHeight *percent;
   cellCenter.x = cellCenter.x;
   cellCenter.y = cellHeight * 0.5 + scrollView.contentOffset.y * 0.5;
   cell.coverImageView.center = cellCenter;
   cell.coverImageView.bounds = cellFrame;
  }
}

四、下拉回弹

- (void)pullDownScrollScaleWithScrollView:(UIScrollView *)scrollView
{
  if(scrollView.contentOffset.y < 0)
 {
    //获取第一个cell
    LZBScaleTableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    CGFloat cellHeight = [LZBScaleTableViewCell getScaleTableViewCellHeight];
    //获得offset
    CGFloat offset = -scrollView.contentOffset.y;
    //获得cell的尺寸
    CGRect cellFrame = cell.coverImageView.frame;
    CGPoint cellCenter = cell.coverImageView.center;
    cellFrame.size.width = [UIScreen mainScreen].bounds.size.width;
    cellFrame.size.height = cellHeight + offset;
    cellCenter.x = cellCenter.x;
    cellCenter.y = cellHeight * 0.5 + scrollView.contentOffset.y * 0.5;
    cell.coverImageView.center = cellCenter;
    cell.coverImageView.bounds = cellFrame;
 }
}

demo中还重点写了两种tableView常用的场景,你是否还是只在控制器中写,那么你就out了,你可以期待我下一篇的介绍

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

代码地址:tableView常用的上拉和下拉效果

最后赠言###

如果觉得文章对您有帮助,不要忘记star哦!😝,star 是对程序猿最大的鼓励!

上一篇 下一篇

猜你喜欢

热点阅读