美文网首页iOS DeveloperiOSios开发小技巧
[iOS]实现UITableView头部带有图片并且下拉图片放大

[iOS]实现UITableView头部带有图片并且下拉图片放大

作者: PlutoMa | 来源:发表于2016-01-23 17:50 被阅读14929次

最近感觉UITableview头部带有图片,并且下拉时图片放大这种效果非常炫酷,所以动手实现了一下,效果如下图:

1.gif

实现原理很简单,就是在UITableview上边添加一个图片子视图,在tableview拖动的时候动态的改变图片的frame,就可以实现这个效果。

步骤如下:

1. 布置UITableview

UITableview的设置和正常一样,没有什么需要注意的地方,我这里是直接在storyboard里面拖的,代码如下:

@property (weak, nonatomic) IBOutlet UITableView *tableView;
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell_id"];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 30;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell_id" forIndexPath:indexPath];
    
    cell.textLabel.text = [NSString stringWithFormat:@"%ld--%ld", indexPath.section, indexPath.row];
    
    return cell;
}
2. 布置图片

布置图片的时候,我们首先要通过设置UITableview的内容偏移来为图片视图留出位置,这里我们的图片高度暂定为200。

    self.tableView.contentInset = UIEdgeInsetsMake(kHEIGHT, 0, 0, 0);

接下来就是布置图片,图片要放在内容视图之上,所以图片的纵向位置应该为负。

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, -kHEIGHT, [UIScreen mainScreen].bounds.size.width, kHEIGHT)];
    
    imageView.image = [UIImage imageNamed:@"IMG_0767.JPG"];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.tag = 101;
   
    [self.tableView addSubview:imageView];

需要注意的是,图片的** contentMode 必须设置为 UIViewContentModeScaleAspectFill ** , 这样才能保证图片在放大的过程中高和宽是同时放大的。

3. 拖动事件的处理

我们都知道,UITableview属于可以滑动的控件,所以它的父类是UIScrollView,所以我们就可以在滑动事件中做出一些处理。
在滑动的时候,一旦判定是下拉状态并且是从大于图片高度的地方下拉的,那么我们就要动态的改变图片的纵向位置和图片的高度(由于设置了contentMode,所以宽度自己会变化),最终实现所需要的效果。
代码如下:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint point = scrollView.contentOffset;
    if (point.y < -kHEIGHT) {
        CGRect rect = [self.tableView viewWithTag:101].frame;
        rect.origin.y = point.y;
        rect.size.height = -point.y;
        [self.tableView viewWithTag:101].frame = rect;
    }
}

相关文章

网友评论

  • zuolingfeng:用SDCycleScrollView有抖动,大家有解决方案么?
  • brance:怎么让他滚动到一定位置后固定不可下拉?
  • 正确的道路上用笨方法:楼主 我下拉时候为啥图片木有变大 但是跟着下拉
  • hdeyiji:博主,你好!我如果imageview上面有label和button那些控制怎么处理呀
  • aaa000::+1: very good!
  • 至恒之狐:如果加上MJRefresh下拉的时候会出现一小段的空白,最后消失
  • 橙_知足常乐:为什么我的拉大的时候,只有高改变,宽度不变的呢?
  • 玫瑰花瓣的信笺:我遇到个问题,视图拉伸放大什么的都没问题。但是在拉伸的Image中会有一条分割线。
    比如我起初Image的高度为200,在拉伸的过程中,在头视图底部向上200的位置就会出现一条分割线。
  • 28ede1047e21: _imageView.clipsToBounds = YES;//删除多余图片。(不加这个得话。第一行被遮盖)
    解决你那个问题
  • 没错就是豪哥灬:上滑的时候怎么能做到图片不动啊
  • 闻醉山清风:楼主,滑动的时候cell的第一行被遮盖了
  • ZzzYyyCcc:在图片区域下拉有没有效果?如何实现?
  • 306a480fd470:楼楼 ,我遮挡住了第一行 ,我检查是不是frame的问题 ,但是我找不出frame有什么问题 ,请问是怎么回事呢?
    PlutoMa:@芝欧 试试self.automaticallyAdjustsScrollViewInsets=NO
  • 梁伟杰:当有导航栏的时候,你这个图片就会遮住了第一行的cell的。。。
  • zuolingfeng:赞,看文章实现了图片滑动。
    后面我还加了
    [_tableView setContentOffset:CGPointMake(0, -kHEIGHT) animated:NO];
    _tableView.bouncesZoom = NO;
    不然试图不会从图片处开始显示
    三秒嗨:@zuolingfeng 兄弟很棒 :clap:
  • bb5a02957ae7:kHEIGHT是什么
    280e030cc691:高度,定义的一个宏
    zuolingfeng:@落红sam 应该是图片高度吧 这里好像设置的是200
  • 我叫小小虎:我写出来 当高度为200时 遮挡了indexPath = 0 和 1 两行 ,下拉的时候会出现 ,这是为什么?
    280e030cc691:你的图片有问题,图片的尺寸
    eab1c8cc6b62:@我叫小小虎 亲,你的遮挡问题解决了吗
    PlutoMa:控制器有没有导航栏?
  • 小凡凡520:cell 怎么被遮住了一部分 。。。
    我叫小小虎:@小凡凡520 zhege 这个遮盖的部分解决了吗?
    疗效显著:@PlutoMa indexPath.row = 0 的那一行cell
    PlutoMa:@小凡凡520 哪里?
  • EdenChow:楼主写的太好了
  • 追风筝的荧火虫:写得很详细,太喜欢了

本文标题:[iOS]实现UITableView头部带有图片并且下拉图片放大

本文链接:https://www.haomeiwen.com/subject/xvsrkttx.html